我正在尝试更改相机旋转的eulerAngle X,同时将y和z保持为0。
但是,以下IEnumerator会导致奇怪的eulerAngles,如10,-74.653、0。
我不明白y值如何在以下函数中改变:
data.frame
这不是很奇怪吗?我从不更改Y和Z值!
我只想将X旋转(eulerAngle.x)从当前值更改为10。
谢谢您的帮助!
答案 0 :(得分:2)
Unity使用旋转,位置,eulerAngles等的两种表示形式
名称中不包含local
的值在世界空间中。
如果您的对象具有比任何已旋转/缩放/平移的父对象,那么您将看不到您在Unity中设置的值,因为Transform
检查器会显示本地坐标。
如果要将local
坐标设置为精确值,请改用localPosition
,localRotation
或localEulerAngles
。
对我来说,您似乎想以0.5秒为单位将相机绕其x
本地轴旋转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));
}
答案 1 :(得分:2)
您正在设置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
使用四元数而不是Euler角:
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;
}