如何在不使用transform.Rotate的情况下在其本地轴或世界轴上旋转带有第二个四元数的四元数?

问题描述 投票:0回答:1

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

在幕后,它对变换的

rotation
、一个
Quaternion
和另一个
Quaternion
进行一些数学计算。这个数学的确切性质会根据您选择当地国旗还是世界国旗而变化。

如何在不将第一个

Quaternion
分配给 Transform 的
rotation
(浪费内存和/或时间)的情况下进行此类数学运算?

假设我的第一个

Quaternion
Quaternion q1 = Quaternion.Euler(0f,0f,90f);
,第二个是
Quaternion q2 = Quaternion.Euler(90f,0f,0f)

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

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

c# unity-game-engine 3d quaternions
1个回答
12
投票

使用
Quaternion operator *

在 Unity 中,当您将两个四元数相乘时,它会将第二个四元数(以全局轴表示)应用于第一个四元数(沿着第一个

Quaternion
之后生成的局部轴)。

因此,如果您想做

Rotate(q2, Space.Self)
的等效操作,其中
q1
是变换的原始
rotation
q3
是变换的新
rotation
,您需要
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
是变换的原始
rotation
q3
是新的
rotation


Rotate
不同,您可以使用此运算符相对于其父对象的轴旋转对象!如果您这样做
transform.localRotation = q2 * transform.localRotation
,您将相对于父对象的轴旋转对象。

© www.soinside.com 2019 - 2024. All rights reserved.