3D景深排序碰到的问题

  研究3D,碰到Z轴景深问题,前面的无法显示,问题描述于代码中

  

package com.utils
{
import flash.display.DisplayObject;
import flash.display.Sprite;
import flash.events.Event;
import flash.geom.Vector3D;
public class Carousel extends Sprite
{
private var _holder:Sprite; //容器
private var _items:Array; //保存子对象数组
private var _radius:Number = 200; //半径
private var _numItems:int = 5; //子对象个数

public function Carousel()
{
_holder = new Sprite();
_holder.x = stage.stageWidth / 2;
_holder.y = stage.stageHeight / 2;
_holder.z = 0; //问题出在我把z轴注释掉,自定义排序函数为空,因为自定义函数是基于z轴计算的
addChild(_holder);
_items = new Array();
//创建5个方形
for (var i:int = 0; i < _numItems; i++)
{
var angle:Number = Math.PI * 2 / _numItems * i;
var item:Sprite = makeItem();
item.x = Math.cos(angle) * _radius;
item.z = Math.sin(angle) * _radius;
item.rotationY = -360 / _numItems * i + 90;
_items.push(item);
}
sortItem();
addEventListener(Event.ENTER_FRAME, onEnter);
}
private function makeItem():Sprite
{
var con:Sprite = new Sprite();
con.graphics.beginFill(Math.random() * 0xffffff);
con.graphics.drawRect( -50, -50, 100, 100);
_holder.addChild(con);
return con;
}

private function sortItem():void
{
_items.sort(depthSort);
for (var i:int = 0; i < _items.length; i++)
{
_holder.addChildAt(_items[i] as Sprite,i)
}
}

private function depthSort(objA:DisplayObject, objB:DisplayObject):int
{
var posA:Vector3D = objA.transform.matrix3D.position;
posA = _holder.transform.matrix3D.deltaTransformVector(posA);
var posB:Vector3D = objB.transform.matrix3D.position;
posB = _holder.transform.matrix3D.deltaTransformVector(posB);
return posB.z - posA.z;
}

private function onEnter(e:Event):void
{
_holder.rotationY += (stage.stageWidth / 2 - mouseX) * .01;
//_holder.y += (mouseY - _holder.y) * .1;
sortItem();
}

}
}

 

  运行正常

posted @ 2011-11-29 11:02  独步寻花  阅读(416)  评论(0编辑  收藏  举报