マテリアルブループリント(以下 マテリアルBP)内でオブジェクト回転させたい時に便利なノードに
RotateAboutAxisというノードがあります。
回転の中心位置とAxisとAngleを渡せば回転させる事ができる便利なノードなのですが、
使い方についてはヒストリアさんのこちらの記事が大変参考になります。
[UE4] RotateAboutAxisでオブジェクトを回転する
http://historia.co.jp/archives/6261
このノード、x, y, z軸の3軸の回転が組み合わさると少し面倒な事になりました。
まず、2軸以上で回す際には僕はNormalizeを忘れていたので思った様に回せなくて困りましたが、
UE4のAnswerHubの方で教えて頂きました。ありがとうございます!
たとえば、x軸を45度、y軸を105度、z軸を15度の回転をさせたい!となった場合には上記だけでは
なすすべがありません、、
この様な場合、x, y, z軸それぞれのクォータニオンを作って掛け合わせることで最終的なAxisとAngleを求めれば
いいのですが、残念な事にマテリアルBP内にはクォータニオンにまつわるノードは用意されていません。
クォータニオンの計算をBPで全て用意すればいいのですが、面倒なのでカスタムノード内でクォータニオンの計算
をする事で実現する事ができましたので方法を以下にまとめておきます。
マテリアルBP内のノードの繋ぎは以下の様な感じです。
それぞれのカスタムノード内の設定はこんな感じ
[MakeQuaternionByAxisAngle]
AxisとAngleを指定してクォータニオンを生成するカスタムノードです
[MultiplayQuaternions]
2つのクォータニオンを掛け合わせるカスタムノードです。
[GetAxisAndAngleByQuaternion]
クォータニオンからAxisとAngleを取得します。(x,y,zがAxisで, wにAngleを書き込んでます)
注意点としてはRotateAboutAxisのAngleに指定する値はDegreesでもRadiansでもなく、0~1の値です。
90度なら0.25, 180度なら0.5, 360度回したいなら1.0を指定するといった感じで、僕はここで
挙動が読めなくてかなり躓きました、、
あと、PivotPositionで0, 0, 50を指定しているのはUE4のデフォルトのキューブをレベルに配置して
試しているのですが、このキューブのピボット位置がキューブの中心じゃないのと、キューブのサイズが100なので
z座標を半分だけ中心にズラしているという理由です。
こちらが完成動画
マテリアルBP内だけで3軸をクォータニオンで計算して回転させるのできた! これで大量のインスタンシングされた各オブジェクトを個別に自由に回転させれるはず #UE4 pic.twitter.com/atM9k7sOy1
— selflash (@selflash) 2017年7月28日
[追記 2017/7/29]
法線も回さないとライティングがおかしな事になるという事を忘れてました。
ヒストリアさんの記事を見るにこれでいいのかなと思います。
が、上手くいっているのかどうか複雑なオブジェクトで試してはないのでもしかしたら間違っているかもしれません。その際は上記で述べたヒストリアさんの良記事をご参考ください。