D3D绕任意轴旋转推导过程及结论

来源:互联网 发布:windows平板手势 编辑:程序博客网 时间:2024/05/01 21:14

D3D绕任意轴旋转推导及结论

                                By czg1989  date2012-4-24

其实之前一直是记下公式的,今天看书的时候就推导了一下

首先假定任意旋转轴穿过原点,如果不穿过,通过平移就可以搞定。记单位向量n为旋转轴(单位向量方便)。旋转角度使用θ表示。

首先假定旋转矩阵为R(n,θ); v表示旋转前的向量,v’表示v绕轴n旋转θ角度后的向量,那么我们知道有v R(n,θ) = v’;下面就来考虑如果求R

思路:转化,将问题转化到2D坐标系下进行解决。即我们在垂直于n2D平面内解决。

步骤:首先我们将向量v进行分解:vllvT; 分别平行于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相同,wvT同时在垂直于n的平面内。WvTn旋转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,θ) = D3D绕任意轴旋转推导过程及结论,P’,Q’,R’带入即可。

具体参考D3D数学。

0 0