绕父轴旋转儿童的困难

时间:2016-06-10 16:55:35

标签: unity3d rotation unity5 quaternions euler-angles

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

我能想到解释它的唯一方法是使用一些绘制得很糟糕的图表,所以这里就是这样!

我有一个父对象和一个子对象(这里它表示为对面加起来为7的骰子),此图中的轴是父X,Y和Z方向

起点:

Starting point

我希望子对象有两种方法,我会调用RotateZRotateXRotateZRotateX应以90度为单位围绕父Z和X轴旋转子骰子。

RotateX:

Starting point RotateX

RotateZ:

Starting point 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)轮换开始,反复拨打RotateZRotateX(0, 0, 0)起点很有效,这似乎很有效。如果我调用RotateX然后调用RotateZ

,则会出现此问题

在初次RotateX调用后,它将如下所示,让孩子轮换(90, 0, 0)

Starting point RotateX

然后在RotateZ后得到所需的结果:

After RotateX enter image description here

但我最终得到了这个:

After RotateX After RotateXZ

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

1 个答案:

答案 0 :(得分:2)

看起来你需要的是真正棒极了的电话

RotateAround

这是Unity中最重要的一个。 RotateAround doco

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

巨大的提示......

视频游戏工程中无处不在的技术是:你使用标记“ - 意思只是一个空的游戏对象 - 你附加到对象或你附加对象。

通常,您暂时将对象附加到标记,以便移动它,然后再将其从标记中删除。

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

  1. 使controlRotator 成为controlObject的子项

  2. 在局部完全笔直:即,与父对象完全相同的方向,即对象<= p>

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

  4. 你的smallCube,记下它的父级。从那个父母那里拿走smallCube。

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

  6. ......现在你可以......

    1. 以您喜欢的方式旋转controlRotator!
    2. 您只需旋转controlRotator,而不是小方块。

      请注意,您现在正在执行您要求执行的操作,您正在使用controlObject 的轴旋转smallCube 。聪明吧?

      1. 最后,将smallCube重新放回到您在步骤4中保存的父级。
      2. 这正是你如何做到的。在实践中,这是非常普遍的,你将有一个扩展或功能来做它。

        请注意,可以根据需要动态制作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 .. );
        

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