UE4
UnrealEngine4

[UE4]マテリアルブループリント内でクォータニオンでオブジェクトを回す

More than 1 year has passed since last update.

マテリアルブループリント(以下 マテリアルBP)内でオブジェクト回転させたい時に便利なノードに
RotateAboutAxisというノードがあります。
回転の中心位置とAxisとAngleを渡せば回転させる事ができる便利なノードなのですが、
使い方についてはヒストリアさんのこちらの記事が大変参考になります。

[UE4] RotateAboutAxisでオブジェクトを回転する
http://historia.co.jp/archives/6261

このノード、x, y, z軸の3軸の回転が組み合わさると少し面倒な事になりました。
まず、2軸以上で回す際には僕はNormalizeを忘れていたので思った様に回せなくて困りましたが、
UE4のAnswerHubの方で教えて頂きました。ありがとうございます!

マテリアルブループリント内で2軸以上での回転の方法
https://answers.unrealengine.com/questions/675115/%E3%83%9E%E3%83%86%E3%83%AA%E3%82%A2%E3%83%AB%E3%83%95%E3%83%AB%E3%83%BC%E3%83%95%E3%83%AA%E3%83%B3%E3%83%88%E5%86%85%E3%81%A62%E8%BB%B8%E4%BB%A5%E4%B8%8A%E3%81%A6%E3%81%AE%E5%9B%9E%E8%BB%A2%E3%81%AE%E6%96%B9%E6%B3%95.html

たとえば、x軸を45度、y軸を105度、z軸を15度の回転をさせたい!となった場合には上記だけでは
なすすべがありません、、

この様な場合、x, y, z軸それぞれのクォータニオンを作って掛け合わせることで最終的なAxisとAngleを求めれば
いいのですが、残念な事にマテリアルBP内にはクォータニオンにまつわるノードは用意されていません。
クォータニオンの計算をBPで全て用意すればいいのですが、面倒なのでカスタムノード内でクォータニオンの計算
をする事で実現する事ができましたので方法を以下にまとめておきます。

マテリアルBP内のノードの繋ぎは以下の様な感じです。

2.PNG

それぞれのカスタムノード内の設定はこんな感じ

[MakeQuaternionByAxisAngle]
AxisとAngleを指定してクォータニオンを生成するカスタムノードです
3.PNG

[MultiplayQuaternions]
2つのクォータニオンを掛け合わせるカスタムノードです。
4.PNG

[GetAxisAndAngleByQuaternion]
クォータニオンからAxisとAngleを取得します。(x,y,zがAxisで, wにAngleを書き込んでます)
4.PNG

注意点としてはRotateAboutAxisのAngleに指定する値はDegreesでもRadiansでもなく、0~1の値です。
90度なら0.25, 180度なら0.5, 360度回したいなら1.0を指定するといった感じで、僕はここで
挙動が読めなくてかなり躓きました、、
あと、PivotPositionで0, 0, 50を指定しているのはUE4のデフォルトのキューブをレベルに配置して
試しているのですが、このキューブのピボット位置がキューブの中心じゃないのと、キューブのサイズが100なので
z座標を半分だけ中心にズラしているという理由です。

こちらが完成動画


[追記 2017/7/29]
法線も回さないとライティングがおかしな事になるという事を忘れてました。
ヒストリアさんの記事を見るにこれでいいのかなと思います。
が、上手くいっているのかどうか複雑なオブジェクトで試してはないのでもしかしたら間違っているかもしれません。その際は上記で述べたヒストリアさんの良記事をご参考ください。

キャプチャ.PNG