執筆バージョン: Unreal Engine 5.0 |
今回は対象に向かって徐々に向きを変えるような処理をいくつか紹介します。
それぞれに、利点と欠点があるため状況に応じて使い分けてください。
RInterp ToとFind Look at Rotation 対象の方向へ徐々に向く
まずは以前ご紹介したRotatorまとめ記事で言うところの補間ノードRInterpToとFindLookAtRotationを使って
対象へ徐々に向きを変える処理を作成します。
この方法では、動く対象を常に追うような回転処理に向いています。
![](https://historia.co.jp/wp/wp-content/uploads/2022/07/01-2-1024x337.png)
FindLookAtRotationに回転させたいアクターの現在位置と対象の位置を入れると、ターゲットの方へ向くRotatorを返してくれます。
このRotatorをRInterpToのTargetに入れて返ってきた値をSetActorRotationに入れると徐々に向きを変える事ができます。
RInterpToのInterpSpeedによりTargetへ向く速さを調整できます。
ただし、このRInterpToによる回転は、必ずしも対象までの最短の軌道を通って向きを変えるものではありません。
以下のようにArrowを回し、そのArrowの回転の軌道を表示してみると
![](https://historia.co.jp/wp/wp-content/uploads/2022/07/02-2-1024x322.png)
![](https://historia.co.jp/wp/wp-content/uploads/2022/07/03-2-300x268.png)
開始時Rotation(X=0,Y=0,Z=0)からTarget(X=0,Y=90,Z=90)までの回転ですが、上のように見た目にはかなり遠回りをしていることがわかります。
これはRotatorの補間が各軸の値ごとに補間しているからでこの時の軌道をログとして出力すると数字的には正しくTargetに向かっていることがわかります。
![](https://historia.co.jp/wp/wp-content/uploads/2022/07/04-2.png)
この方法は対象をざっくりと向くという感じの使い方になると思います。
Ease 向きを変える速度の調整がしやすい回転
この方法はこの向きからこの向きまで向かせたいというように、事前に2つの方向が決まっている時に使います。
向きを変えるスピードの調整にTimeLineを使うことができるのが特徴です。
![](https://historia.co.jp/wp/wp-content/uploads/2022/07/05-2-1024x388.png)
TimeLineの編集方法などは公式ドキュメントが参考になります。また、Easeノードはこちらの記事で紹介しています。
TimeLineに0~1まで増加するカーブを入れEaseのShortestPathにチェックを入れると以下のような軌道になります。
![](https://historia.co.jp/wp/wp-content/uploads/2022/07/06-2-300x274.png)
TimeLineの調整やEaseの調整により向きを変える速度を切り替えるのが容易なので演出的な要素を入れやすいのが特徴です。
また、ShortestPathにチェックを入れるとRInterp Toよりも遠回りが少ない軌道での回転になります。
Rotate Vector Around Axis Quaternionによる回転
EaseでShortestPathにチェックを入れても下の白い軌道のような最短にはなりませんでしたが、この方法を使うと対象まで最短の軌道を通って向きを変えることが出来ます。そのため対象へ向きを変える方法の中では一番きれいに向きを変えることが出来ます。
この方法による実行結果は以下のとおりです。
![](https://historia.co.jp/wp/wp-content/uploads/2022/07/07-2-300x245.png)
Quaternionによる回転はブループリントのRotateVectorAroundAxisで行います。
RInterpToと同じ用に使えるよう以下の関数を作成しました。
![](https://historia.co.jp/wp/wp-content/uploads/2022/07/08-1-1024x531.png)
RotatorをGetRotationXVectorで一度Vectorに変換し、2つのVectorの外積を取ることで垂直なベクトルを取得し、これを任意軸として回転させます。
また、2ベクトルのなす角を内積で求め、なす角を超える角度の回転をクランプしておきます。
これでTargetを超えて回転するのを防ぎます。
通常のRInterpToでは値によってはTargetまで向くことが出来ない場合がありますがそれを防げるのも利点です。
![](https://historia.co.jp/wp/wp-content/uploads/2022/07/Blog_Preview__NetMode__Standalone____64-bit_SM5__2022-12-15_17-57-21_AdobeExpress.gif)
左がRInterpTo 右がQuaternion
左の方はTargetまでたどり着けず途中で止まってしまう。