Vector3的eulerAngles导致奇怪的旋转

时间:2018-12-12 20:47:20

标签: c# unity3d

我正在尝试更改相机旋转的eulerAngle X,同时将y和z保持为0。

但是,以下IEnumerator会导致奇怪的eulerAngles,如10,-74.653、0。

enter image description here

我不明白y值如何在以下函数中改变:

data.frame

这不是很奇怪吗?我从不更改Y和Z值!

我只想将X旋转(eulerAngle.x)从当前值更改为10。

谢谢您的帮助!

2 个答案:

答案 0 :(得分:2)

Unity使用旋转,位置,eulerAngles等的两种表示形式

  • 一个人在世界空间
  • 另一个在当地空间

名称中不包含local的值在世界空间中。 如果您的对象具有比任何已旋转/缩放/平移的父对象,那么您将看不到您在Unity中设置的值,因为Transform检查器会显示本地坐标。

如果要将local坐标设置为精确值,请改用localPositionlocalRotationlocalEulerAngles

对我来说,您似乎想以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.EulerQuaternion.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;
}
相关问题