随笔-0  评论-0  文章-40  trackbacks-0

在编程的时候,直接生成一个旋转矩阵,然后作为世界变换矩阵传递给Dx即可。以针对Y轴旋转为例,传递的矩阵如下:

Rads是要旋转的角度,则对应的旋转矩阵R为:

cos(Rads),  0,  -sin(Rads),  0

0,  1,  0,  0

sin(Rads),  0,  cos(Rads),  0

0,  0,  0,  1

根据矩阵乘法规则,可以看出是由被旋转向量的每一个分量来计算出旋转后向量的每一个分量,旋转矩阵中每一列的各项数值,对应了旋转后向量中每一个分量的构成系数,R01为X分量的构成系数,R02为Y分量的构成系数,R03为Z分量的构成系数。我好奇这些系数是如何计算得出的,因此做了一点计算,结果记在下面,有不对的地方请各位尽量拍砖不用留情 -__-b。

计算以针对Y轴旋转为例,其他两个坐标轴类似,再其他的组合3个轴的基本旋转即可。如图:

DirectX世界坐标变换(旋转部分) - kakashir - 卡卡西.R的 Home Blog
将点P选装到点Q所在的位置,远点为O(图上漏了),角POX = b, 角QOP = a, 角QOX = a + b ,向量OP={Px, Py, Pz},向量OQ = {Qx, Qy, Qz},为简化问题处理,这里令OP = 1,可以看到对于旋转来说,P点和Q点其实位于单位圆上。
我们先来求P点和Q点的分量坐标值,根据三角函数,有:
Px = cosb, Py = 0, pz  = sinb
Qx = cos(a + b), Qy = 0, Qz = sin(a + b)
注意,由于是针对Y轴旋转,所以y分量是多少都无所谓,不影响计算。这里为了简化就取值为0。

设: 旋转矩阵R为3阶矩阵,如下: 
M,  0,  W
T,  1,   Z
N,  0,   S
做P x R = Q 根据矩阵乘法规则列方程式有:
Qx = PxM + PyT + PzN ;
Qy = Px0 + 1Py + Pz0
Qz = PxW + PyZ  + PzS; 
将之前计算出的坐标分量带入上述方程中,首先可以知道Qy = Py,因为是围绕Y轴旋转,因此该分量始终不变。

Qx = PxM + PyT + PzN 展开:
cos(a + b) = Mcos(b) + N sin(b) --->  cos(a)cos(b) - sin(a)sin(b) = Mcos(b) + Nsin(b) [颜色相等的式子令其相等]
可得: M = cos(a), N = -sina(a)
 
Qz = PxW + PyZ  + PzS; 展开:  
sin(a + b) = Wcos(b) + Ssin(b) ---> sin(a)cos(b) + cos(a)sin(b) = Wcos(b) + Ssin(b)
可得: W = sin(a), S = cos(a)

最后带回到R中,得:
M,  0,  W             cos(a) ,  0,   sin(a)
T,  1,   Z     =       0,           1,   0,
N,  0,   S              -sina(a), 0,   cos(a)  
和书上的标准形式比起来,部分符号不同,标准形式如下:

cos(Rads),  0,  -sin(Rads),  0

0,  1,  0,  0

sin(Rads),  0,  cos(Rads),  0

0,  0,  0,  1

这是由于我们是从P向Q旋转,如果改为由Q向P旋转,并令角QOX = a, 令角QOP = b,就可推得和标准形式完全一样的旋转矩阵了。

 
posted on 2011-08-01 17:35 无毁湖光 阅读(615) 评论(0)  编辑 收藏 引用