2 回答

TA貢獻(xiàn)1853條經(jīng)驗 獲得超9個贊
您正在設(shè)置,eulerAngles但這將導(dǎo)致localEulerAngles圖像中的紅色框表示的不同。如果對象有任何旋轉(zhuǎn)的祖先,它們可能不匹配!
要解決您的直接問題,您可以使用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使用四元數(shù)而不是歐拉角:
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貢獻(xiàn)1868條經(jīng)驗 獲得超4個贊
unity使用旋轉(zhuǎn)、位置、eulerAngles等兩種表示
一個在世界空間
另一個在本地空間
不包括local
在其名稱中的值在世界空間中。如果您的對象比任何被旋轉(zhuǎn)/縮放/平移的父對象具有,您將看不到您在 Unity 中設(shè)置的值,因為Transform
檢查器顯示本地坐標(biāo)。
如果要將local
坐標(biāo)設(shè)置為精確值,請改用localPosition
,localRotation
或localEulerAngles
。
對我來說,您似乎想x
在 0.5 秒內(nèi)將相機(jī)圍繞其局部軸旋轉(zhuǎn) 10°。
所以我認(rèn)為你可以改為這樣做
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 關(guān)注
- 252 瀏覽
添加回答
舉報