2016-05-19 194 views
0

我在學Unity,我有一個問題。Unity旋轉和四元數

我不明白爲什麼這條線將旋轉重置爲0,0,0。我正在做的是重新分配它的歐拉值?

transform.rotation = 
      Quaternion.Euler(transform.rotation.x, 
           transform.rotation.y, 
           transform.rotation.z); 

我這樣做的原因是因爲我需要鎖定一個軸並保持其他軸的更改。所以我想在X軸和Z軸的變化後,我可以做這樣發生的:

transform.rotation = Quaternion.Euler(transform.rotation.x, 
             LOCKED ROTATION VALUE, 
             transform.rotation.z); 

我敢肯定它的簡單,但我不能找出什麼是錯。

在此先感謝。

+0

你不能把'transform.rotation'的值放到'Quaternion.Euler'中。這不會做你的想法。 'transform.rotation'返回一個四元數和四元數是複數,而不是浮點數。例如。 y軸上的180度旋轉將是'w = 0,x = 0,y = 1,z = 0'的四元數。 –

+0

**不要**因爲任何原因使用四元數。你可能看到他們在網上提到,這是令人困惑的。要在Unity中旋轉對象,請使用「旋轉」。在許多情況下,你也可以使用「eulerAngles」。請享用! – Fattie

+1

@JoeBlow完全不同意,請重新檢查使用四元數的優點,以及它們如何比您提出的更好,只有當您正確理解問題時,我敢打賭你纔會改變主意。關於他們的gamasutra有很好的文章。 – Vilo

回答

2

Here is some documentation with transform.Rotate()。我會用這個旋轉。

// Here is an example if you want to just rotate the Z axis. 
transform.Rotate(new Vector3(0, 0, 10f) * Time.deltaTime); 

Also, here is some other documentation on Quaternion。你可以使用像RotateTowards這樣的函數。

如果你的遊戲對象上有一個剛體,那麼你可以在Unity中鎖定它的旋轉。單擊遊戲對象並在Rigidbody組件下單擊約束,然後單擊凍結旋轉下的軸。

+0

我的對象沒有一個剛體,我不需要有一個。 – Sangratura

+1

@Sangratura - 當然。對不起,我沒有說清楚,你只需要使用Rotate()。只是給你選擇。 –

+0

嗨@Sangratura。這是絕對必要的,你***不使用***四元數。如果(由於某種原因)只需使用transform.eulerAngles來設置eulerAngles。 – Fattie

1

您正在使用transform.rotation,就好像它暴露歐拉角(它不是)。如果你想旋轉歐拉角,你必須這樣做:

transform.rotation = 
      Quaternion.Euler(transform.rotation.eulerAngles.x, 
           transform.rotation.eulerAngles.y, 
           transform.rotation.eulerAngles.z);