围绕 parent 轴旋转 child 有困难

Difficulty with rotating child around parent axes

我知道有一百万个关于旋转的问题,我已经尝试并阅读了很多东西,但我似乎无法解决这个特定问题。

我能想到的唯一正确解释它的方法是使用一些绘制不佳的图表,所以这里开始!

我有一个 parent object 和一个 child object (这里它表示为一个骰子,其中相反的面相加为 7),轴在此图是 parents X、Y 和 Z 方向

起点:

我希望 child object 有两个方法,我将调用它们 RotateZRotateXRotateZRotateX 应将 child 骰子围绕 parent 的 Z 轴和 X 轴旋转 90 度。

X 旋转:

Z 旋转:

我目前的代码是这样的

void RotateZ(int value) {
    transform.rotation *= Quaternion.AngleAxis(90f * value, pivot.transform.forward);
}

void RotateX(int value) {
    transform.rotation *= Quaternion.AngleAxis(90f * value, pivot.transform.right);
}

我应该注意枢轴是 parent object

如果 child 从 (0, 0, 0) 旋转开始,这似乎很有效,以 (0, 0, 0) 起点重复调用 RotateZRotateX 效果很好。如果我调用 RotateX 然后 RotateZ.

就会出现这个问题

在最初的 RotateX 调用之后,它看起来像这样,使 child 旋转 (90, 0, 0)

然后在 RotateZ 之后,期望的结果是:

但我最终得到的是:

我真的不知道自己做错了什么。我有一种感觉,我已经达到了欧拉角的极限,我需要学习四元数来防止这个问题。我需要什么样的旋转函数才能得到想要的结果?

看来你需要的是非常棒的调用

旋转

它是 Unity 中最重要的功能之一。 RotateAround doco

不要忘记 RotateAround 围绕 旋转 向量 - 任何向量。

巨额小费...

视频游戏工程中普遍存在的技术是:使用标记”- 意思是 只是一个空游戏 object - 您将其附加到 objects或者你附上你的 objects.

很多时候,您临时将 object 附加到标记上,以便移动它,然后再次将其从标记上移除。

以下是如何在代码中执行此操作。做一个标记“controlRotator”...

  1. 使 controlRotator a child 成为你的 controlObject.

  2. 使其在局部完全笔直:即与parent、controlObject的方向完全相同,即局部旋转=身份

  3. 接下来巧妙地将controlObject的WORLD位置设置为smallCube的WORLD位置...

  4. 你的smallCube,记下它是parent。把 smallCube 去掉 parent.

  5. 接下来,暂时让smallCube成为controlRotator的child

...现在您可以...

  1. 随心所欲地旋转 controlRotator!

您只需旋转 controlRotator,而不是小立方体。

请注意,您现在完全按照要求做,您正在使用 controlObject 的轴旋转 smallCube 。聪明吧?

  1. 最后,将 smallCube 放回您在第 4 步中保存的 parent。

这正是您的做法。实际上,这很常见,您可以使用扩展程序或函数来执行此操作。

注意根据需要动态制作GameObject controlRotator就好了,twist后去掉。 (这只是一个数学抽象。)

进一步提示...

此操作应该“在”controlObject 上起作用。制作一个名为

的脚本
TwistSomethingOnMyAxis.cs

并将其放在 CONTROLOBJECT.

会打一个电话

 public void twistThisThing(Transform twistIt) {}

你所做的是,当你想要扭曲 SMALL CUBE 时,你实际上在控件上调用了 TwistSomethingOnMyAxis OBJECT。你看?好喜欢

TwistSomethingOnMyAxis:twistor = 
  controlObject.GetComponent<TwistSomethingOnMyAxis>();
twistor.twistThisThing( smallCube , .. 90 degrees on Y or whatever .. );

我希望这是有道理的!享受吧!