0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ジオメトリノードで カメラからの深度で押し出ししたメッシュを作成する

Posted at

最近 3Dスキャナや生成AI等の手段で 奥行の画像を得る手段が増えてきました
GeometryNodes深度(デプス)画像を元にメッシュを得る方法を少し書き残しておこうかと思います
Blender4.2での内容になります

深度画像の用意

まずはテストのための深度画像を用意する方法を簡単に触れておきます

ビューレイヤプロパティのZのパスをオンにしてレンダリングすることで作成します

image.png

深度のデータを浮動小数点で保存するためにOpenEXR形式で保存します
ノード補助のアドオン「Node Wrangler」を利用しているなら
コンポジットのビューアーのノードに
サイドバーに「この画像を保存」(Save This Image)のボタンが追加されていて ビューアーで利用している画像を簡単に保存できます。

ジオメトリノードでの変形

まずは 深度画像でメッシュを歪めてみます
メッシュプリミティブの「グリッド」で作成した平面を歪めています

image.png

グリッドは指定した数の格子状のメッシュでUVマップには均等に分割したUV座標が出力されています
画像テクスチャのベクトルに入力することで UV値に対応した深度の値を取得できます
移動させたい方向を表すベクトルと乗算し 位置設定で頂点を移動させています

ベクトルがZ -1としたのは 平行投影した時に下向きに見るのと
Blenderのカメラの初期値が Zのマイナスを向く方向になっているためです

これをカメラからの見た目の座標軸に変換すれば 深度に応じたメッシュにすることができます

カメラ座標への変換

グリッドのプリミティブは初期状態だと原点上のXY平面上に大きさ1の平面を作るので
その位置のベクトルをー1して仮想の平面としたものに深度を掛けると原点を基準とした三角座標に変形できます
image.png
これを任意の方向を向いたアクティブカメラの位置や回転の情報に合わせるとこうなります
image.png
この時点ではカメラの縦横比や画角は考慮されていませんので

さらに縦横比の補正や 画角の計算を入れるとこうなります
image.png
横長画像の場合 比率に合わせて縦を縮める形になり
画角の数値に応じて 縦横を拡縮しています

さらに縦長構図や 画角の指定を焦点距離と角度の切り替えに対応させてグループ化すると こんな感じです
image.png
これでは画像の縦横の解像度を手入力していますが
入力>定数の「画像」ノードと 入力>シーンの「画像情報」のノードを使うと自動縦横は取得できるので
画像解像度はノード内部で設定してしまってもいいかもしれないですね
image.png

また、EXRの距離のデータそのものでなく PNGのようにグレースケールデータの場合には
画像データを深度としてベクトルと乗算する部分の前に 範囲マッピングで値を置き換え設定できるように設定すると利用できるかと思います
image.png
深度としてはデータの諧調が少ないのと
手元のテストでは距離を正規化してカラースペースをノンカラーにしてみたものの少々うまくいかなかったので
参考程度の扱いとさせていただきます

何かの手助けになれば幸いです

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?