Face weighted vertex normals(FWN)とは?

Tips,Tutorial

ことの発端はたまたまJunior Artistが制作したモデルをscriptの実験用に開いたら
「なんかデータがおかしくない?」データを調べるとFace weighted vertex normals【Face weighted normals】(FWN)やTexelなどに不備があり
制作した方や他のJunior Artistに確認するとFWNのことをそもそも知らないということがあったためツイッターでつぶやいたという感じでした

どちらかというとCharacter出身だったためあまりこういうことをしないのかなーと思いつつ、なんとなくつぶやいたツイートがかなりのRTといいねをされてしまい少し戸惑いつつもせっかくなので記事にしたいなということで書くことにしました
ちなみにこの技術は少し癖のある技術の為、使用しているゲームエンジンや目指すべきクオリティによってはあまり有効でない場合もあります
私が関わってきたプロジェクトでは使用するとプロジェクトもあれば使ってはいけないプロジェクトもありました、使用する際はエンジニアと相談しつつ進めることをお勧めします
特に自社エンジンなどを利用している場合は根深い問題になる可能性も否定できません

Face weighted vertex normals【Face weighted normals】(FWN)とは
Meshのシェーディングを改善する手法のことで
ベベルを追加したりVertexのNormalを変更することによって、斜面のシェーディングがブレンドされ
斜面のNormalがなめらかになります
(ただし、ほとんどの場合は問題ないのですがピクセルシェーダーの複雑さによって、非常に長くて細い三角形がたくさん存在しているメッシュの場合レンダリングパフォーマンスが大幅に低下する可能性もあったりするため、使用用途を考える必要があったりすることもあります)
前置きはこの辺で実際にどうやってつけていくかを解説したいと思います


シェーディングエラーの問題に関して参考例を作成しました
Aは既定のVertex Normalsと、シェーディングエラーと呼ばれる厄介な黒い領域が表示されてしまうモデル
BはAの問題を修正した、Vertex Normalsを持つ、同一モデルです
それぞれの断面図は次の参考例のようなものになります


通常のVertex NormalsではAのようになめらかなシェーディングを実現するために行われるVertexのNormalの補間によって
実際の面方向と違いわずかに平面が湾曲しているように見えてしまいます
この問題を解決するために斜めのエッジ面のVertex Normalsを共有する平面と同じポリゴンNormalにVertex Normalsを調整させる必要があります
これを行うことによって全体のなめらかなシェーディングを維持しつつ
ベベル面はVertex Normalsが(Vertex Normalsの補間により)なめらかに湾曲して見え、平らな面は平らなままVertex Normalsの補間が行われるため平らに見えることになります

これを実際のポリゴンで行ってみます

修正したいMeshを選択し
Display/Polygons/Vertex NormalsでVertex Normalを表示させます

次に設定したいFaceを選択しFace normalを取得します
Script Editorを起動し以下のコードを実行し、Normalの値を取得します

import maya.cmds as cmds
objects = cmds.ls(sl=True)[0]
cmds.polySetToFaceNormal(setUserNormal=True)
cmpToVtf = cmds.polyListComponentConversion(objects, fromFace=True, toVertexFace=True)
normal = cmds.polyNormalPerVertex(cmpToVtf[0], q=True, xyz=True)[0:3]
print normal

[0.0, 1.0, 0.0]という値が取得できました
それぞれ[x, y, z]に対する値になっています
この値をMesh Display/Set Vertex Normal Optionsに値を入力し
Faceに接するVertexに対してSet Normalを実行します

これを残りのFaceに対して行うことでFWNの設定ができます

通常はこういうめんどくさいことは手でちまちま行うことはせず
Scriptで自動化させるのですが公開できるScriptがないので制作した際は公開しようと思います

そんなこんなで以上がFWNの設定方法でした詳しい話などはTwitterとかで質問していただければわかる範囲でお答えしたいと思います