2016-09-12 11 views
0

左矢印キーでオブジェクトを回転させたいので、回転を30度に拘束したいと思います。私のコードは:Unity3Dでバウンド回転

if (Input.GetKey(KeyCode.LeftArrow) && transform.localEulerAngles.z <= 30) 
    transform.Rotate(0,0,1); 

なぜ回転が31度に止まるのですか? 明らかに、私の問題はこれより複雑です。私は境界があり、精度が必要です。この例の理由は、このように管理されていれば、回転が正確ではないと簡単に言うことです。

私はUnity3Dが内部的にクォータニオンを使用し、度に作用するのは単なる近似であると思います。私は正しい?この最後のケースで私はこれにどのように対処できますか?

たとえば、軸上で30度回転の四元数を使用するにはどうすればよいですか?

ところで、問題がこれ以外の場合は、他に解決策がありますか?

答えて

1

どのように回転を管理するのか分かりませんが、ここでは問題はより単純に思えます。

「< =」の比較を使用している場合、オブジェクトが30度のときに最後の時間を入力して1度回転させ、正しい時刻に停止するには「<」を使用します

+0

私はすでにそのようにしています:同じ結果 – Yuri

0

Start()関数の現在のローテーションを取得し、それを使用してifステートメントの実行に使用されるオフセットを見つけます。これを行う必要があります:

public GameObject gameObjectToRotate; 
Vector3 defaultAngle; 
float minRot = 30f; 
float maxRot = 30f; 

// Use this for initialization 
void Start() 
{ 
    defaultAngle = gameObjectToRotate.transform.eulerAngles; 
} 

// Update is called once per frame 
void Update() 
{ 
    if (Input.GetKey(KeyCode.LeftArrow)) 
    { 
     float offset = defaultAngle.z - gameObjectToRotate.transform.eulerAngles.z; 
     //Check if we are within min, max rot 
     if (offset < minRot && offset > -maxRot) 
     { 
      gameObjectToRotate.transform.Rotate(0, 0, 1); 
      Debug.Log("Rotating!"); 
     } 
    } 
} 

精度は30.016です。これはあなたが今得ているものよりはるかに優れています。

+0

ねえ、私の答えはあなたの問題を解決すると思っています。もしそうなら、答えとしてこれを受け入れてください。 – Programmer

関連する問題