FRotatorのY軸(Pitch)を回転させた際に複数の問題が起きる。

お世話になっております。

> ◆問題1:Y軸をランタイム中に自動で回転させた場合、90度以上回転しない

UEのオブジェクトの回転は内部的にはクォータニオンで管理されており、GetActorRotation()などを呼び出すたびに、クォータニオンで管理されている回転をオイラー角で再解釈してFRotatorに落とし込むという処理が実行されます。クォータニオン→オイラー角の変換では、「同じ回転状態でも、オイラー角で表現できる値が一意に定まらない」ケースがあるため、Yで制御していたはずの回転が、再解釈時にXとZによる回転によるものだとみなされる場合があります。

たとえば、Y=110°でセットした回転状態は、X=180°、Y=70°、Z=180°と解釈することも可能です。こうしますと、Yを1°加算する行為は、これまでの回転方向とは逆方向にオブジェクトを回転させることになります(XとZの回転によるひねりがはいった場合、Yはマイナスさせないと、人目には同じ方向への回転にならない)。そのため、90°を超えたあたりでY+1回転操作がそれまでとは逆の回転となってオブジェクトを戻し、これによって90°を超えて戻った際に、X/Z回転の解釈が0°に戻ってY+1回転操作が順回転に戻るという具合に、正回転と逆回転を1フレームごとに交互に行う状態に陥り、回転が止まったように見える(実際にはブルブル振動している)といった症状に繋がったものと考えられます。

この問題を回避するため、GetActorRotationで毎回Rotatorを取ってきて計算し、またセットするという手順を踏むのではなく、AddActorWorldRotation や AddActorLocalRotation ノードを用いてデルタ回転値を与えて回転させる実装法をお勧めいたします。この場合、回転計算はすべて内部的にクォータニオンで行われるため、上記のような問題は発生いたしません。

> ◆問題2:Y軸をレベルエディタ上でY=90を反復させるとXとZの値が増え続ける。

こちらは、回転状態のオイラー角への再解釈で生じたXとZへの値の分配が、レベルエディタの仕様上、累積する(レベルエディタでは2周以上の回転を、360以上の値を持つことで表現できるため)ことによる制約と考えられます。もしこの動作が作業上で問題となっているようであれば、多重回転を1回転とみなすような補正処理をEditor Utilityなどで実行するといった対応が考えられます。

以上、よろしくお願いします。