绕任意轴旋转的矩阵推导 (D3D 左手坐标系)
首先假定任意旋转轴穿过原点,如果不穿过,通过平移就可以搞定。记单位向量n为旋转轴(单位向量方便)。旋转角度使用θ表示。
首先假定旋转矩阵为R(n,θ); v表示旋转前的向量,v’表示v绕轴n旋转θ角度后的向量,那么我们知道有v R(n,θ) = v’;下面就来考虑如果求R。
思路:转化,将问题转化到2D坐标系下进行解决。即我们在垂直于n的2D平面内解决。
步骤:首先我们将向量v进行分解:vll和vT; 分别平行于n和垂直于n。则根据向量分解我们可知vll+ vT = v; 这样分解之后再考虑这个问题就相对简单了,因为对于平行于n的部分,旋转对其不会产生影响,所以只需要考虑垂直部分就ok了。即将垂直部分旋转到vT’,那么
v’ = vll + vT’; 如下图(盗用D3D数学书上的图)
在这个图中,我们首先应该知道以下几个量的含义:
(1) vll : v在向量n上的投影。vll = n(v·n);
(2) vT: v在垂直于n的平面上的投影。vT = v - vll;
(3) w是一个临时向量,w同时垂直于vll 和vT; 模和vT相同,w和vT同时在垂直于n的平面内。W是vT绕n旋转90度的结果。可以通过n X vT得到。
又知道vT’ = cosθvT + sinθw;
带入已知量可知:
vll = n(v·n);
vT = v - vll = v - n(v·n);
w = n X vT = n X (v - vll) = n X v – n X vll = n X v – 0 = n X v;
则vT’ = cosθ(v - n(v·n))+ sinθ(n X v);
带入v’ = vll + vT’ = (v-(v·n)n) cosθ + (n X v) sinθ + n(v·n);
其中我们知道三个基向量可以设定为(1,0,0),(0,1,0),(0,0,1);
令P = (1,0,0);,P’为转换后的基向量
则有P’ = (P-(P·n)n) cosθ + (n X P) sinθ + n(P·n)
=( (1,0,0) –( (1,0,0)·(nx, ny, nz))(nx, ny, nz)) cosθ + ((nx, ny, nz)X(1,0,0)) sinθ+(nx, ny, nz) ((1,0,0)·(nx, ny, nz))
=((1,0,0)- nx(nx, ny, nz))cosθ + (0, nz, -ny) sinθ + nx(nx, ny, nz)
= (1- nx2, -nxny, -nxnz) cosθ + (0, nz, -ny) sinθ + (nx2, nxny, nxnz)
= (cosθ - cosθnx2, -nxny cosθ, -nxnz cosθ) + (0, nz sinθ, -nysinθ) +
(nx2, nxny, nxnz)
= (cosθ - cosθnx2 + nx2, -nxny cosθ+ nz sinθ+ nxny, -nxnz cosθ-ny sinθ+ nxnz)
= (nx2(1-cosθ)+ cosθ, nxny(1- cosθ)+ nz sinθ, nxnz(1- cosθ)- ny sinθ);
P’ = (nx2(1-cosθ)+ cosθ, nxny(1- cosθ)+ nz sinθ, nxnz(1- cosθ)- ny sinθ);
同理令Q=(0, 1, 0), R=(0, 0, 1);Q’和R’分别是变换后的基向量
则有
Q’= (nxny(1- cosθ)-nz sinθ,ny2(1-cosθ)+ cosθ, nynz(1- cosθ)+nx sinθ);
R’= (nxnz(1- cosθ)+ny sinθ, nynz(1- cosθ)-nx sinθ,nz2(1-cosθ)+ cosθ);
由此可以我们需要构造的绕任意轴旋转的矩阵就是有三个变换后的基向量组成,如下:
R(n,θ) = ,将P’,Q’,R’带入即可。
绕任意轴旋转坐标转换公式
一、2d旋转公式:
原点P(x,y), 旋转角θ,旋转后点PO(xO,yO)
二、3d旋转公式:
原点P=(x,y,z);
在3D直角坐标系绕3个坐标轴的旋转角度R=(Rx,Ry,Rz),
角度范围(-π≤R≥π),单位:弧度;
绕实际旋转轴的转动角度θ
旋转轴向量n:
P点旋转后点PO(xO,yO,zO)坐标
附注:
利用“3D中绕任意轴的旋转公式” 推导(推导略)