BLOGブログ

2017.03.07UE4UE/ Material

[UE4] RotateAboutAxisでオブジェクトを回転する

こんにちは!テクニカルアーティストの黒澤です。
今回はRotateAboutAxisでオブジェクトを回転する方法について書きます。

UnrealEngine4にはRotateAboutAxisというオブジェクトを回転させる便利なノードがあります。さっそく使って見ましょう!

  • NormalizedRotationAxisには回転する軸をいれます。
    RGBがXYZにあたりますので変数化して調整できるようにしました。
  • RotationAngleには回転させたい角度をいれます。
    時間とともに回転させたいのでTimeに変数をMultiplyして調整できるようにしました。
  • PivotPointには回転の中心をいれます。
    オブジェクトのピボットポイントを使いました。
  • Positionにはオブジェクトの位置をいれます。
    通常はWorldPositionを入れます。

パラメータを接続したノードをWorldPositionOffsetにつなぎます。

グレーマンに使用してみましょう。


予想通り回転しました。

しかし陰影がどこか変です。
実はRotateAboutAxisで回転した場合、法線の再計算は行わないので陰影は元のメッシュに焼き付いたようにみえてしまうのです。

そこで法線にも処理を加えてRotateAboutAxisで回転した結果を法線に加えてみます。
基本的にはRotateAboutAxisと同じ処理ですが、PositionにはVertexNormalWSを使用します。
RotateAboutAxisは出力する値は元の座標からの差分なので、絶対座標ではありません。そこで元のNormal(VertexNormalWS)を加算して現在の法線を求めます。その値をNormalizeし、さらにWorldSpaceからTangentSpaceに変換することで、回転した結果に合わせた法線を作りました。
こちらの値をNormalに接続します。

マネキンはレイヤードマテリアルを多用しているので少しわかりにくいですが、通常はNormalMapと合成してNormalに接続します。


正しい結果になりました。

ブログをまとめている際に気がついたのですが、じつはFixRotateAboutAxisNormalsというマテリアルファンクションがありました…
ファンクションの中身を見てみましたが、処理は全く同じですね。特に問題がなければこちらを使うのがいいでしょう。
レイヤードマテリアルを使用していないケースで、FixRotateAboutAxisNormalsを使用した場合は以下のようになります。

ーーー おまけ ーーー

> 猫ドリル <

ちなみに弊社で開発中のAirToneでは音楽に合わせて様々なものを動かしています。

今回紹介したRotateAboutAxisも使用しているので、ぜひ注目してみてください!