Unreal Engine 一つのマテリアルで複数の軸で回転させる
Unreal Engineで一つのマテリアルだけを使い、複数の軸で回転させる方法について書きます。
マテリアルで回転させるには
まず、シンプルにマテリアルで回転させる方法を説明します。マテリアルで回転させるにはUEにはRotate About Axisをいう便利なノードがあります。ノードの出力結果をWorld Positionにつなぐことで頂点の座標を更新でき、オブジェクトを回転させることができます。
Rotate About Axisに接続する項目は上からNormalized Rotation Axisでこちらの項目は回転する軸の向き、次の項目はRotation Angleはどれくらい回転するかという値、次のPivotPointは回転する中心座標、最後のPositionには何を回転させるかを入れます。
下の例は軸の向きはZ軸、つまりワールドの上向きで、回転する大きさにはTimeを接続してるので、時間でどんどん回転し、回転する中心はオブジェクトの中心、回転するのは頂点です。
オブジェクトの回転に対応する
先程の例では法線の更新を行っていなかったので、頂点の位置が回転しても陰影が変わらないというおかしなことになっていました。
実はモデルの形状と陰影には直接的な関係がなく、法線が更新させることでモデルの陰影が変わって見えます。ほとんどのモデリングソフトは法線の更新も自動で行ってくれますがマテリアルで頂点を動かした場合はそうではないので法線も忘れずに修正しておきましょう。法線の修正には、Fix Rotate About Axis Normalsというマテリアルファンクションを使うのが簡単です。
回転する場所を変更するには、PivotPointに加算することで簡単にできます。
ただしこの値はオブジェクトをレベル上で回転させたときに、その向きに応じて変わってほしいです。
そこでTransformノードを使いLocalからWorldに変更します。同様にNormalized Rotation Axisに入力していた上向きという値も、オブジェクトの向きによって相対的に変わってほしいのでTransformノードを接続します。
複数の回転に対応する 1
やっと本題です。
複数の回転に対応する最もイージーな方法は、回転を複数行って合成することです。
ただし、この方法は(場合によってはなんの問題もないですが)RotateAboutAxisを3つも使用し、加えて頂点カラーのマスクの数にも限界があるので、あまり良い方法とは言えません。
複数の回転に対応する 2
もう少しエレガントな方法を考えてみます。
回転した結果を合成するのではなく、回転する位置を頂点カラーをマスクにして合成すれば、回転の計算は一回で済ませることができます。
複数の回転に対応する 3
今回のような円周上に回転の中心が並んでいる場合、回転の中心も回転で求めることができます。
回転の中心のデータを一つ用意すれば、それぞれの回転の中心は「どれくらい最初の回転の中心から回っているか」というデータに閉じ込めることができます。Houdiniで反時計回りに頂点カラーの赤の値を大きくしたデータを用意しました。
回転の中心のオフセット方法ですが、2次元での回転を行えるCustom Rotaterを使用します。画像(UV)の回転で頻繁にお世話になるノードですが、UVもそうであるように2次元ベクトルの回転を行えます。
Custom Rotaterの最初の値はUVsと表記されていますが、ここに接続するのは回転する対象です。今回は「最初の回転の中心」を入力します。
Rotate Centerは文字通り回転の中心で{0,0}を入力します。
Rotation Angleは回転する量です。先程用意した頂点カラーRの値が大きいほど回転してほしいので、VertexColorを接続します。
この方法であれば、回転する対象が増えても負荷は変わらず、使用する頂点カラーはRだけなので他の値は別の用途にも使用できます。