Unity X轴旋转怪癖
Unity X-Axis rotation quirk
我有一个脚本可以在按下按钮时旋转对象。旋转平面取决于在下拉菜单中选择的轴。该脚本在 Y 轴和 Z 轴上运行良好,但在 X 轴上有意外行为。
按住左旋转按钮时,音量会旋转到-90,得到'stuck'。然后我按住右旋转按钮,它在再次卡住之前不会超过 90。更奇怪的是,在卡在某个特定方向并切换到另一个方向后,音量并没有以另一种方式返回,而是继续朝着它没有卡在一开始的方向前进。这会导致左右旋转按钮交换。
这是包含所有主要操作的代码。
public void Update()
{
axis = axisDropdown.value;
Vector3 originalRot = transform.eulerAngles;
if (buttonHeld)
{
if (rotateRight)
{
if (axis == 0)
{
originalRot.x += 1;
transform.rotation = Quaternion.Euler(originalRot);
}
else if (axis == 1)
{
originalRot.y += 1;
transform.rotation = Quaternion.Euler(originalRot);
}
else if (axis == 2)
{
originalRot.z += 1;
transform.rotation = Quaternion.Euler(originalRot);
}
else
{
print("Error: Selected axis option is invalid");
}
}
else
{
if (axis == 0)
{
originalRot.x -= 1;
transform.rotation = Quaternion.Euler(originalRot);
}
else if (axis == 1)
{
originalRot.y -= 1;
transform.rotation = Quaternion.Euler(originalRot);
}
else if (axis == 2)
{
originalRot.z -= 1;
transform.rotation = Quaternion.Euler(originalRot);
}
else
{
print("Error: Selected axis option is invalid");
}
}
}
}
我读过其他与我类似的问题,但它们似乎都略有不同,因此我们将不胜感激。
确实是云台锁定效应造成的。发生这种情况是因为我试图改变对象的欧拉角,而不是仅仅围绕四元数旋转。
这是避免该问题的工作代码:
public void Update()
{
axis = axisDropdown.value;
Vector3 originalRot = transform.eulerAngles;
if (buttonHeld)
{
if (rotateRight)
{
if (axis == 0)
{
transform.RotateAround(volume.transform.position, Vector3.right, 50 * Time.deltaTime);
}
else if (axis == 1)
{
transform.RotateAround(volume.transform.position, Vector3.up, 50 * Time.deltaTime);
}
else if (axis == 2)
{
transform.RotateAround(volume.transform.position, Vector3.forward, 50 * Time.deltaTime);
}
else
{
print("Error: Selected axis option is invalid");
}
}
else
{
if (axis == 0)
{
transform.RotateAround(volume.transform.position, Vector3.left, 50 * Time.deltaTime);
}
else if (axis == 1)
{
transform.RotateAround(volume.transform.position, Vector3.down, 50 * Time.deltaTime);
}
else if (axis == 2)
{
transform.RotateAround(volume.transform.position, Vector3.back, 50 * Time.deltaTime);
}
else
{
print("Error: Selected axis option is invalid");
}
}
}
}
我有一个脚本可以在按下按钮时旋转对象。旋转平面取决于在下拉菜单中选择的轴。该脚本在 Y 轴和 Z 轴上运行良好,但在 X 轴上有意外行为。
按住左旋转按钮时,音量会旋转到-90,得到'stuck'。然后我按住右旋转按钮,它在再次卡住之前不会超过 90。更奇怪的是,在卡在某个特定方向并切换到另一个方向后,音量并没有以另一种方式返回,而是继续朝着它没有卡在一开始的方向前进。这会导致左右旋转按钮交换。
这是包含所有主要操作的代码。
public void Update()
{
axis = axisDropdown.value;
Vector3 originalRot = transform.eulerAngles;
if (buttonHeld)
{
if (rotateRight)
{
if (axis == 0)
{
originalRot.x += 1;
transform.rotation = Quaternion.Euler(originalRot);
}
else if (axis == 1)
{
originalRot.y += 1;
transform.rotation = Quaternion.Euler(originalRot);
}
else if (axis == 2)
{
originalRot.z += 1;
transform.rotation = Quaternion.Euler(originalRot);
}
else
{
print("Error: Selected axis option is invalid");
}
}
else
{
if (axis == 0)
{
originalRot.x -= 1;
transform.rotation = Quaternion.Euler(originalRot);
}
else if (axis == 1)
{
originalRot.y -= 1;
transform.rotation = Quaternion.Euler(originalRot);
}
else if (axis == 2)
{
originalRot.z -= 1;
transform.rotation = Quaternion.Euler(originalRot);
}
else
{
print("Error: Selected axis option is invalid");
}
}
}
}
我读过其他与我类似的问题,但它们似乎都略有不同,因此我们将不胜感激。
确实是云台锁定效应造成的。发生这种情况是因为我试图改变对象的欧拉角,而不是仅仅围绕四元数旋转。
这是避免该问题的工作代码:
public void Update()
{
axis = axisDropdown.value;
Vector3 originalRot = transform.eulerAngles;
if (buttonHeld)
{
if (rotateRight)
{
if (axis == 0)
{
transform.RotateAround(volume.transform.position, Vector3.right, 50 * Time.deltaTime);
}
else if (axis == 1)
{
transform.RotateAround(volume.transform.position, Vector3.up, 50 * Time.deltaTime);
}
else if (axis == 2)
{
transform.RotateAround(volume.transform.position, Vector3.forward, 50 * Time.deltaTime);
}
else
{
print("Error: Selected axis option is invalid");
}
}
else
{
if (axis == 0)
{
transform.RotateAround(volume.transform.position, Vector3.left, 50 * Time.deltaTime);
}
else if (axis == 1)
{
transform.RotateAround(volume.transform.position, Vector3.down, 50 * Time.deltaTime);
}
else if (axis == 2)
{
transform.RotateAround(volume.transform.position, Vector3.back, 50 * Time.deltaTime);
}
else
{
print("Error: Selected axis option is invalid");
}
}
}
}