绕三轴旋转时的万向节锁定问题

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

[编辑]伙计们,事实证明我的问题不是因为云台锁定。我只需要重置值即可。

我正在尝试在所有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));
} 

这也仍然给我带来万向节锁定问题。如何摆脱万向节锁定问题?

c# unity3d
2个回答
0
投票

我对Quaternion完全不是专家,所以如果您想使用它们,请坚持使用Ruzihm所说的任何内容;)


但是,在您的情况下,我建议您直接简单地遍历Transform组件,甚至不考虑使用Quaterniontransform.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,因此它使用对象自己的局部坐标系,该坐标系在旋转后会旋转!因此,您可能总是希望使用世界空间轴进行旋转。


[第二个想法:您可能在这里得到的不是“万能锁”,但是您没有正确重置RotateSpace.Selfx,因此它们始终保持y和rightarrow;总是跳入第一种情况?确保将它们重置在某个地方,例如旋转后直接

z

当然取决于您是否需要在其他地方使用它们,但我们需要查看更多代码来回答此问题。


0
投票

使用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;
} 
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.