Maya と Tangent, Binormal

Tangent は、三角形の頂点座標、法線、UV の値を元に計算される。(Binormal は求めた Tangent と Normal の外積で算出するため、Tangent だけ考えれば良い)

UV 展開をした時、そのポリゴンは UV 座標上で △ ▷ ▽ ◁ など、どのような方向にでも向くことが出来るため、法線マップなどの接空間テクスチャに書かれたベクトルを三角形の表面に貼るには、三角形が法線 z 以外にも、x と y 方向のどちらを向いているかの情報を元にして変換する必要がある。(軸の向きを揃える必要がある)

Albedo の値などは、単に UV から拾ってきた値がそのままピクセルの値になるが、法線マップは接空間上にあり、手前が z、横方向(u) と縦方向(v) という軸で作られている。Albedo と違い法線マップは向きが重要であり、そのままテクセルとして拾った値をポリゴン表面で使おうとすると、ポリゴンの軸の向きが異なっているため、法線ベクトルも意図した向きになってくれない。そのため取得した法線の値とポリゴンの向きを揃えるために、float3x3(Tangent, Binormal, Normal) の値を使って変換をかける必要がある。

当然、UV の値 (三角形の向き) が異なれば、x 軸、y 軸の値も異なる。別々の UV で法線マップを2枚ブレンドしたい場合などは、Tangent も2つ頂点の値として書き出す必要がある。

Tangent と Binormal の表示

Maya でメッシュの Tangent と Binormal を表示するには、mesh ノードの亜トリビュートで、Mesh Component Display -> Display Tangent を選択。

標準で赤が Tangent。青が Binormal。

参考

付録 A: 接線および従法線ベクトル
https://knowledge.autodesk.com/ja/support/maya/learn-explore/caas/CloudHelp/cloudhelp/2018/JPN/Maya-Modeling/files/GUID-169FEA8E-0289-4B12-A181-D7C79FC98BC2-htm.html

あれこれ計算してフリップしたUVを見つける!!
https://kiwamiden.com/find-the-flipped-uv-by-calculating-part1
https://kiwamiden.com/find-the-flipped-uv-by-calculating-part2
Python を使って Tangent, Binormal の取得。そこから法線方向の取得など非常に参考になります。

その12 頂点座標とUV座標から接ベクトルを求めるちょっと眠い話
http://marupeke296.com/DXPS_No12_CalcTangentVectorSpace.html

任意のカラーでハード エッジを表示する
https://knowledge.autodesk.com/ja/support/maya/learn-explore/caas/CloudHelp/cloudhelp/2020/JPN/Maya-Modeling/files/GUID-D23D15E0-8E14-4A4F-892E-2413FA58D85A-htm.html


Maya Plugin と Script の覚書き

AUTODESK MAYA 2017 ヘルプ
http://help.autodesk.com/view/MAYAUL/2017/JPN/

Maya Dependency GraphをPython APIで走査する
https://qiita.com/jimie930/items/da805860173c9bfd30aa

maya plugin の中にある dx11shader.sln を Visual Studio 2015 でビルドした時に、Effects11.lib が存在しないと言われてビルドエラーになりました。

Effects11.lib は自分で用意する必要があるみたいです。

d3dxefffects11.hとEffects11.libがほしい時の対処
http://screenpocket.hateblo.jp/entry/2016/08/14/171109

Windows 10 + Visual Studio 2015 の環境で DirectX SDK の中にある、Effects ソリューションをビルドするとコンパイルエラーになるので困っていた時に上記記事が参考になりました。感謝です。

最新の環境に対応したコードが Github で配布されているのですね。非常に助かりました。
https://github.com/Microsoft/FX11