Unity:旋转轴上的GameObject错误

时间:2020-04-30 02:28:31

标签: unity3d

bug pic

在上面的GIF中,我用鼠标上下移动飞机。观察当我沿Z轴旋转平面时,即使现在平面是侧面,平面仍会上下移动。那是我的虫子。为什么会这样呢?我的代码有什么问题?我想我使用的是全局轴,而不是游戏对象轴。我该如何解决这个问题。

x += Input.GetAxis("Mouse X") * xMouseSpeed * 0.02f;
y -= Input.GetAxis("Mouse Y") * yMouseSpeed * 0.02f;

if (Input.GetKey(KeyCode.Q))
{
    rotZ += Time.deltaTime * 50f;
}

if (Input.GetKey(KeyCode.E))
{
    rotZ -= Time.deltaTime * 50f;
}

Quaternion rotation = Quaternion.Euler(y, x, rotZ);

planeBodyToMove.localRotation = rotation;

1 个答案:

答案 0 :(得分:2)

发生的情况是localRotation只是相对于父对象的旋转。

相对于父对象的变换旋转的变换旋转。

或者换句话说:localRotation并不是对象本身的局部,而是在父级的本地空间(如果没有父级,则为Unity世界空间)中的旋转。 。这并不意味着您必须绕本地Y轴旋转。它以ZXY的顺序在父级的本地空间中应用旋转。这就是为什么有时您实际上不注意差异的原因,直到旋转{{1} }!

正如您在这里看到的那样,只需通过检查器进行旋转,即使没有代码也可以发生相同的事情

enter image description here

或者为了更好地演示它,让我们看看如果按照您实际希望的方式旋转它会发生什么情况:

enter image description here

如您所见,一旦旋转一个轴,现在更改另一轴将更改所有三个旋转值。


解决方案

那如何解决呢?

通常我会自己懒惰进行Y的计算→我让Quaternion替我做这个^^

您无需直接将期望的旋转存储在字段中并通过将其转换为Transform来每次应用它,而可以直接使用Transform.Rotate,它实际上使用其自身的局部轴旋转对象:

Quaternion

您现在可以看到,每次旋转实际上都应用在飞机的局部轴上:

enter image description here