3D旋转

该公式的证明在3D Math Primer for Graphics and Game Development 

chapter5 .

假设v绕向量N(当然经过原点)旋转θ度,得到v′

v′ = vR(N, θ). 求矩阵R

(注意:图示是左手坐标系,无论左右手坐标系,旋转角度总是逆时针方向为正,

N的方向是新的虚拟的Z轴方向,v1是X轴方向,)

把v分解成垂直和平行于N的v1(v垂直),v2(v平行)

同理v′分解成v1′和v2′

v2=v2′=(v·N)N

v1=v-v2

构造向量W,垂直于v1和v2,长度等于v1,

W=N×v1=N×v

这里把v1和W组成一个新的坐标系,v1是x轴,W是y轴,v1′是v1旋转θ之后得到。

v1′=cosθv1+  sinθW

=cosθ(v-(v·N)N)+  sinθ(N×v)

so,v'=v1'+v2=cosθ(v-(v·N)N)+  sinθ(N×v)+(v·N)N ...........................................................................式子3.0

=(1-cosθ)(v·N)N +cosθv+sinθ(N×v)

 令e1=(1,0,0),e2=(0,1,0),e3=(0,0,1),采用OpenGL 矩阵,这里都是列形式。

R的三列自然就是[R(e1),R(e2),R(e3)]

 N是(x,y,z),cosθ写为c,sinθ写为s,

对于e1,(v·N)N =(x^2,xy,xz),

sinθ(N×v)=(0,sz,-sy)

R(e1)=(1-c)(xx,xy,xz)+(c,0,0)+(0,sz,-sy)=(1-c)x*x+c,(1-c)xy+sz,(1-c)xz-sy.....................column one

for e2,(v·N)N=(xy,yy,yz),  sinθ(N×v)=(-sz,0,sx)

R(e2)=(1-c)(xy,yy,yz)+(0,c,0)+(-sz,0,sx)=(1-c)xy-sz,(1-c)yy+c,(1-c)yz+sx...................column two

for e3,(v·N)N=(xz,yz,zz),sinθ(N×v)=(sy,-sx,0)

R(e3)=(1-c)(xz,yz,zz)+(0,0,c)+(sy,-sx,0)=(1-c)xz+sy,(1-c)yz-sx,(1-c)zz+c......................column three

四元数和旋转

平面复数的回顾

每一个关于原点)的旋转都可以用一个复数来表示。这是因为,对于每一个点

所以移到了的位置,也就是旋转了

我们还可以把这个过程写成矩阵形式:

先介绍四元数的性质

四元数相乘

 四元数相乘表示旋转,是通过构造p=(v,0),实部为0,表示一个点,

关键点:相乘的形式是qpq*

...............................................................式子5.0

计算式子5.0利用4.29的形式

实部为0,因为

虚部=

 这个式子3.0完全一致,说明了一个四元数p,(v,0)实部为0,v表示为任意向量,顶点的时候,

qpq*表示v绕着q其中的单位向量n,旋转2θ的角度。

矩阵的表达形式:

围绕N(n1,n2,n3)旋转theta角度的OpenGL矩阵为

cosθ,==》c

sinθ===》s

(1-c)n1*n1 +c             (1-c)n1*n2-s*n3       (1-c)n1*n3+s*n2

(1-c)n1*n2+s*n3      (1-c)n2*n2+c           (1-c)n2*n3-s*n1

(1-c)n1*n3-s*n2       (1-c)*n2*n3+s*n1    (1-c)n3*n3 +c

 如果该旋转的四元数表达式为w+xi+yj+zk

那么cos(θ/2)=w, 

sin(θ/2)n1=x,

sin(θ/2)n2=y,

sin(θ/2)n3=z,

 代入计算,该矩阵为

原文地址:https://www.cnblogs.com/legion/p/6357525.html