剔除

剔除是一个过程,用于确定三维对象的哪些表面因对当前视点不可见而不应被渲染器所呈现。在 3D 空间中,三维对象“背面”的表面对视点不可见:
3D 对象的背面对视点不可见。

A.
视点

B.
3D 对象

C.
三维对象的背面

从本质上讲,不管三角形的大小、形状或位置如何,所有三角形都会始终呈现。剔除能确保 Flash Player 或 AIR 正确呈现 3D 对象。此外,为了减少呈现周期,有时您会希望渲染器跳过某些三角形。考虑在空间中旋转的立方体。在任何给定时间,您看到的立方体的面数不会超过三个面,这是因为不可见的面朝向立方体背面的其它方向。因为这些面不可见,所以渲染器不应绘制它们。如果不用剔除,Flash Player 或 AIR 就既要绘制正面也要绘制背面。

立方体的某些面对当前视点不可见

因此,Graphics.drawTriangles() 方法采用第四个参数来建立剔除值:

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

该剔除参数是来自 TriangleCulling 枚举类的值:TriangleCulling.NONETriangleCulling.POSITIVETriangleCulling.NEGATIVE。这些值与定义对象表面的三角形路径的方向有关。用于确定剔除的 ActionScript API 假设 3D 形状的所有外向三角形都是以同一路径方向绘制的。一旦三角形面经过旋转后,其路径方向也会改变。此时可以剔除(不呈现)该三角形。

因此,如果 TriangleCulling 值为 POSITIVE,则会移除正向路径方向(顺时针)的三角形。如果 TriangleCulling 值为 NEGATIVE,则会移除负向路径方向(逆时针)的三角形。对于立方体,朝前的表面具有正向路径方向,而朝后的表面具有负向路径方向:

“展开”的立方体,用以显示路径方向。当立方体“恢复原状”后,背面路径方向变为相反方向。

若要了解剔除的工作原理,请从前面 UV 映射中的示例开始,将 drawTriangles() 方法的剔除参数设置为 TriangleCulling.NEGATIVE

container.graphics.drawTriangles(vertices, indices, uvtData, TriangleCulling.NEGATIVE);

请注意,在对象旋转时,未呈现图像的“背面”。