目次
コリジョンモデリング用のシェーダについて
背景3Dデザイナーは、カスタムコリジョンメッシュを形状が複雑なアセット用にMayaでモデリングすることがよくあります。これは、プレイヤーのインタラクションやAIのナビゲーションにとって必要不可欠な仕事です。
さらに、各ゲームに合わせた必要な設定として「歩行可能なフロアの角度」があります。例)UE5の場合、デフォルトの「歩行可能なフロアの角度」は約45度です。もし、キャラクターが設定角度よりも高い角度でサーフェスを移動しようとすると、キャラクターは傾斜を登ることが出来ません。
つまり、コリジョンメッシュを制作する時に歩行可能なフロアの角度を考慮する必要があるということになります。
この記事では、設定角度に合わせた歩行可能なポリゴンを緑に、歩行不可能なポリゴンを赤で表示するMayaのシェーダの制作方法を紹介しようと思います。このシェーダを利用すると、コリジョンメッシュのモデリングが正確に、かつ簡単になります。
シェーダの制作方法
まず、ウィンドウ > 設定/プリファレンス > プラグインマネージャ(Window > Settings/Preferences > Plug-in Manager)からshaderFXPlugin.mllをロードされているかどうか確認しましょう。(図1)
図1
次は、ハイパーシェードを開いてCreate(作成)リストの中でShaderfx Shaderを選択し(図2の1)、新たなマテリアルを作成します(図2の2)。マテリアル名を入力したら(図2の3)、Open ShaderFXボタン(図2の4)を押し、ShaderFXエディタを開きます。
図2
これからシェーダーを組み立てていくのですが、その前にノードの配置方法についてご説明します。Node Browserの検索ウィンドウ(図3の1)で必要なノードの名前を入力、グラフエディタにドラックアンドドロップし(図3の2)、TraditionalGameSurfaceShaderのインプットに繋ぎシェーダーを組み立てます。(図3の3)
必要なノードがNode Browserのリストで見つからない際は、Settings > Toggle Advanced Modeをオンにしてください。
図3
ステップ1:歩行可能なフロアの角度のコサインの計算
① 歩行可能なフロアの角度を入力するフィールドを制作します。
まず、Float(図4の1)ノードを制作します。そのノードを選択して、アトリビュート エディタ(Attribute Editor)(図4の2)で下記の設定をします。
- Nameフィールドで好きな名前を入力します。今回は「Angle」で行きましょう。
- 必要があれば、Noteフィールドで説明を入力します。
- Valueフィールドでデフォルトの度数を入力します。今回は、UE5のデフォルトの45度にしましょう。
- Expose As Material Inputのチェックボックスを必ずオンにし、マテリアルのUIで歩行可能なフロアの角度を入力するフィールドをエクスポーズします。
② 度数を度からラジアンに変換するために、Radians(図4の3)ノードを制作します。
③ 歩行可能なフロアの角度のコサインを計算するために、Cos(図4の4)ノードを制作します。
上記のノードを図4のように繋ぎます。
図4
ステップ2:コリジョンの表面に対する正規化された垂直なベクトルの計算
下記、図5のようにグラフを作ると、コリジョンの表面に対する正規化された垂直なベクトルを計算することが出来ます。
図5
ステップ3:上記のベクトルとY軸のなす角のコサインの計算
① 縦軸のベクトルを制作します。
まず、Float3(図6の1)ノードを制作します。そのノードを選択して、アトリビュート エディタ(Attribute Editor)(図6の2)で下記の設定をします。
- NameフィールドでUpVectorを入力します。
- X Value = 0、Y Value = 1、Z Value = 0にします。
② Dot Product(6)ノードを制作し、インプットとして上に向いている正規化されたベクトルとコリジョンの表面に対する正規化された垂直なベクトルを設定します。
図6
Dot Product(ドット積)の式(図7)は下記になりますが、
図7
インプットとされたベクトルは、両方とも正規化されたベクトル(長さがイコール1のベクトル)となるため、この場合のドット積は、インプットされたベクトルのなす角のコサインとイコールになります。
ステップ4:ステップ1とステップ3で計算したコサインを比べることによってマテリアルのベースカラーの設定
① ステップ1とステップ3で計算したコサインを比べます。
まず、Comparison(図8の1)ノードを制作して、ノードの設定を下記にします。
- インプットAとしてステップ1で計算されたコサインを繋ぎます。
- インプットBとしてステップ3で計算されたコサインを繋ぎます。
- アトリビュート エディタ(Attribute Editor)でOperatorの種類をドロップダウンリストから「<」を選びます。(図8の2)
② Colorノードを制作して、ノードの色を赤に設定します。(図8の3)
③ Colorノードを制作して、ノードの色を緑に設定します。(図8の4)
④ Linear Interpolate Mixノードを制作して、ノードの設定を下記にします。(図8の5)
- 赤色のノードを1番目のValueのインプットに繋ぎます。
- 緑色のノードを2番目のValueのインプットに繋ぎます。
- Comparisonノードの結果をMixインプットに繋ぎます。
- Linear Interpolate MixのResultをTraditionalGameSurfaceShaderノードのDiffuse Colorのインプットと繋ぎます。
そうすると、歩行可能なフロアの角度のコサインは、コリジョンの表面に対する垂直なベクトルとY軸のなす角のコサインより低い際、ポリゴンのベースカラーは緑になり、違う場合はポリゴンのベースカラーは赤になります。
図8
ここでシェーダの制作を完了しても構いませんが、マテリアルを半透明に設定したい方は、 次のステップに進んでください。
ステップ5:半透明のパラメータの制作
半透明のパラメータを制作するために、Floatノードを制作します。(図9の1)
ノードの設定を下記にします。(図9の2)
アウトプットをTraditionalGameSurfaceShaderノードのOpacityのインプットと繋ぎます。
NameフィールドでOpacityを入力します。
Valueフィールドでデフォルトの値を入力します。今回は、0.8にしましょう。
Expose As Material Inputのチェックボックスを必ずオンにし、マテリアルのUIで半透明のパラメータをエクスポーズします。
図9
そうすると、Opacityを0~1の間の好きな値に設定した場合、ビジュアルメッシュをコリジョンメッシュに通じて見ることが出来るようになり、コリジョンをモデリングするのが楽になります。
結果
マテリアルの設定は下記になります。(図10)
図10
先ほど制作したマテリアルを適用すると、どちらのポリゴンが歩行可能なポリゴンになるのか、コリジョンメッシュをモデリングしながら、下記のように簡単に確認することが出来ます。(図11)
図11