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来完成了,注意矩阵乘法没有交换律。
浙公网安备 33010602011771号