2017-01-06 4 views
2

オイラー角に関するUnityのドキュメントについて少し混乱します。私は違いを理解していないか、サンプルがベストプラクティスに従っていないかどうかを知りたいだけです。ドキュメントhere 状態:オイラー角が360度を超えて増加する

この変数を使用して角度を読み取り、絶対値に設定します。角度が360度を超えると失敗するため、それらを増分しないでください。代わりにTransform.Rotateを使用してください。

はまた、コードサンプルは、360度を超える可能性が増分を使用しているように見える:

using UnityEngine; 
using System.Collections; 

public class ExampleClass : MonoBehaviour { 
    public float yRotation = 5.0F; 
    void Update() { 
     yRotation += Input.GetAxis("Horizontal"); 
     transform.eulerAngles = new Vector3(10, yRotation, 0); 
    } 
    void Example() { 
     print(transform.eulerAngles.x); 
     print(transform.eulerAngles.y); 
     print(transform.eulerAngles.z); 
    } 
} 

は、変数をインクリメントして、絶対にまだ値を設定する危険性を実行するには、その変数を使用していないだろう変数が360度を超える場合は360度を超えていますか?

+0

私は例が、yは、xおよびzはContantをまま、定期的に変更されている唯一の軸であるため、yが無限にインクリメント持ってしても安全である特殊なケースだと思います。 すべての軸が潜在的に変更可能な場合、yを増やすと、ユーラーが360でスワップするときに問題が発生する可能性があります。ジンバルロック状態になることさえあります。 Transform.Rotateの使用が推奨されると思います。 –

答えて

1

違いがあります。行う場合:

transform.eulerAngles.y += 1F; 

をあなたはVector3+=オペレータを呼び出しています。

float newY = transform.eulerAngles.y + 1F; 
transform.eulerAngles = new Vector3(.., newY, ..); 

あなたはTransformでセッターを呼び出している、そしてこのセッターの内側に、それはおそらくTransform.rotationを更新するアクションが含まれています。あなたがこの方法をeulerAngles設定が

、。

違いはUnityがVector3クラスの代わりにTransformクラスの更新ロジックを実装できるということです。

我々はdocumentationにさらに以下にこれを確認することができます

を別途(= 10例えばeulerAngles.xを。;)オイラー角軸のいずれかを設定しないでください、これはドリフトにつながると望ましくない回転しますので、。 を新しい値に設定すると、上記のようにすべて一度に設定されます。 Unity は、 Transform.rotationに格納された回転との間で角度を変換します。

+1

ここに追加するものは、Javascriptのみに適用されます。また、これを回避するために、実際には次のようなことができます: 'transform.eulerAngles.y + = yRotation%360;'。あなたは、回避策を知ることは良いことではありません。 – Programmer

+0

@Programmer 'transform.eulerAngles.y + = 1F'はC#で安全に動作することを意味しますか? :O – Lincoln

+0

いいえ、コンパイルされません。それはC#のそれについての保護です。これはJavascriptでコンパイルされ、ドキュメントに記載されている問題が発生します。 – Programmer

2

あなたはそれが360に到達し、さらに超過しようとすると、オイラー角を使用して、オブジェクトが、その後、それが(マイナス)となり回転-360、徐々にでは-1に-359から増加。

次のコードを実行すると、値は360を超えず、正の値を維持します。

float rotateAngle = rotateObject.transform.localEulerAngles.y; 
// Convert negative angle to positive angle 
rotateAngle = (rotateAngle > 180) ? rotateAngle - 360 : rotateAngle; 
rotateObject.transform.localEulerAngles = new Vector3(rotateObject.transform.localEulerAngles.x, rotateAngle, rotateObject.transform.localEulerAngles.z); 
+0

ありがとうと私はあなたが言っていることを得るが、docのサンプルコードはまだ360を超えるリスクがありますか? – tchock

関連する問題