|
三、空间坐标系中一个点围绕任一轴的旋转
上一篇讨论3-D空间旋转的时候说到有一个高档的方法做3-D空间任意轴旋转,现在我们的知识储备已经足够理解这个方法了(Quake引擎使用的就是这个方法)。

如上所示,空间坐标系中的一个局部坐标系xyz中有一个向量a(2,5,3)和一个点p(8,4,2)现在我要让p点围绕a向量旋转60度,得到p‘点,该如何做呢?从目前掌握的旋转知识来看,我们有两个理论基础:
1)在一个坐标系中的一个点,如果要它围绕该坐标系中一个坐标轴旋转,就给它的坐标值乘相应的旋转矩阵,如
[cosA -sinA 0 ] [sinA cosA 0 ] [0 0 1 ]
等等。
2)我们已经学习了局部坐标系的理论了,知道空间中一个点在不同的坐标系中的坐标不同。利用这一点,我们可以很方便的让一个点或者向量在不同的坐标系之间转换。
我们联系这两个理论根据,得出我们的思路:
1构造另一个局部坐标系abc,使得a成为该坐标系的一个坐标轴。
2 把p的坐标变换到abc中,得到p‘,用旋转公式让p’围绕已经成为坐标轴的a旋转,得到p‘’。
3把p‘’再变换回坐标系xyz,得到p‘’‘,则p’‘’就是p围绕a旋转后的点。
下面我们逐步说明。

首先我们构造abc,我们有无数种方法构造,因为只要保证b、c之间以及他们和a之间都正交就可以了,但我们只要一个。根据上图,我们首先产生一个和a正交的b.这可以通过向量的叉乘来完成:我们取另一个向量v(显然,这个向量是不能和a共线的任何非零向量),让它和a决定一个平面x,然后让v叉乘a得到一个垂直于x的向量b,因为b垂直于x,而a在平面x上,因此b一定垂直于a,然后用a叉乘b得到c,最后单位化a、b、c,这样就得到了局部坐标系abc.
然后我们把p点变换到abc坐标系中,得到p‘,即p’就是p在abc中的坐标:

|a b c| * p’= |x y z| * p p’ = |a b c|^-1 * |x y z| * p |ax bx cx| |1 0 0| |px| p’ = |ay by cy| ^-1 * |0 1 0| * |py| |az bz cz| |0 0 1| |pz|
注意这里|a b c|^-1即矩阵|a b c|的逆矩阵,因为a、b、c是三个正交向量,并且是单位向量,因此|a b c|是一个正交矩阵,正交矩阵的转置和逆相等,这是它的一个特性,因此上面的公式就可以写成:
|ax ay az| |1 0 0| |px| p’ = |bx by bz| * |0 1 0| * |py| |cx cy cz| |0 0 1| |pz|
这个时候p‘就是p在abc坐标系下的坐标了。此时a已经是一个坐标轴了,我们可以用旋转矩阵来做。

p’’ = RotMatrix * p’
[1 0 0] |p’x| p’’ = [0 cos60 -sin60] * |p’y| [0 sin60 cos60] |p’z|

上一页 [1] [2] [3] [4] [5] [6] 下一页
 【责编:Kittoy】
|