|
在理解了基本思路之后,我们来研究一下变换吧!我们就按上图将红色轴变到z轴上,开始吧!
首先我们假设红轴向量是一个单位向量,因为这样在一会求sin和cos时可以简化计算,在实际编程时可以先将轴向量标准化。然后我准备分两步把红色轴变换到z轴上去:
1)将红色轴变换到yoz平面上
2) 将yoz平面上的红色轴变到z轴上
至于这两个变换的方法……我实在没有别的办法了,只能够旋转了,你觉得呢?先把它旋转到yoz平面上。
我们设轴向量旋转到yoz面的变换为(绕z轴旋转):
[cosA sinA 0 0] [-sinA cosA 0 0] [0 0 1 0] [0 0 0 1]

接着我们要求出cosA和sinA,由上图,沿着z轴方向看去,我们看到旋转轴向量到yoz面在xoy面就是将轴的投影向量旋转角度A到y轴上,现在我不知道角度A,但是我们可以利用它直接求出cosA和sinA,因为我们知道关系:
cosA = y0 / 轴向量在xoy面的投影长
sinA = x0 / 轴向量在xoy面的投影长
我们设轴向量的投影长为lr = sqrt(x0^2 + y0^2),呵呵,现在,我们第一步的变换矩阵就出来了:
[y0/lr x0/lr 0 0] [-x0/lr y0/lr 0 0] [0 0 1 0] [0 0 0 1]
同时我们得到逆变换矩阵:
[y0/lr -x0/lr 0 0] [x0/lr y0/lr 0 0] [0 0 1 0] [0 0 0 1]
然后我们进行第二步:将yoz平面上的红色轴变到z轴上。我们的变换矩阵是(绕x轴旋转):
[1 0 0 0] [0 cosB sinB 0] [0 -sinB cosB 0] [0 0 0 1]

由图,这是经第一次旋转后的轴向量在yoz面中的情形,此次我们要求出上面变换中的cosB和sinB,我们仍不知道角度B,但我们还是可以利用它求cosB和sinB.由于第一次旋转是围绕z轴,所以轴向量的z分量没有变,还是z0.此外,轴向量现在的y分量和原来不同了,我们再看一下第一次变换那张图,可以发现轴向量在旋转到yoz面后,y分量变成了刚才轴向量在xoy面上的投影长lr了。Yes!我想是时候写出cosB和sinB了:
cosB = z0 / 轴向量的长
sinB = lr / 轴向量的长
还记得我们刚才假设轴向量是一个单位向量吗?所以
cosB = z0
sinB = lr
至此我们的第二个变换就出来了:
[1 0 0 0] [0 z0 lr 0] [0 -lr z0 0] [0 0 0 1]
相应逆变换矩阵:
[1 0 0 0] [0 z0 -lr 0] [0 lr z0 0] [0 0 0 1]
现在总结一下,我们对于空间任意点围绕某个任意方向且过原点的轴旋转的变换矩阵就是:
[y0/lr x0/lr 0 0] [1 0 0 0] [cosA sinA 0 0] [1 0 0 0] [y0/lr -x0/lr 0 0] [-x0/lr y0/lr 0 0] [0 z0 lr 0] [-sinA cosA 0 0] [0 z0 -lr 0] [x0/lr y0/lr 0 0] M = [0 0 1 0] x [0 -lr z0 0] x [0 0 1 0] x [0 lr z0 0] x [0 0 1 0] [0 0 0 1] [0 0 0 1] [0 0 0 1] [0 0 0 1] [0 0 0 1]
上面的变换是“旋转变换-旋转变换-旋转变换-旋转变换-旋转变换”的变换组。当我们需要让空间中的某个位置向量围绕一个轴旋转角度A的时候,就可以用这个向量相应的矩阵乘上这个M,比如
[x y 0 0] [x' y' z' -] [0 1 0 0] [- - - -] [0 0 1 0] x M = [- - - -] [0 0 0 1] [- - - -]
当然,M中矩阵相应的元素是根据轴向量得到的。
以上的变换矩阵是通过把轴向量变到z轴上得到的,而且是先旋转到yoz面上,然后再旋转到z轴上。我们也可以不这样做,而是先把轴向量旋转到xoz面上,然后再旋转到z轴上。此外,我们还可以把轴向量变到x或y轴上,这一点我们可以自己决定。虽然变换不同,但推导的道理是相同的,都是这种“其他变换-实际旋转变换-其他变换”的渗透形式。
上一页 [1] [2] [3] [4] [5] [6] [7] [8] 下一页
 【责编:Kittoy】
|