Unity は localEulerAngle と EulerAngle を使用してオブジェクトの回転を制御します

ここに画像の説明を挿入します

コンセプト説明

オイラー角は、3 次元空間内のオブジェクトの回転を記述するために一般的に使用される方法です。3 つの角度を使用して、オブジェクトの 3 つの座標軸 (通常は X、Y、Z 軸) を中心とした回転をそれぞれ表します。この表現の利点は、直感的で理解しやすいことですが、ユニバーサル ロックの問題など、いくつかの問題もあります。オイラー角に関する重要な概念をいくつか示します。

  1. オイラー角の表現:
    オイラー角は通常、オブジェクトの回転を表すために 3 つの角度、つまり X 軸、Y 軸、Z 軸の周りの回転角度を使用します。これら 3 つの角度は、それぞれヨー (ヨー角)、ピッチ (ピッチ角)、ロール (ロール角) として記録できます。これらの角度を使用して、元の方向に対するオブジェクトの回転を記述することができます。

  2. 回転順序:
    順序が異なると最終的な回転結果に影響を与えるため、オイラー角の回転順序は非常に重要です。たとえば、XYZ シーケンスは、最初に X 軸を中心に回転し、次に Y 軸を中心に、最後に Z 軸を中心に回転することを意味します。一般的な回転シーケンスには、XYZ、XZY、YXZ、YZX、ZXY、ZYX などが含まれます。

  3. ユニバーサル ロック問題:
    オイラー角は、ユニバーサル ロック問題と呼ばれる問題の存在を示します。場合によっては、2 つの回転角度が 90 度に非常に近い場合、一方の回転角度が独立性を失い、オブジェクトの回転を正しく表現できなくなります。これにより、ジンバル ロックと呼ばれる、オブジェクトの回転が異常に見えることがあります。この問題を回避するには、通常、四元数などの他の回転表現方法が使用されます。

  4. 応用分野:
    オイラー角は直感的で人間にとって理解しやすいため、ゲーム開発、コンピューター グラフィックス、航空宇宙などの分野でよく使用されます。しかし、実際のプログラミングでは、特に複雑な回転やアニメーションの計算が含まれる場合には、クォータニオンなどのより安定した回転表現方法がよく使用されます。

つまり、オイラー角は物体の回転を記述する一般的な方法ですが、実際のアプリケーションではその制限と起こり得る問題を考慮する必要があります。回転を操作するときは、オイラー角とその適用範囲、および他の表現を使用する必要がある場合を理解することが重要です。

localEulerAngle と EulerAngle の違い

Unity では、localEulerAnglesと はeulerAnglesどちらもオブジェクトの回転を表すために使用されるプロパティですが、いくつかの違いがあります。

  1. localEulerAngles

    • このプロパティは、親オブジェクトに対するオブジェクトのローカル回転角度 (ローカル座標系での回転角度) を表します。
    • オブジェクトの を変更するとlocalEulerAngles、オブジェクトの回転に影響があり、その回転角度がローカル座標系からグローバル座標系に変換されます。
  2. eulerAngles

    • この属性は、ワールド座標系に対するオブジェクトの回転角度を表します。
    • オブジェクトの を変更するとeulerAngles、グローバル座標系でのオブジェクトの回転角度が直接変更されます。

主な違いは、これら 2 つのプロパティが異なる座標系に基づいていることです。これは通常、ローカル座標系で回転変更を実行する場合に使用されますlocalEulerAnglesグローバル座標系で回転を直接変更したい場合は、それを使用できますeulerAngles

2 つの違いを示す簡単な例を次に示します。

using UnityEngine;

public class RotateObject : MonoBehaviour
{
    
    
    public float rotationSpeed = 60.0f; // 旋转速度

    // Update is called once per frame
    void Update()
    {
    
    
        // 使用 localEulerAngles 进行局部坐标系的旋转
        //获取localEulerAngles
        Vector3 localRotation = transform.localEulerAngles;
        //沿着y 轴旋转
        localRotation.y += rotationSpeed * Time.deltaTime;
        transform.localEulerAngles = localRotation;

        // 使用 eulerAngles 进行全局坐标系的旋转
        //获取eulerAngles
        Vector3 globalRotation = transform.eulerAngles;
        globalRotation.y += rotationSpeed * Time.deltaTime;
        transform.eulerAngles = globalRotation;
    }
}

上記の例では、localEulerAnglesと はeulerAngles両方とも回転を実装するために使用され、一方はローカル座標系に基づいて、もう一方はグローバル座標系に基づいて行われます。必要に応じて適切な属性を選択して回転を制御できます。

おすすめ

転載: blog.csdn.net/weixin_74850661/article/details/132488787