Blender で反射ベクトル・法線を UV 座標に変換する
カテゴリ:blender
反射ベクトルを変換した UV 座標はワールドとは別の IBL を表示したい時に使える。
外部リンク
Diffuse irradiance
リンク先の記事は OpenGL なので Y 軸と Z 軸とを入れ替える必要がある。U の方向も反転しているのでマッピングの X スケールがマイナスになっている。
Matcap の UV を計算する
シェーダーノード
法線ベクトルをカメラ座標に変換したあと、移動・拡縮すると Matcap の UV 座標になる。Matcap 画像は、Blenderのインストールディレクトリ/バージョン/datafiles/studiolights/matcap にある。法線は check_normal+y.exr。法線を表示する場合は、テクスチャの色空間を非カラーデータ(Non-Color)にする。
計算した UV 座標にガンマ(パワー)をかけるとそれらしい法線になる。
コンポジット
コンポジットにはベクトル演算ノードがないので法線(Normal)ノードにカメラのワールド行列をコピーして、法線をカメラ座標へ変換する。手動入力する方法とドライバーを使う方法がある。ドライバーを使う方法はノードを再利用できる。
手動コピー
カメラのワールド行列は matrix_world で取得できる。Python Console で bpy.data.objects[カメラ名].matrix_world と入力する。
カメラのワールド行列
カメラのワールド行列の列2つを法線(Normal)ノードにコピーする。適当なオブジェクトの位置やスケールに行列のデータを手入力して Ctrl + Alt + C でコピー、Ctrl + Alt + V でペーストする。
ドライバーを使う
法線ノードにドライバーを設定するとノードを再利用できる。式はそれぞれ
- bpy.context.scene.camera.matrix_world[0][0]
- bpy.context.scene.camera.matrix_world[1][0]
- bpy.context.scene.camera.matrix_world[2][0]
- bpy.context.scene.camera.matrix_world[0][1]
- bpy.context.scene.camera.matrix_world[1][1]
- bpy.context.scene.camera.matrix_world[2][1]