2 回答

TA貢獻1853條經驗 獲得超9個贊
您正在設置,eulerAngles但這將導致localEulerAngles圖像中的紅色框表示的不同。如果對象有任何旋轉的祖先,它們可能不匹配!
要解決您的直接問題,您可以使用localEulerAngles代替eulerAngles:
float f = Mathf.Lerp(camera.transform.localEulerAngles.x, 10, t / duration);
Vector3 vNew = new Vector3(f, 0, 0);
camera.transform.localEulerAngles= vNew;
這樣做的問題是它沒有考慮從 359 度到 0 度的能力。更好的是使用Quaternion.Euler和Quaternion.Slerp使用四元數而不是歐拉角:
private IEnumerator LerpCameraNormalRot()
{
float duration = 0.5f;
Quaternion startRotation = camera.transform.localRotation;
Quaternion goalRotation = Quaternion.Euler(10f, 0f, 0f);
for (float t = 0f; t < duration; t += Time.deltaTime)
{
camera.transform.localRotation = Quaternion.Slerp(startRotation, goalRotation, t/duration);
yield return 0;
}
camera.transform.localRotation = goalRotation;
}

TA貢獻1868條經驗 獲得超4個贊
unity使用旋轉、位置、eulerAngles等兩種表示
一個在世界空間
另一個在本地空間
不包括local
在其名稱中的值在世界空間中。如果您的對象比任何被旋轉/縮放/平移的父對象具有,您將看不到您在 Unity 中設置的值,因為Transform
檢查器顯示本地坐標。
如果要將local
坐標設置為精確值,請改用localPosition
,localRotation
或localEulerAngles
。
對我來說,您似乎想x
在 0.5 秒內將相機圍繞其局部軸旋轉 10°。
所以我認為你可以改為這樣做
private IEnumerator LerpCameraNormalRot()
{
float duration = 0.5f;
float initialRotationX = camera.transform.localEulerAngles.x;
float targetRotationX = 10;
for (float t = 0f; t < duration; t += Time.deltaTime)
{
float currentX = Mathf.Lerp(initialRotationX, targetRotationX, t / duration);
camera.transform.localEulerAngles = new Vector3(currentX , 0, 0);
// Which would be the same as using
// camera.transform.localRotation = Quaternion.Euler(new Vector3(currentX, 0, 0));
yield return null;
}
// to be sure you have no overshooting you could set the target rotation fix here as well
camera.transform.localEulerAngles = new Vector3(targetRotation, 0 ,0);
// or
// camera.transform.localRotation = Quaternion.Euler(new Vector3(targetRotation, 0, 0));
}
- 2 回答
- 0 關注
- 260 瀏覽
添加回答
舉報