在上面的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;
答案 0 :(得分:2)
发生的情况是localRotation
只是相对于父对象的旋转。
相对于父对象的变换旋转的变换旋转。
或者换句话说:localRotation
并不是对象本身的局部,而是在父级的本地空间(如果没有父级,则为Unity世界空间)中的旋转。 。这并不意味着您必须绕本地Y轴旋转。它以Z
,X
,Y
的顺序在父级的本地空间中应用旋转。这就是为什么有时您实际上不注意差异的原因,直到旋转{{1} }!
正如您在这里看到的那样,只需通过检查器进行旋转,即使没有代码也可以发生相同的事情
或者为了更好地演示它,让我们看看如果按照您实际希望的方式旋转它会发生什么情况:
如您所见,一旦旋转一个轴,现在更改另一轴将更改所有三个旋转值。
那如何解决呢?
通常我会自己懒惰进行Y
的计算→我让Quaternion
替我做这个^^
您无需直接将期望的旋转存储在字段中并通过将其转换为Transform
来每次应用它,而可以直接使用Transform.Rotate
,它实际上使用其自身的局部轴旋转对象:
Quaternion
您现在可以看到,每次旋转实际上都应用在飞机的局部轴上: