PhotoCatch 再び
前書いた時、ベースカラー以外のテクスチャが出てこないのはソフトの味付けのせいとか書いたけど、あれ間違いでした。PreviewやRawだと出てこないけど、Full画質だとデフォルト設定でラフネスとアンビエントオクリュージョンが出てきました。
で、このソフト、動画からもフォトグラメトリを行なってくれます。動画から自動で等間隔でフレームを抜き出して、それをもとに立体生成してくれる機能を持っている。
撮影の負担を場合によっては大幅に軽減してくれる可能性があるわけですが、それは出来上がってくるものの品質にどれだけ影響があるかなぁと思ってみて撮り比べてみました。
こちら、同じものをターゲットに立体化してみたもので、左側がiPhoneで写真を67枚撮って出力したもの、右側が1m46sの動画を撮影して出力されたmovファイルから作ったもの。動画の方は4Kで撮影しています。PhotoCatchの設定でその動画から20フレームごとに静止画を切り出し素材としたものとなります。59.94fpsの動画ですから300枚強の素材から作成されたもの、ということになるはずです。
見ての通り、動画の方が連続した絵を素材とできていることから広い範囲が取得されていますが、目標は真ん中の埴輪なので、それはあまり重要じゃありません。
それじゃディティールはというと、これは静止画から生成したほうが明らかにいい結果を得ています。これは撮影時にディティールの欲しいところにカメラを寄せて撮影したという事情も大きいでしょうし、だから動画で撮るときもそれを意識すれば(つまり全体を抑えた絵だけでなくディティールが欲しいところに寄った素材を撮れれば)同じ結果を得ることができた可能性があります。今回については撮影時のその意識の差がこのクオリティの差につながったといったところでしょうか。ただ、動画はフレーム単位で見たとき、静止画として撮影されたものより多くの場合画質は期待できないですから、そこで差が生じる可能性は大きそうですか。
ただし、上図を見ると手と胴体がくっつく部分で写真の方にデータが取り切れていないところがあるのが見てとれます。この辺は限りなく連続したデータになりやすい動画の方が有利と言えますか。
それにしてもこれだけ手軽に埴輪モデルを得ることができると言うのは恐ろしい時代になったものです。ツルツルテカテカしたものの形状取得は苦手なので被写体は相当限られると思いますが。ツルツルテカテカ系にはまだまだ専門家のノウハウと高価なツールの使用が必要なのではないかと思われます。
余談ながら、検証に使った被写体の埴輪は芝山町立芝山古墳・はにわ博物館の入り口に飾られているものです。なかなかにバラエティ豊かな埴輪が展示されていて人によっては興味深いんじゃないかなって思います。
Ojbect Captureを利用したフォトグラメトリができるアプリ
PhotoCatchってツールで、Montereyが動くMacでのフォトグラメトリが実現するようです。Montereyで用意されたObject Capture APIを利用しているようで。
(iOSアプリの方で素材を撮れば深度情報を付与した状態で処理されるようですけど、モデル生成処理はクラウド上で行われるということもあり、その処理は有償になっているようです($0.99だから、ゴミモデルが出来上がってくるのでなければ、十分コストパフォーマンスは良いと言えましょうが)。)
ともあれ、Mac版をダウンロードして利用してみましょう。
自転車のサドルに乗っけて、こちらの靴をぐるぐると撮影すること85枚。それらをこのアプリに食わせてみます。
シンプルなUIっすね。書き出しフォーマットはusdz、obj、daeとなる模様。Model Qualityはデフォルトでは一番低い解像度になっているようです。とりあえずPreviewのクオリティで実行してみますと、Mac内部で処理が実行されていきます。なを、eGPUを繋いでいても内部GPUでの処理が始まってしまう模様。(まあこれに気づいて「外部GPUを優先」のオブションをオンにするために一回アプリを強制終了さたあと、マシンを再起動せずに処理を再実行しているので、うまくeGPU優先になってない可能性はあるけど…)
このエントリを書いているのはMac mini 2018上なのだけど、せっかくなので裏でM1 MacBook Airでも動かしてみました。そちらはクオリティをRawにして走らせます。プログレスバーがあっという間にMac mini側を追い抜いていったけど、処理後半でMac miniの方も遅れを取り戻しているし、これぐらいのモデルなら実用的な処理速度なのではないかと推察いたします。
処理が終わるとこんな感じで結果が画面に表示されました。とりあえず下の方に明らかにいらんものがくっついているので、それをCropしてから書き出してみました。usdzでSaveします。
残念ながらusdzはBlenderではそのままでは読めないので、拡張子をzipに変更して伸長します。出来上がるフォルダの中にexport.usdcファイルが入っているので、それをBlender 3.1 beta版でインポートしてみました。(なを、後述するようにテクスチャ素材が要素に分離されて出てくるわけではないので、DCCツールに読み込ませるのなら素直にobjやdaeにしとくのが吉でしょう。)
左がPreviewのクオリティ、右がRawです。Rawが35万ポリゴン、Previewが2万3千ポリゴンでした。出力されてくるテクスチャはPreviewが1K、Rawが8Kでした。焼き付けられたテクスチャしか出てこないので、他のソフトに持ち込んで綺麗にレンダリングしようって用途にはちょっと問題が起こる可能性はありますか。Object CaptureのAPI的にはColor, Normal, AOの各マップを出力するようですが、この辺は各アプリケーションの味付けってことですね。
ということでOSのAPIを利用してこのクオリティということで、今後の進化に期待したいです。鏡面やガラスをうまくキャプチャできる未来は来るのかどうなのか…
アトリビュートの入力
何か数値データがあって、それをもとに何か作れないかなって思った時、Geometry Nodesに外部から値を渡す方法は何かあるのか?って考えます。その一つの方法に頂点に値を持たせておいてそれをGeometry Nodesで利用するってことがあるらしい。
日本の新型コロナの感染者数のグラフを作ろうって時、例えばNHKのサイト(新型コロナウイルス データで見る感染状況一覧[nhk.or.jp])でデータを配布しているのだけど、そこから落とせる「国内の感染者数」のcsvファイルから毎日の感染者数を得ることができます。で、これを書いている日は最初の感染者が記された日から702日目までのデータが入っているから、横方向に702個の頂点のあるグリッドを用意します。下図の文字は701×1が正解。
で、このグリッドの頂点にカスタムのアトリビュートを設定し、各頂点に感染者数の数字を持たせました。(参考ってかコピペ:Custom vertex attributes/data - Coding / Python Support [Blender Artists Community])
import bpy me = bpy.context.object.data layer = me.vertex_layers_int.new(name="layer_int") src = "1,0,0,0,(省略するけど702日分の数字をカンマ区切りで書いてある)" infectionNumbers = src.split(",") for i in range( len(infectionNumbers) ): layer.data[i].value = int( infectionNumbers[i] )
結果、このグリッドにはカスタムアトリビュート layer_int が作成されます。
あとはこのグリッドにGeometry Nodesを設定し、以下のようなツリーを構築。Object Inputでそのカスタムアトリビュートを読み込んでやるだけです。

