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 关注
- 206 浏览
添加回答
举报