代码之家  ›  专栏  ›  技术社区  ›  Ruzihm aks786

如何在不使用transform.rotate的情况下,在局部轴或世界轴上旋转具有全局四元数的四元数?

  •  1
  • Ruzihm aks786  · 技术社区  · 6 年前

    Transform.Rotate 有一个非常有用的界面,用于选择是否应相对于世界轴或局部轴进行旋转。

    在幕后,它正在对变换的 rotation A Quaternion ,和另一个 四元数 . 这个数学的确切性质会根据你选择的地方或世界旗帜而改变。

    我怎么能不指定第一个 四元数 转换为 旋转 (浪费记忆和/或时间)只是为了用它做一些数学?

    假设我的第一个 四元数 Quaternion q1 = Quaternion.Euler(0f,0f,90f); 第二个是 Quaternion q2 = Quaternion.Euler(90f,0f,0f) .

    沿其局部轴将第二个应用于第一个,将产生一个旋转,使其右侧朝下旋转,正面朝右旋转。

    沿原始轴将第二个轴应用到第一个轴将产生一个旋转,该旋转将使其背面朝下,顶部朝右旋转。

    1 回复  |  直到 6 年前
        1
  •  4
  •   Ruzihm aks786    6 年前

    使用 Quaternion operator * .

    在Unity中,当您将两个四元数相乘时,它将第二个四元数(以全局轴表示)沿第一个四元数之后生成的局部轴应用于第一个四元数。 Quaternion )

    所以, 如果你想做相当于 Rotate(q2, Space.Self) ,在哪里 q1 转换是原始的吗? rotation q3 转换是新的吗 旋转 ,你想要 Quaternion q3 = q1 * q2 .


    如果你想申请怎么办 q2 Q1 沿着之前的轴线 Q1 应用?事实证明,这相当于 Q1 沿局部轴线 Q2 .

    例如,应用 Q2 沿着全球轴 Q1 将其背面朝下旋转,顶部朝右旋转。考虑到这一点 Q1 沿局部轴线 p2 同时将其背面朝下旋转,顶部朝右旋转。它们产生了相同的方向!

    那这是什么意思? 如果你想申请 Q2 Q1 沿着之前的轴线 Q1 应用,然后执行 Quaternion q3 = q2 * q1 .

    这相当于做 Rotate(q2, Space.World) 哪里 Q1 转换是原始的吗? 旋转 Q3 是新的吗 旋转 .


    不像 Rotate ,可以使用此运算符相对于父对象的轴旋转对象!如果你愿意的话 transform.localRotation = q2 * transform.localRotation ,将相对于父对象的轴旋转对象。