为什么我的定向灯仅从90º旋转到-90º(Unity 5.5)

时间:2017-03-18 02:29:21

标签: c# unity3d rotation unity5 euler-angles

我已经尝试过这两个C#脚本来旋转定向灯:

using System.Collections;
using UnityEngine;

public class LightRotator : MonoBehaviour
{

    void Update ()
    {
        transform.rotation = Quaternion.Euler(transform.eulerAngles.x + 1.0f,
                                              transform.eulerAngles.y, 
                                              transform.eulerAngles.z);
    }
}

using System.Collections;
using UnityEngine;

public class LightRotator : MonoBehaviour
{

    void Update ()
    {    
        transform.localEulerAngles = new Vector3(transform.localEulerAngles.x + 1.0f, 
                                                 transform.localEulerAngles.y, 
                                                 transform.localEulerAngles.z);
    }
}

它们似乎完全相同:如果我将transform.eulerAngles.y更改为transform.eulerAngles.y + 0.5f,灯光将沿y轴旋转,同样适用于z轴。但是,当我尝试使用x轴进行此操作时,它会旋转直到达到90º,此时它将继续尝试旋转,但它会立即连续推回90º。如果我改变方向,它在-90º处做同样的事情。例如,轮换可能是:88.5,89.0,89.5,90.0,90.5,89.93,90.24,89.4等。

造成这种夹紧的原因是什么?如何解决?

4 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

为了解决您的问题,您需要使用其他向量,在每帧更新内部进行更改,然后将其传递给变换的eulerAngles专有权。

Vector3 vect = Vector3.zero;
float rotationSpeed = 10f;

void Start () {
    vect = transform.eulerAngles; //Set the vect rotation equal to the game object's one
}

void Update ()
{
    vect.x += rotationSpeed * Time.deltaTime;

    //Pass unique eulerAngles representation to the object without letting Unity change it
    transform.eulerAngles = vect;
}

这种情况发生了,因为在3D空间中存在多个欧拉角度表示单个物理旋转,并且当您直接处理变换的eulerAngles适当性时,Unity会在幕后进行一些工作,可以导致万向节锁定。

答案 2 :(得分:0)

使用四元数。这是Unity3d在内部使用的,并没有任何欧拉角的副作用。

using System.Collections;
using UnityEngine;

public class LightRotator : MonoBehaviour
{
    public Vector3 RotationAxis = Vector3.right;

    Quaternion _startRotation;
    float _rotationIncrement = 0;
    void Start()
    {
         _startRotation = transform.rotation;
    }
    void Update ()
    {
        Quaternion rotationMod = 
            Quaternion.AngleAxis(_rotationIncrement, RotationAxis);
        _rotationIncrement += 1;
        transform.rotation = _startRotation * rotationMod;
    }
}

但是,您可能希望使用Quaternion.RotateTowardsQuaternion.Lerp以及Time.time和费率。通过这种方式,您将获得更加平滑的结果。

答案 3 :(得分:0)

如果只想沿X轴旋转,则将另一个轴设置为0。