【问题标题】:AS3 - Using Matrix3D objects for reordering displayAS3 - 使用 Matrix3D 对象重新排序显示
【发布时间】:2009-11-03 18:25:34
【问题描述】:

我正在处理大约 20 个在 3D 空间中移动的对象。 Adobe 推荐“Using Matrix3D objects for reordering display”:

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

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

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

  4. 使用 addChild() 方法以相反的顺序将子项添加回显示列表。

太好了。如果物体不移动,那很好。但是,如果发生动画并且在 z 空间中一个对象出现在另一个对象的前面怎么办?对象根据显示列表中的位置显示,而不是根据它们的 z 顺序。如何在制作动画时让对象尊重 z 顺序(如果对象 A 的 z 值变得小于对象 B,则使对象 A 出现在对象 B 的前面)?很明显你不能在动画过程中清除显示列表。

【问题讨论】:

    标签: actionscript-3 animation 3d z-order


    【解决方案1】:

    它实际上与 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 方面注意到它;)
    • 谢谢,这行得通。我不认为每帧对数组进行排序对处理器友好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    相关资源
    最近更新 更多