Search K
Appearance
Welcome
Appearance
四元数是定义在四维空间中的
q=w+xi+yj+zk=cos2θ+sin2θ(uxi+uyj+uzk)=(w,v)=(cos2θ,usin2θ)
其中:
i2+j2+k2=ijk=−1
ij=k,jk=i,ki=j,ji=−k,kj=−i,ik=−j
u 为旋转轴,θ 为旋转角度
其中 i,j,k 代表三维坐标轴,而 w 代表第四个轴垂直于 i,j,k
Rx(θ)=⎣⎡1000cosθsinθ0−sinθcosθ⎦⎤
Ry(θ)=⎣⎡cosθ0−sinθ010sinθ0cosθ⎦⎤
Rz(θ)=⎣⎡cosθsinθ0−sinθcosθ0001⎦⎤
欧拉角通过将旋转分解为绕三个互相垂直的坐标轴的连续旋转来表示方向。常见的顺序包括:
ZYX顺序(绕Z轴→Y轴→X轴旋转,即偏航-俯仰-滚转,Yaw-Pitch-Roll)。 ZYZ顺序(绕Z轴→Y轴→Z轴旋转,常用于经典力学)。
unity欧拉角顺序默认是 Z→X→Y, Unreal欧拉角顺序默认是 Z→Y→X, Godot欧拉角顺序默认是 Y→X→Z, Blender欧拉角顺序默认是 Z→Y→X,Three.js 欧拉角顺序默认是 X→Y→Z
单位四元数(只有单位四元数才能表示旋转)对其进行旋转 q^=qXq−1=qXq∗共轭四元数 q∗=w−(xi+yj,zk)=(w,−v) 对于非单位四元数如果要表示旋转要先将其归一化 q=∣∣q∣∣q, ∣∣q∣∣=√w2+x2+y2+z2 对于单位四元数来说其逆等于共轭 q−1=q∗ 四元数的连续旋转 (q3q2q1)X(q1−1q2−1q3−1)
欧拉角是针对于物体初始姿态的变换,无论 (eulerx,eulery,eulerz) 调整的顺序如何。其执行的变换都是针对于初始姿态进行的,而且是先 X 轴 Y 轴 Z 轴,因此当 eulery 为90度时,执行的是针对于初始姿态 0→90→0 的变换,因此此时调整 eulerx 时其执行的是针对于初始姿态 eulerx→90→0, 变换执行的顺序与用户调整欧拉角的顺序无关。那么物体在 (0,90,0) 的状态下,自身的 z 轴和物体初始姿态的 x 轴重合,此时调整两者是等价的 (45,90,0) 和 (0,90,45) 是一样的。实质是前面的轴可以带动后面的轴转动,而后面的轴无法带动前面的轴转动。
矩阵用于表示旋转的前提是该矩阵必须是正交矩阵否则就会发生缩放,而由于矩阵乘法和浮点运算导致累计误差,那么矩阵很难维持正交化,因此不直接使用矩阵进行旋转。由于矩阵的非欧几里得性质直接对矩阵元素进行线性插值可能破坏矩阵的重要特性(如正交性、正定性、秩等)
单位四元数 q=(w,x,y,z)
R=⎣⎡1−2y2−2z22xy+2wz2xz−2wy2xy−2wz1−2x2−2z22yz+2wx2xz+2wy2yz−2wx1−2x2−2y2⎦⎤
NLerp(q0,q1,t)=(1−t)q0+tq1
qnlerp=∣∣Lerp(q0,q1,t)∣∣Lerp(q0,q1,t)
Slerp(q0,q1,t)=sinθsin((1−t)θ)q0+sinθsin(tθ)q1