rotation - 相对于世界的四元数旋转

标签 rotation quaternions

Unity3D提供了以下方法:

Rotate(eulerAngles: Vector3, relativeTo: Space = Space.Self);

例如,这将围绕其局部 X 轴旋转对象:

transform.Rotate(Vector3(50,0,0) * Time.deltaTime, Space.Local);

如果我首先围绕它的局部 y 轴旋转 90 度(统一向上),然后相对于世界围绕 X 轴旋转它,它基本上会围绕局部 Z 轴旋转,即:

//setup
transform.Rotate(Vector3(0, 90, 0));
//on update
transform.Rotate(Vector3(50,0,0) * Time.deltaTime, Space.World);

在我自己的实现中,使用四元数实现了局部旋转,这很容易。

//rotate around local axis
currentRotation *= rotateQuat;

我将如何使用四元数实现相对于世界的行为?

最佳答案

在 Unity 中可能有一种无需显式计算即可完成的方法,但是...

当使用四元数进行旋转时,考虑绕特定轴(单位向量 u)的旋转(角度 a)比使用欧拉角更有意义;四元数本身(实际上是一个单位四元数,或“versor”)可以表示为一个 4 向量 (w, x, y, z),其中 w = cos(0.5*a) 和 (x, y, z) = (u_x, u_y, u_z) * sin(0.5*a) (意思是 a = 2 * arccos(w) 和 u = (x, y, z)/sin(0.5*a) = (x, y, z)/罪恶(arccos(w)))。据此,“同一性”四元数(即无旋转)为 (1, 0, 0, 0),因为 cos(0) = 1 和 sin(0) = 0,并且非常有用,a 的逆/共轭四元数 (w, -x, -y, -z),表示相反的旋转(x、y 和 z 在技术上是虚数分量;您也可以将四元数表示为 w+x*i+y*j+z* k).要使用四元数对 3D 空间中的点 p 应用旋转,请使用 p' = (w, x, y, z)*(0, p_x, p_y, p_z)*(w, -x, -y, - z),其中执行乘法,如下所示:http://en.wikipedia.org/wiki/Quaternion#Ordered_list_form

因此,如果您知道新旋转的角度和旋转轴(在世界空间中)是什么,那么在给定由四元数表示的现有旋转的情况下,使用四元数执行世界相对旋转相对简单,因为计算的主要补充是将现有四元数的共轭应用于新四元数的旋转轴,以便在局部/对象空间中表示该轴;然后你只需为新的旋转创建四元数并将其应用于现有的四元数(我不确定 Unity 如何排列四元数组合,但通常如果你应用 q1 后跟 q2 组合的四元数将是 q2*q1 [四元数乘法是非交换],所以它应该类似于 resultQuat = newQuat * prevQuat;).

关于rotation - 相对于世界的四元数旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20802599/

相关文章:

c++ - 使用 GLM 围绕点进行 OpenGL 旋转

javascript - THREE.js 旋转复制不起作用

c - 卡尔曼滤波器 - 四元数 - 角度传感器

c++ - 动画围绕特定轴的 qt3d 旋转

java - 按给定四元数旋转单位 vector

c++ - OpenGL 3.3 - 2 个三角形的不同旋转

jquery - 将图像旋转 360 度

ios - 在 Apple 的增强现实示例代码 "pARk"中使用四元数

iphone - 无法在 iPad 上正确旋转翻译后的 UIView

android - 如何检测屏幕旋转?