[编辑]伙计们,事实证明我的问题不是因为云台锁定。我只需要重置值即可。
我正在尝试在所有3个轴上旋转。我为每个轴有三个按钮,例如用户按下X。然后对象应绕X轴返回90度。但是看起来无论如何我都无法摆脱万向节锁定的情况。现在我有
private void rotateMe()
{
if (x)
transform.rotation *= Quaternion.AngleAxis(90, new Vector3(1, 0, 0));
else if (y)
transform.rotation *= Quaternion.AngleAxis(90, new Vector3(0, 1, 0));
else if (z)
transform.rotation *= Quaternion.AngleAxis(90, new Vector3(0, 0, 1));
}
这也仍然给我带来万向节锁定问题。如何摆脱万向节锁定问题?
我对Quaternion
完全不是专家,所以如果您想使用它们,请坚持使用Ruzihm所说的任何内容;)
但是,在您的情况下,我建议您直接简单地遍历Transform
组件,甚至不考虑使用Quaternion
或transform.Rotate
来考虑transform.Rotate
transform.RotateArround
注意: transform.RotateArround
有可选参数private void rotateMe()
{
Vector3 axis;
if (x) axis = Vector3.right;
else if (y) axis = Vector3.up;
else if (z) axis = Vector3.forward;
if(Mathf.Approximately(axis.magnitude, 0)) return;
transform.Rotate(axis, 90, Space.World);
}
!默认情况下,它是Space relativeTo
,因此它使用对象自己的局部坐标系,该坐标系在旋转后会旋转!因此,您可能总是希望使用世界空间轴进行旋转。
[第二个想法:您可能在这里得到的不是“万能锁”,但是您没有正确重置Rotate
,Space.Self
和x
,因此它们始终保持y
和rightarrow;总是跳入第一种情况?确保将它们重置在某个地方,例如旋转后直接
z
当然取决于您是否需要在其他地方使用它们,但我们需要查看更多代码来回答此问题。
使用true
,先旋转X然后旋转A,然后旋转X之前的轴,得到旋转Y。这应该得到您想要的结果:
private void rotateMe()
{
Vector3 axis;
if (x) axis = Vector3.right;
else if (y) axis = Vector3.up;
else if (z) axis = Vector3.forward;
if(Mathf.Approximately(axis.magnitude, 0)) return;
transform.Rotate(axis, 90, Space.World);
x = false;
y = false;
z = false;
}