この結果、以下のようなグラフを得られました。
ただ、これは不完全で、本当ならポイントの発生源をポリゴンの中心からにしてあげるといいのだろうし(どうやるんだろう?)、頂点から生やすこの方法でやるなら、必要のないポイントは削除してやる必要がありますね。もっと言えばスクリプトを走らせるのなら必要ポイントだけのオブジェクトを作ればいいのかもしれない。だからこの方法そのままじゃ実用性は薄いけど、一つ勉強したということで今日は満足しておくこととします。
Align Euler to Vectorノード
Geometry Nodesのノードの中でAlign Euler to Vectorノードってのがあって、インスタンスを発生させたときに、その方向を任意の向きに設定したい時によく使うようです。
ベタだけど、上図のように左側の形状を球の表面に這わせたい時、下図のように例えば設定するのでしょう。
三重にAlign Euler to Vectorを掛けてます。このうちインスタンスを球に沿わせた上で下向きに回転させているのが左の二つで、最初にNormal方向に向けて球に沿わせ、球に沿った状態を維持するためにZ軸中心で回転させてY軸を(0,0,1)方向に向けてます。三つ目はインスタンスの根元を中心にちょっとだけ持ち上げるように回転させるためのものです。
二つ目(と三つ目)をオフにすると、それはNormal方向のみに回転させるということですが、下図のようにうまく上下方向には向きません。ということでもう一方向指定するために二つ目を設定するという理屈のようです。
Tesselate texture planeをインストールする
<追記>入れ方はBlender 3.4環境で改めてこちらに書きました。</追記>
個人的な用件としては、アルファチャンネル付きの画像を平面に貼り付けた時、透明部分になっているポリゴンは出来るだけ削除しておきたい(このような板を複数重ねた時、カメラから見た時の重なりの枚数を最小限にしたい)ってことがありました。
手動でちまちまメッシュ分割していってもいいのですが、それを一発でできるAddonがあるなら使わない理由は無いだろうというわけでして。
とはいえ開発中のものなのか、入れ方にはちょっとクセがありまして、opencv-pythonとtriangleという各モジュールを自分で入れないとダメでした。(このAddon(zipファイル)を普通にInstallしたら自動で入れてくれるらしいのだけど、うまくいかない人は手動で入れないとということでした。) )
とはいえ、普通にターミナルから pip install opencv-pythonとか実行してもOS標準の領域に入っちゃって、Blenderが使用するところには入らないため、そのメモです。
まずはpipを入れます。入っているなら必要ないです。入っていたら、Blender.appの中の Contents/Resources/2.92/python/bin の中に pipやpip3といったファイルが存在しているはずです。入っていないならインストール。python3.7mのある階層(Contents/Resources/2.92/python/bin)で
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
これで get-pip.pyがpython3.7mと同じ場所に入るので、そこで
./python3.7m get-pip.py
を実行します。これでpipが入るので、
./pip3 install opencv-python ./pip3 install triangle
を実行ですね。
以上でTesselate texture planeが使えるようになりました。なを、これは2.92に入れたのですが、それは上記GitHubページに"Not compatible with 2.93 and upper version yet due to python modules compatibility (max 2.92)"って書いてあったため仕方ないのでございます。
知らなかった…(階層まとめて表示のオンオフ)
いや、まじ知らんかった。不便だなって思っていたのですけどね。
親のオンオフで子供までオンオフする方法。アウトライナー上でのオンオフはShiftキーを押すだけだった。
もっとも、これをショートカットでやろうとするとどうやるか知らんのだけど。っていうかビューポートで階層選択する方法を知らない…
AppleがBlenderのパトロンに
Apple joins Blender Development Fund[blender.org]
ということで、Appleがパトロンになったそうです。Blenderの開発をサポートする企業として大口のところにけっこうそうそうたる名前が並んでいたりします。Development Fund [blender.org] ←ここにAppleのロゴも並ぶようになるのでしょうか。
その上で、開発のサポートも行い、取り急ぎMetalでのCyclesの実装に動いているそうです。⚓ T92212 Cycles Metal device[developer.blender.org]
macOSでBlenderを使っている人が何に一番困っているかというと、標準レンダラーであるCyclesのGPU利用がCUDAもOpenCLもサポートしないMacでは不可能な状況に、だと思います。特にBlender 3.0になるとWindowsではCyclesXによりCUDA上で爆速になるというのに、CPU演算しかできないmacOSは、ますます取り残される事になるわけでね。
また、リアルタイムに画面を描画する方向でもOpenGL前提であるBlenderですから(将来はValcan?)、OpenGLを廃止する方向に進んでいるmacOSでは将来Blenderが動かなくなるんじゃないかという不安もあるわけで、そっちにもAppleの手が入っていくといいなと思うわけです。
ちなみにMetal対応という方向で圧倒的にmacOSに寄り添ってくれている3DCGアプリはCinema4DでMetalのサポートを積極的に進めてくれてます。ありがたいことです。
GeometryNodesを適用したらUVが消える
Blender 2.93.5でオブジェクトをちゃっちゃとばら撒きたかったので、GeometryNodesを利用したのはいいのですが、それを書き出すためにApplyしたらUVが消えました。
上図右側のをApplyしたのが左側。Applyした瞬間、テクスチャが外れます。これはUVが存在しなくなることが原因です。ちなみに、この時のGeometryNodesは以下のようなシンプルなものです。
どうやら、これはもうどうしようもないようで、回避策は Object→Apply→Make Instances Real コマンドを実行し、インスタンスを個々にオブジェクト化することだそうです。この程度の数ならいいけど、パーティクルを使ってばら撒く時、数千、数万、数百万とかばら撒く可能性があるわけで、そんな数でこの方法は非実用的です。
このどうしようもない状況は、どうやら3.0で解消されそうなのを確認できました。3.0.0 (3.0.0 2021-10-13) で試した結果が以下です。
左側がApplyした状態ですがテクスチャが残っています。ただし、これはUV Mapsに頂点情報が格納されたわけではなく、AttributesってところにUVMapっていう値が登録された状態のようで、FBXに書き出して読み込むと消えてしまうような値でした。これを普通のUV Mapとして使用するためにはどうすればいいのか…
ちなみに、これを作ったGeometryNodesは以下のようなものです。
個人的にはすごくわかりやすくなったように感じるとともに、2.93とかなり変わってて戸惑うように思います。アルファ版ということで大きく手が入っている途中の状態ということでしょう。ですから上記UVマップのこともまた変わっていくのではないかと思われるので、しばらく静観ですな。
Bake Wranglerでのベイク処理
買っちゃいましたよ、Bake Wrangler。ノード繋いでベイク処理の設定を行うことができるってツール。
で、早速試すわけですが、とりあえずレンダリング結果を(ある程度)再現するCombinedパスで計算してみようと、以下のツリーの状態で回してみたらですね、出力されてきた画像は真っ黒でした。
これはMac上ではうまく動かない、たまにある症状かって思ったりしたのだけどWindows上でやっても同様。NormalやAOといった要素のベイクは問題なくできているのだけど、CombinedやDiffuseが真っ黒になる。
セッティング方法を間違えていたのが原因でした。Diffuse要素でちゃんと色付きで取得するためには光で照らされる必要があり、光で照らすためにはライトが入ったコレクションを指定する必要がある模様。コレクションにはワールドのマテリアルは含まれないから、それも別途指定してしてあげなければならない。結果、最低限のツリーは下のような感じになるようです。
上のツリーは、下のようなシーンに対して設定したものです。
ライトが入ったコレクションと、Worldマテリアルを指定している。
結果、
こんなオブジェクトは、下のような感じでベイク処理されてきました。
ほっと一息です。
見ての通りこのCubeには3つのマテリアルが設定されており、Blender標準のベイク処理を行おうとするとそれぞれのマテリアルにベイク先のテクスチャの設定をせねばならず面倒です。また、そのベイク先テクスチャの解像度を変えたいと思ったら新たにテクスチャを設定せねばならないし、それで出力された結果はとりあえずはBlender内部に保持されるので、それをファイルとして保存してあげないといけないという何重苦だよってのが、Bake Wranglerを使うことでそうとうに楽になるはずです。まして、一つのオブジェクトから複数のパスのベイク処理を行いとき(PBRマテリアル用の素材を取り出す時とか)、Blender標準機能の内容でやろうとするとげんなりするのが、例えば下図のように組めば、3つのパスを別名のテクスチャとして一回「Bake All」ボタンを押せば一気に回ってくれるようになります。
それぞれの出力テクスチャの解像度を変えたければ、Bake Passノードに独自にPass Settingノードを繋いでやれば良い。
これはだいぶ楽になるというものでしょう。買って損はなかったって思っております。
Blenderのベイク、使いにくくね?
Blenderでテクスチャベイクする方法として、シェーダエディタの中にどこにも接続されていないImage Textureノードを置いて、それを選択してBakeボタンを押すわけだけど、複数マテリアルで構成されたオブジェクトについては、そのマテリアル全てに同じベイク先のImageを見るImage Textureを置いてやらなければならない、らしい。
えらく、面倒くさくないかって思うわけです。オブジェクトの属性としてベイクの為のパラメータを持たせるSoftimageの作法が懐かしい…
Bake Wrangler [Blender Market]ってアドオンが良さげらしい、$25。
BakeTool [Blender Market] ってのはどうだろう。$14.95。
HDDケース死んで新しいのを買ったせいで旧に貧乏な気分になっているので迷ってる…