Actionscript 3 AS3-使用Matrix3D对象对显示进行重新排序

Actionscript 3 AS3-使用Matrix3D对象对显示进行重新排序,actionscript-3,animation,3d,z-order,Actionscript 3,Animation,3d,Z Order,我正在处理大约20个在3D空间中移动的对象。Adobe建议“使用Matrix3D对象重新排序显示”: 使用Transform对象的GetRelativeMatrix x3d()方法获取子3D显示对象的相对z轴 使用removeChild()方法从显示列表中删除对象 根据相对z轴值对显示对象进行排序 使用addChild()方法将子项按相反顺序添加回显示列表 太好了。如果物体不移动,那没关系。但是,如果有动画发生,并且一个对象在z空间中位于另一个对象的前面,该怎么办?对象根据显示列表中的位置显示,

我正在处理大约20个在3D空间中移动的对象。Adobe建议“使用Matrix3D对象重新排序显示”:

  • 使用Transform对象的GetRelativeMatrix x3d()方法获取子3D显示对象的相对z轴

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

  • 根据相对z轴值对显示对象进行排序

  • 使用addChild()方法将子项按相反顺序添加回显示列表


  • 太好了。如果物体不移动,那没关系。但是,如果有动画发生,并且一个对象在z空间中位于另一个对象的前面,该怎么办?对象根据显示列表中的位置显示,而不是按照其z顺序显示。如何在设置动画时使对象遵守z顺序(如果对象A的z值小于对象B,则使对象A显示在对象B的前面)?显然,在动画制作过程中无法清除显示列表。

    这实际上与adobe的文档所说的相同。。。它对移动的物体非常有效

    最简单的方法是,让您有一些代码参考,并且假设您的所有3d对象都在一个数组中,可以这样做:

    function zSort(objects:Array) {
        objects.sortOn("z", Array.DESCENDING | Array.NUMERIC); // sort the array on the "z" property
        for each(var clip:DisplayObject in objects) { //loop the array and add the childs in the corrected order...
            addChild(clip);
        }
    }
    

    是的,但是你什么时候执行这个代码?每一帧?对象处于运动状态,并且可以随时更改z位置。你什么时候做排序?你需要每帧做一次。无论您的其他逻辑对它们的状态做了什么,这些项每帧仅在屏幕上渲染一次。因此,将此代码的一个版本放入onEnterFrame处理程序将解决此问题。。。对于20个对象,您甚至不会注意到它的cpu智能;)谢谢,行得通。我不认为每帧对数组进行排序会对处理器友好。