通过三角形获得 3D 效果

在 ActionScript 中,可以使用 Graphics.drawTriangles() 方法执行位图转换,因为 3D 模型是通过空间中的一组三角形来表示的。(但是,Flash Player 和 AIR 不支持深度缓冲,因此显示对象在本质上仍然是平面的,即 2D。这一点在了解 Flash Player 和 AIR 运行时的 3D 功能中进行了说明。)Graphics.drawTriangles() 方法通过一组坐标来绘制三角形路径,类似于 Graphics.drawPath() 方法。

若要熟悉 Graphics.drawPath() 方法,请参阅绘制路径

Graphics.drawTriangles() 方法使用 Vector 对象。<Number>,用于指定三角形路径的点位置:

drawTriangles(vertices:Vector.<Number>, indices:Vector.<int> = null, uvtData:Vector.<Number> = null, culling:String = "none"):void

drawTriangles() 的第一个参数是唯一的必需参数:vertices 参数。该参数是由定义坐标的数字组成的矢量,通过该矢量即可绘制三角形。每三组坐标(六个数字)表示一个三角形路径。如果没有 indices 参数,矢量的长度应始终为六的倍数,因为每个三角形都需要三对坐标(三组 x/y 值对)。例如:

graphics.beginFill(0xFF8000); 
graphics.drawTriangles( 
    Vector.<Number>([ 
        10,10,  100,10,  10,100, 
        110,10, 110,100, 20,100]));

这些三角形不共享任何点,但是如果有共享点,就可以使用第二个 drawTriangles() 参数 indices 来对多个三角形重复使用 vertices 矢量中的值。

使用 indices 参数时,请注意,indices 值是点索引,而不是直接与 vertices 数组元素相关的索引。也就是说,vertices 矢量中由 indices 定义的索引实际上是除以 2 后的实际索引。例如,对于 vertices 矢量的第三个点,即使该点的第一个数值开始于矢量索引 4,也使用 indices 值 2。

例如,使用 indices 参数合并两个三角形使二者共享对边。

graphics.beginFill(0xFF8000); 
graphics.drawTriangles( 
    Vector.<Number>([10,10, 100,10, 10,100, 100,100]), 
    Vector.<int>([0,1,2, 1,3,2]));

请注意,尽管正方形现在是通过两个三角形绘制的,但只在 vertices 矢量中指定四个点。通过使用 indices,两个三角形共享的两点将由每个三角形重复使用。这样可以将顶点总数从 6(12 个数字)减少为 4(8 个数字):

使用 vertices 参数通过两个三角形绘制的正方形

对于较大的三角形网格,这种方法非常有用,因为这种情况下大多数点由多个三角形共享。

所有填充方式都可应用于三角形。填充应用于三角形网格的方式与应用于其它形状的方式是相同的。