转载请注明出处:http://fdream.net,作者:Fdream
在Flash/ActionScript中,只提供了仿射变换功能。仿射变换包括平移(x 和 y 重新定位)、旋转、缩放和倾斜,在进行这些形变时,平行线仍然会保持平行,因此没办法做到任意形变。
实现位图或者MC(MovieClip)的任意形变的一种方式就是把它们分割成三角行,然后对三角形进行相应的仿射变换。比较流行的PV3D(papervision3d)就是采用的这种方式。
一切从简单开始,我们先看看一个点在平面上的几个简单的基本变换。一般来说,我们都将平面上的一个点表示为一个1×2的矩阵,我们可以通过将改点乘以一个2×2的矩阵来对该点进行变换。以下是一些简单的示例:
由于平移变换不是线性的,因此不能表示为2×2的矩阵,通过与一个1×2的矩阵相加即可得到相应的平移变换位置。上图中的取镜像变换从某种意义上也可以看做是一种平移变换:
通过上面的一些基本变换方式,我们可以得到一些比较复杂的变换:
上面的这中变换就叫做仿射变换。对于这种仿射变换,它需要两个矩阵进行变换(一个2×2的矩阵用于旋转,一个1×2的矩阵用于平移),为了方便,我们有一种替换方案,将整个变换存储于一个3×3的矩阵中。另外,还需要将点坐标由1×2扩充为1×3,组后一位通常补1,如以前的(2,1)就变为[2,1,1]。下面的矩阵变换就是上图的复杂变换:
其变换矩阵的意义如下:
在Flash/ActionScript中,略有不同的是,Macromedia(现在应该叫Adobe了)把平移部分放到了第三列中,即是这样的:
请务必记住这一点不同!通过这个3×3的矩阵,我们就可以进行任何仿射变换,但记住一点:经过任何反射变换,原来的直线还是直线,平行的直线依然还会平行!至于怎么实现“不平行”的变换,我们将在后面继续讲解。
参考文档:
- MSDN:变换的矩阵表示形式
- Flash帮助文档:flash.geom.Matrix