我知道有关旋转的一百万个问题,我已经尝试过很多东西,但我似乎无法解决这个问题。
我能想到解释它的唯一方法是使用一些绘制得很糟糕的图表,所以这里就是这样!
我有一个父对象和一个子对象(这里它表示为对面加起来为7的骰子),此图中的轴是父X,Y和Z方向
起点:
我希望子对象有两种方法,我会调用RotateZ
和RotateX
。 RotateZ
和RotateX
应以90度为单位围绕父Z和X轴旋转子骰子。
RotateX:
RotateZ:
我目前拥有的代码是
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);
}
我应该注意pivot是父对象
如果孩子从(0, 0, 0)
轮换开始,反复拨打RotateZ
或RotateX
,(0, 0, 0)
起点很有效,这似乎很有效。如果我调用RotateX
然后调用RotateZ
。
在初次RotateX
调用后,它将如下所示,让孩子轮换(90, 0, 0)
。
然后在RotateZ
后得到所需的结果:
但我最终得到了这个:
我真的不知道自己做错了什么。我有一种感觉,我已经达到了我可以用欧拉角度做的极限,我需要学习四元数来防止这个问题。我需要什么样的旋转功能来获得理想的结果?
答案 0 :(得分:2)
看起来你需要的是真正棒极了的电话
这是Unity中最重要的一个。 RotateAround doco
不要忘记RotateAround
围绕 向量 - 任何向量旋转。
视频游戏工程中无处不在的技术是:你使用标记“ - 意思只是一个空的游戏对象 - 你附加到对象或你附加对象。
以下是如何在代码中执行此操作。制作一个标记“controlRotator”......
使controlRotator 成为controlObject的子项 。
在局部完全笔直:即,与父对象完全相同的方向,即对象<= p>
接下来,巧妙地 将controlObject的WORLD位置设置为smallCube的WORLD位置......
你的smallCube,记下它的父级。从那个父母那里拿走smallCube。
接下来,暂时让smallCube成为controlRotator的孩子
......现在你可以......
您只需旋转controlRotator,而不是小方块。
请注意,您现在正在执行您要求执行的操作,您正在使用controlObject 的轴旋转smallCube 。聪明吧?
这正是你如何做到的。在实践中,这是非常普遍的,你将有一个扩展或功能来做它。
请注意,可以根据需要动态制作GameObject controlRotator,并在扭曲后摆脱它。 (这只是一种数学抽象。)
此操作应在“on”控件对象上运行。制作一个名为
的脚本TwistSomethingOnMyAxis.cs
并将其放在CONTROLOBJECT上。
这将有一个电话
public void twistThisThing(Transform twistIt) {}
你要做的是,当你想要扭曲SMALL CUBE时,你实际上会调用TwistSomethingOnMyAxis ON THE CONTROL OBJECT。你看?所以喜欢
TwistSomethingOnMyAxis:twistor =
controlObject.GetComponent<TwistSomethingOnMyAxis>();
twistor.twistThisThing( smallCube , .. 90 degrees on Y or whatever .. );
我希望这是有道理的!享受!