GameObject可以绕Y和Z旋转,但不能绕X旋转



我是Unity开发的新手,在旋转GameObjects时遇到了一些问题

每次调用函数时,我都要使和对象旋转-90度。此时,我可以让它绕着Y和Z轴旋转,没有问题,但是,如果我改变参数,让它绕X旋转,它在从-90º(实际上是270º(旋转到180º后就会卡住
这是我用于测试的代码:

public class RotateCube : MonoBehaviour
{
GameObject cube;
bool rotating;
private void Start()
{
cube = GameObject.Find("Cube");
rotating = false;
}
private void Update()
{
if (!rotating)
{
StartCoroutine(Rotate());
}
}
private IEnumerator Rotate()
{
rotating = true;
float finalAngle = SubstractNinety(cube.transform.eulerAngles.x);
while (cube.transform.rotation.eulerAngles.x != finalAngle)
{
cube.transform.rotation = Quaternion.RotateTowards(cube.transform.rotation, Quaternion.Euler(finalAngle, cube.transform.rotation.eulerAngles.y, cube.transform.rotation.eulerAngles.z), 100f * Time.deltaTime);
yield return null;
}
cube.transform.rotation = Quaternion.Euler(finalAngle, cube.transform.rotation.eulerAngles.y, cube.transform.rotation.eulerAngles.z);
yield return null;
rotating = false;
}
private float SubstractNinety(float angle)
{
if (angle < 90)
{
return 270f;
}
return angle - 90;
}
}

我正在更新四元数中的所有坐标。Euler,因为我希望用户能够在对象旋转时拖动对象,但我不介意解决方案是否需要在循环之前定义四元数。

为什么要费力地通过eulerAngles

使用.eulerAngles属性设置旋转时,重要的是要理解,尽管您提供了X、Y和Z旋转值来描述旋转,但这些值不会存储在旋转中。相反,X、Y&Z值被转换为Quaternion的内部格式。

读取.eulerAngles属性时,Unity会将Quaternion的内部旋转表示转换为Euler角度。因为,使用欧拉角表示任何给定旋转的方法不止一种,所以您读取回的值可能与您指定的值大不相同。如果您试图逐渐增加值以生成动画,这可能会导致混乱

为了避免这类问题,建议使用旋转的方法是在读取.eulerAngles时避免依赖一致的结果,特别是在尝试逐渐增加旋转以生成动画时。有关实现此目的的更好方法,请参见"四元数*"操作符。

直接使用Quaternion!只需使用*算子将所需旋转添加到现有旋转

private IEnumerator Rotate()
{
rotating = true;
// This returns a new Quaternion rotation which is the original
// rotation and then rotated about -90° on the global X axis
var finalRotation = currentRotation * Quaternion.Euler(-90, 0, 0);
// simply directly use Quaternion comparison
while (cube.transform.rotation != finalRotation)
{
cube.transform.rotation = Quaternion.RotateTowards(cube.transform.rotation, finalRotation, 100f * Time.deltaTime);
yield return null;
}
cube.transform.rotation = finalRotation;
rotating = false;
}

最新更新