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

问题描述 投票:0回答:4

我试过这两个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等。

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

c# unity3d rotation unity5 euler-angles
4个回答

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在幕后做了一些工作,这可能导致万向节锁定。


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和费率。这样你会得到更平滑的结果。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.