使用 Matrix3D 对象重新排序显示

如前所述,显示列表中显示对象的层叠顺序确定了对象的显示顺序,这些对象的相对 z 轴值对显示顺序没有影响。如果您的动画将显示对象的属性转换为一种与显示列表中的顺序不同的顺序,则观察者看到的显示对象层叠顺序与 z 轴层叠顺序不一致。因此,在视觉上应当远离观察者的对象可能反而会靠近观察者。

为确保 3D 显示对象的层叠顺序对应于对象的相对深度,请使用如下方法:

  1. 使用 Transform 对象的 getRelativeMatrix3D() 方法获取 3D 子显示对象的相对 z 轴值。

  2. 使用 removeChild() 方法从显示列表中删除对象。

  3. 根据显示对象的相对 z 轴值对显示对象进行排序。

  4. 使用 addChild() 方法以相反顺序将子对象添加到显示列表中。

这种重新排序方法可确保您的对象按照各自的相对 z 轴值进行显示。

下面的代码将 3D 框的六面设置为正确的显示顺序。这段代码对经过旋转的框的各面进行重新排序:

public var faces:Array; . . . 
 
public function ReorderChildren() 
{     
    for(var ind:uint = 0; ind < 6; ind++) 
    { 
        faces[ind].z = faces[ind].child.transform.getRelativeMatrix3D(root).position.z; 
        this.removeChild(faces[ind].child); 
    } 
    faces.sortOn("z", Array.NUMERIC | Array.DESCENDING); 
    for (ind = 0; ind < 6; ind++) 
    { 
        this.addChild(faces[ind].child); 
    } 
}

若要获取此范例的应用程序文件,请参阅 www.adobe.com/go/learn_programmingAS3samples_flash_cn。在 Samples/ReorderByZ 文件夹中可以找到这些应用程序文件。