我已经尝试过这两个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等。
造成这种夹紧的原因是什么?如何解决?
答案 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.RotateTowards
或Quaternion.Lerp
以及Time.time
和费率。通过这种方式,您将获得更加平滑的结果。
答案 3 :(得分:0)
如果只想沿X轴旋转,则将另一个轴设置为0。