围绕 parent 轴旋转 child 有困难
Difficulty with rotating child around parent axes
我知道有一百万个关于旋转的问题,我已经尝试并阅读了很多东西,但我似乎无法解决这个特定问题。
我能想到的唯一正确解释它的方法是使用一些绘制不佳的图表,所以这里开始!
我有一个 parent object 和一个 child object (这里它表示为一个骰子,其中相反的面相加为 7),轴在此图是 parents X、Y 和 Z 方向
起点:
我希望 child object 有两个方法,我将调用它们 RotateZ
和 RotateX
。 RotateZ
和 RotateX
应将 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)
起点重复调用 RotateZ
或 RotateX
效果很好。如果我调用 RotateX
然后 RotateZ
.
就会出现这个问题
在最初的 RotateX
调用之后,它看起来像这样,使 child 旋转 (90, 0, 0)
。
然后在 RotateZ
之后,期望的结果是:
但我最终得到的是:
我真的不知道自己做错了什么。我有一种感觉,我已经达到了欧拉角的极限,我需要学习四元数来防止这个问题。我需要什么样的旋转函数才能得到想要的结果?
看来你需要的是非常棒的调用
旋转
它是 Unity 中最重要的功能之一。 RotateAround doco
不要忘记 RotateAround
围绕 旋转 向量 - 任何向量。
巨额小费...
视频游戏工程中普遍存在的技术是:使用标记”- 意思是 只是一个空游戏 object - 您将其附加到 objects或者你附上你的 objects.
很多时候,您临时将 object 附加到标记上,以便移动它,然后再次将其从标记上移除。
以下是如何在代码中执行此操作。做一个标记“controlRotator”...
使 controlRotator a child 成为你的 controlObject.
使其在局部完全笔直:即与parent、controlObject的方向完全相同,即局部旋转=身份
接下来巧妙地将controlObject的WORLD位置设置为smallCube的WORLD位置...
你的smallCube,记下它是parent。把 smallCube 去掉 parent.
接下来,暂时让smallCube成为controlRotator的child
...现在您可以...
- 随心所欲地旋转 controlRotator!
您只需旋转 controlRotator,而不是小立方体。
请注意,您现在完全按照要求做,您正在使用 controlObject 的轴旋转 smallCube 。聪明吧?
- 最后,将 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 .. );
我希望这是有道理的!享受吧!
我知道有一百万个关于旋转的问题,我已经尝试并阅读了很多东西,但我似乎无法解决这个特定问题。
我能想到的唯一正确解释它的方法是使用一些绘制不佳的图表,所以这里开始!
我有一个 parent object 和一个 child object (这里它表示为一个骰子,其中相反的面相加为 7),轴在此图是 parents X、Y 和 Z 方向
起点:
我希望 child object 有两个方法,我将调用它们 RotateZ
和 RotateX
。 RotateZ
和 RotateX
应将 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)
起点重复调用 RotateZ
或 RotateX
效果很好。如果我调用 RotateX
然后 RotateZ
.
在最初的 RotateX
调用之后,它看起来像这样,使 child 旋转 (90, 0, 0)
。
然后在 RotateZ
之后,期望的结果是:
但我最终得到的是:
我真的不知道自己做错了什么。我有一种感觉,我已经达到了欧拉角的极限,我需要学习四元数来防止这个问题。我需要什么样的旋转函数才能得到想要的结果?
看来你需要的是非常棒的调用
旋转
它是 Unity 中最重要的功能之一。 RotateAround doco
不要忘记 RotateAround
围绕 旋转 向量 - 任何向量。
巨额小费...
视频游戏工程中普遍存在的技术是:使用标记”- 意思是 只是一个空游戏 object - 您将其附加到 objects或者你附上你的 objects.
很多时候,您临时将 object 附加到标记上,以便移动它,然后再次将其从标记上移除。
以下是如何在代码中执行此操作。做一个标记“controlRotator”...
使 controlRotator a child 成为你的 controlObject.
使其在局部完全笔直:即与parent、controlObject的方向完全相同,即局部旋转=身份
接下来巧妙地将controlObject的WORLD位置设置为smallCube的WORLD位置...
你的smallCube,记下它是parent。把 smallCube 去掉 parent.
接下来,暂时让smallCube成为controlRotator的child
...现在您可以...
- 随心所欲地旋转 controlRotator!
您只需旋转 controlRotator,而不是小立方体。
请注意,您现在完全按照要求做,您正在使用 controlObject 的轴旋转 smallCube 。聪明吧?
- 最后,将 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 .. );
我希望这是有道理的!享受吧!