最近 3Dスキャナや生成AI等の手段で 奥行の画像を得る手段が増えてきました
GeometryNodes深度(デプス)画像を元にメッシュを得る方法を少し書き残しておこうかと思います
Blender4.2での内容になります
深度画像の用意
まずはテストのための深度画像を用意する方法を簡単に触れておきます
ビューレイヤプロパティのZのパスをオンにしてレンダリングすることで作成します
深度のデータを浮動小数点で保存するためにOpenEXR形式で保存します
ノード補助のアドオン「Node Wrangler」を利用しているなら
コンポジットのビューアーのノードに
サイドバーに「この画像を保存」(Save This Image)のボタンが追加されていて ビューアーで利用している画像を簡単に保存できます。
ジオメトリノードでの変形
まずは 深度画像でメッシュを歪めてみます
メッシュプリミティブの「グリッド」で作成した平面を歪めています
グリッドは指定した数の格子状のメッシュでUVマップには均等に分割したUV座標が出力されています
画像テクスチャのベクトルに入力することで UV値に対応した深度の値を取得できます
移動させたい方向を表すベクトルと乗算し 位置設定で頂点を移動させています
ベクトルがZ -1としたのは 平行投影した時に下向きに見るのと
Blenderのカメラの初期値が Zのマイナスを向く方向になっているためです
これをカメラからの見た目の座標軸に変換すれば 深度に応じたメッシュにすることができます
カメラ座標への変換
グリッドのプリミティブは初期状態だと原点上のXY平面上に大きさ1の平面を作るので
その位置のベクトルをー1して仮想の平面としたものに深度を掛けると原点を基準とした三角座標に変形できます
これを任意の方向を向いたアクティブカメラの位置や回転の情報に合わせるとこうなります
この時点ではカメラの縦横比や画角は考慮されていませんので
さらに縦横比の補正や 画角の計算を入れるとこうなります
横長画像の場合 比率に合わせて縦を縮める形になり
画角の数値に応じて 縦横を拡縮しています
さらに縦長構図や 画角の指定を焦点距離と角度の切り替えに対応させてグループ化すると こんな感じです
これでは画像の縦横の解像度を手入力していますが
入力>定数の「画像」ノードと 入力>シーンの「画像情報」のノードを使うと自動縦横は取得できるので
画像解像度はノード内部で設定してしまってもいいかもしれないですね
また、EXRの距離のデータそのものでなく PNGのようにグレースケールデータの場合には
画像データを深度としてベクトルと乗算する部分の前に 範囲マッピングで値を置き換え設定できるように設定すると利用できるかと思います
深度としてはデータの諧調が少ないのと
手元のテストでは距離を正規化してカラースペースをノンカラーにしてみたものの少々うまくいかなかったので
参考程度の扱いとさせていただきます
何かの手助けになれば幸いです