Unity3D將旋轉存儲在一個非常抽象的數學表示中,稱爲quaternion。從歐拉角到歐拉角的轉換(你在Unity編輯器中看到的)涉及三角函數的級聯,因此容易出現舍入誤差,尤其是對於簡單的浮點類型。
爲了解決您的問題,我建議在開始旋轉之前存儲初始Quaternion對象,並在流程結束時將其設置。一些僞代碼:
public class RotationController : MonoBehaviour {
Quaternion rotationAtStart;
int numOfRotations = 0;
void rotate() {
numOfRotations++;
if (numOfRotations == 1) {
rotationAtStart = transform.rotation;
} else if (numOfRotations < 9) {
transform.Rotate (new Vector3 (0,40.0f,0));
} else if (numOfRotations == 9) {
transform.rotation = rotationAtStart;
}
}
void Update() {
if (numOfRotations < 9) {
rotate();
}
}
}
360°的特殊情況使此方法穩定。對於小於360°,你必須忍受小的舍入誤差。對於這種情況,我會建議計算目標四元數Quaternion.RotateTowards
並將其設置爲與360案例類似的最後一步。
另一個有用的東西是你Animations。您可以將動畫定義爲平滑或離散步驟,如果按「i」,則只需撥打GameObject.animation.Play("MyRotation")
即可。動畫終止時,最後使用動畫事件通知。
最後Mathf包含一個處理浮點不精確問題的函數Approximately。
來源
2011-12-12 11:18:17
Kay
如果我曾經喜歡你的建議將是改變對象的本地軸,或者將它只能旋轉對象的動畫? – Dave
您可以爲遊戲對象的變換的成員設置動畫。 transform.rotation在歐拉角 – Kay
感謝您的幫助。儘管如此,它更像是一種側重解決問題的方式。我不能說如果(transform.eulerAngles.y == 40.0f),因爲即使旋轉朝向給出更準確的結果仍然存在錯誤。我還沒有嘗試過這個動畫建議,但是我現在就去試試看。 – Dave