D3D绕任意轴旋转推导及结论
其实之前一直是记下公式的,今天看书的时候就推导了一下
首先假定任意旋转轴穿过原点,如果不穿过,通过平移就可以搞定。记单位向量n为旋转轴(单位向量方便)。旋转角度使用θ表示。
首先假定旋转矩阵为R(n,θ); v表示旋转前的向量,v’表示v绕轴n旋转θ角度后的向量,那么我们知道有vR(n,θ) =v’;下面就来考虑如果求R。
思路:转化,将问题转化到2D坐标系下进行解决。即我们在垂直于n的2D平面内解决。
步骤:首先我们将向量v进行分解:vll和vT;分别平行于n和垂直于n。则根据向量分解我们可知vll+ vT= v;这样分解之后再考虑这个问题就相对简单了,因为对于平行于n的部分,旋转对其不会产生影响,所以只需要考虑垂直部分就ok了。即将垂直部分旋转到vT’,那么
v’ = vll+ vT’;如下图(盗用D3D数学书上的图)
在这个图中,我们首先应该知道以下几个量的含义:
(1)
(2)
(3)
又知道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, -nxnycosθ,-nxnzcosθ) + (0,nzsinθ,-nysinθ) +
(nx2, nxny, nxnz)
= (cosθ-cosθnx2+ nx2, -nxnycosθ+nzsinθ+nxny, -nxnzcosθ-nysinθ+nxnz)
= (nx2(1-cosθ)+cosθ,nxny(1-cosθ)+ nzsinθ,nxnz(1-cosθ)- nysinθ);
P’ =(nx2(1-cosθ)+cosθ,nxny(1-cosθ)+ nzsinθ,nxnz(1-cosθ)- nysinθ);
同理令Q=(0, 1, 0), R=(0, 0, 1);Q’和R’分别是变换后的基向量
则有
Q’=(nxny(1-cosθ)-nzsinθ,ny2(1-cosθ)+cosθ,nynz(1-cosθ)+nxsinθ);
R’= (nxnz(1-cosθ)+nysinθ,nynz(1-cosθ)-nxsinθ,nz2(1-cosθ)+cosθ);
由此可以我们需要构造的绕任意轴旋转的矩阵就是有三个变换后的基向量组成,如下:
R(n,θ) =
具体参考D3D数学。