四元数-Quaterion
四元数(Quaterion)
本文遵循“署名-非商业用途-保持一致”创作公用协议
1843年,William Rowan Hamilton发明了四元数,但直到1985年才有一个叫Ken Shoemake的人将四元数引入计算机图形学处理领域。四元数在3D图形学中主要用于旋转,骨骼动画等。简单地来说,四元数描述了一次旋转:绕任意一个轴旋转一个角度。
四元数的定义形式:(w, x, y, z)。假如,绕轴向量v(_x,_y,_z)正向(右手旋转法则)旋转角度p,则对应得四元数q为:
q = (cos(p/2), sin(p/2) * _x, sin(p/2) * _y, sin(p/2) * _z)
用四元数来表示旋转,不如用欧拉角(偏航/yaw,俯仰/pitch,横滚/ roll)来表示直接,但是用欧拉角来处理旋转有个不可回避的问题:万向节死锁。我们可以通过将欧拉角转换到四元数来避免这个问题,一次将3个欧拉角变换到独立的3个四元数,然后将这3个四元数相乘就可以得到最终的旋转四元数。
Qx = (cos(yaw/2), sin(yaw/2), 0, 0)
Qy = (cos(pitch/2), 0, sin(pitch/2), 0)
Qz = (cos(roll/2), 0, 0, sin(roll/2)
Q = Qx * Qy * Qz
在DirectX中提供了从欧拉角到四元数,从四元数到矩阵(Direct3D用旋转来实现旋转)的变换函数。下面参看:/Microsoft DirectX SDK/Include/d3dx9math.h的函数声明
从四元数变换到轴与旋转角
// Compute a quaternin's axis and angle of rotation. Expects unit quaternions.
void WINAPI D3DXQuaternionToAxisAngle
( CONST D3DXQUATERNION *pQ, D3DXVECTOR3 *pAxis, FLOAT *pAngle );
从旋转矩阵构造一个四元数
// Build a quaternion from a rotation matrix.
D3DXQUATERNION* WINAPI D3DXQuaternionRotationMatrix
( D3DXQUATERNION *pOut, CONST D3DXMATRIX *pM);
从一个轴与旋转角构造一个四元数
// Rotation about arbitrary axis.
D3DXQUATERNION* WINAPI D3DXQuaternionRotationAxis
( D3DXQUATERNION *pOut, CONST D3DXVECTOR3 *pV, FLOAT Angle );
从欧拉角构造一个四元数
// Yaw around the Y axis, a pitch around the X axis,
// and a roll around the Z axis.
D3DXQUATERNION* WINAPI D3DXQuaternionRotationYawPitchRoll
( D3DXQUATERNION *pOut, FLOAT Yaw, FLOAT Pitch, FLOAT Roll );
下面我们来看看如何使用:若某物体要绕Y轴旋转fYaw,绕X轴旋转fPitch,绕Z轴旋转fRoll,那么对应的旋转矩阵matRot可以这么计算:




有关四元数更详细的数学计算,转换过程可以参考下面的链接:
http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/index.htm
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架