stage3d编程-基础2(矩阵变换)

矩阵变换

  当我们在使用stage3d编程时,我们使用4x4矩阵来描述变换操作。实现思路是,3d空间中,无论是坐标还是向量,均使用四个数据存放,也就是1x4矩阵。然后将这个1x4矩阵乘以4x4矩阵得到最终的变换结果。假设一个点,变换后就是新的点;一个向量变换后就是新的向量。(纯属废话)

  之所以使用4x4矩阵,是因为这种特定的矩阵可以描述我们所需要的各种变换。可能也许有人为认为3x3矩阵更适合,但是3x3矩阵无法描述很多变换。例如:平移,透视投影。前面提到,无论是坐标还是向量,都采用四个数据存放,但是大家可能会觉得三个变量足以。为何需要第四个。这个在后面就会讲到。对于坐标,我们采用这种形式存放:(x, y, z, 1);对于向量,我们采用这种形式存放:(x, y, z, 0)。大家可以去翻看flash里面的vector3d类,大家就可以发现,vector3d构造函数里面其实是需要4个参数,x, y, z, w。

  1、平移操作

  要对某一个点u进行平移,那么值需要一个位移向量b与改点相加即可(前面提到向量只与长度和方向有关,那么平移操作,也就是这个点朝着某方向移动x距离)。在3d世界中,我们要平移某一个物体(异或模型),其实也就是将模型的每一个点都进行平移。但是如何通过矩阵来实现? 给出平移矩阵如下:至于推导过程,google百度吧。

       1  0  0  0

  T =     0  1  0  0

        0  0  1  0

      bx  by bz  1

  之前提到,点的存放形式为(x, y, z, 1)。那么将该点乘以平移矩阵T,得到的最终结果就为(x +bx, y + by, z + bz, 1)。(结果请参照矩阵乘法公式,也就是前一篇博客中提到的)。那么对向量进行平移呢?向量的存放形式为(x, y, z, 0),平移结果没变,这也就是为何点和向量的存放方式有一点小区别的原因了。

  2、缩放

  缩放是指改变一个物体的大小。大家其实可以再Matrix3D中发现关于缩放操作的api。缩放矩阵如下(推导过程同样不再讨论了):

      sx  0  0  0

  S =   0  sy   0  0

      0  0   sz   0

      0  0  0  1

  假设一个最小点(0, 0, 0)和一个最大点(4, 4, 4)定义一个正方体(注意:以后在讨论的时候,将不再写第四个点)。假设我们希望沿着x轴缩放0.5倍,沿着y轴缩放2倍,沿着z轴不变。那么我们的缩放矩阵则为(将缩放至填入上方矩阵即可):

      0.5  0  0  0

  S =   0    2  0  0

      0   0  1  0

      0   0  0  1

  我们将最小点以及最大点分别乘以缩放矩阵,结果则分别为(0, 0, 0)和(2, 8, 4),大家可以通过肉眼就可以观察出来,正方体安装我们希望的进行了缩放。

  3、旋转

  我们希望物体围绕一个穿过坐标系原点的轴进行旋转。给出如下矩阵,即可实现绕n = (x, y, z)轴进行∂弧度的旋转。其中c = cos∂、s = sin∂

      c+(1-c)x^2    (1-c)xy+sz    (1-c)xz-sy      0

  R =   (1-c)xy-sz     c+(1-c)y^2    (1-c)yz+sx       0

      (1-c)xz+sy    (1-c)yz-sx     c+(1-c)z^2         0

      0         0          0          1

 

  至于旋转的验证,大家可以自己去验证。 我们不在赘述了。

  4、组合变换

  上面提到,可以通过不同的矩阵来进行平移,旋转,缩放。那么我们在进行3d编程时,如果需要连续进行这些操作。我们就可以通过组合变换来做这个事情。例如:乘以平移矩阵,得到结果;将结果乘以缩放矩阵,得到结果;将结果乘以旋转矩阵,得到结果。这个操作就实现了模型先平移,后缩放,在旋转的操作了。在stage3d编程中,这个操作就可以通过分别乘以matrix3d来完成了,注意矩阵乘法没有交换律。

posted on 2013-09-10 19:55  boblchen  阅读(581)  评论(0)    收藏  举报