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

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

レベルに配置したオブジェクトに対して、ランタイム中毎フレームY軸を自動回転させる処理をした際にY=90度になるとそれ以上の回転をせずその場で停止するようです。

停止している間、対象オブジェクトのプロパティをみるとXとZに値が高速で入っているような挙動が見られました。

この問題はレベルに配置したオブジェクトだけでなく、ControlRigのビューポートでY軸を自動回転させた場合にも発生しました。

<br/>

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

レベルに配置したオブジェクトに対して、ビューポートでY軸のギズモを直接つかんだままY=90未満、以上を反復するような値をとるとXとZの値が360を超えて増えていくようです。

ビューポートでの見た目上の角度は、実際に操作している挙動と相違ありません。

この問題はControlRigのビューポートでコントロールに対して同様の操作した場合には発生しませんでした。

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

> ◆問題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などで実行するといった対応が考えられます。

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

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

ご確認、ご回答ありがとうございました。

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

ご説明いただきありがとうございました。

FRotatorを挟むことで起きる問題とのことなのでFQuatで完結する処理を行おうと思います。

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

レベルエディタの仕様なのですね。

承知いたしました。

ご対応ありがとうございました。

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

さっそくのご確認ありがとうございます。

前回の回答で申し添え忘れたのですが、FQuatで完結させるように処理を制作するほか、 X = 0°, Y = +1°, Z = 0° のデルタ回転を表す FRotator を作成して、Combine RotatorでアクタのRotatorと合成する(そのあと Set Actor Rotation でセットする)アプローチも今回の「問題1」のシナリオでは機能します。ブループリントではFQuatは必ずしも扱いやすいデータ型ではないため、AddActorWorldRotationなどの計算を内部に任せるやり方が採用できず、回転値を取り出して扱う必要がある場面などでお試しいただければと思います。

それでは本件は回答済みとしてCloseさせていただきます。

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