![]() |
|
||||||||||
|
|||||
|
Здравствуйте, друзья
Поздравляю всех с Новым Годом и Рождеством, удачи и здоровья, успеха в проектах и всех начинаниях Я хочу попросить взглянуть на мою проблему с z-сортировкой http://divisionby0.org/web_Portfolio/3DSpace/Main.html Для того чтобы посмотреть исходники нажмите правой кнопкой по флэшке и выберите View Source Класс построения фигуры com.div0._3D.primitives.NAnglePrimitive.as Фигура строится по точкам Сначала добавляется спрайт НИЗ-а, на нем рисуется линия из точек Затем добавляется спрайт ВЕРХ-а, на нем рисуется линия из точек В цикле добавляются спрайты граней Если покрутить по x или по y видно что неверно сортируются грани куба Грани куба это класс Plane, наследник Sprite-а Для сортировки я использую такой механизм: Нахожу точку в 3д пространстве (Vector3D) позиции смотрящего observerPos.x=root.transform.perspectiveProjection.projectionCenter.x; observerPos.y=root.transform.perspectiveProjection.projectionCenter.y; observerPos.z=-root.transform.perspectiveProjection.focalLength; Расчитываю расстояние от точки обзора до середины каждой грани Сортирую по этому расстоянию Сортируется не всегда правильно вот алгоритм сортировки private function sortFaces():void { var i:int; var index:int = 0; var distArray:Array=[]; var curMid:Vector3D; var curDist:Number; var vo : SortVO; var observerPos:Vector3D=new Vector3D(); observerPos.x=root.transform.perspectiveProjection.projectionCenter.x; observerPos.y=root.transform.perspectiveProjection.projectionCenter.y; observerPos.z=-root.transform.perspectiveProjection.focalLength; trace("\nobserver pos "+observerPos); var totalFaces:int=_faces.length; for(i=0;i<totalFaces;i++) { var currFace:Plane=(_faces[i] as Plane); trace("centerSprite="+currFace.centerSprite.transform.getRelativeMatrix3D(root).position.clone()); //curMid=currFace.transform.getRelativeMatrix3D(root).position.clone(); curMid=currFace.centerSprite.transform.getRelativeMatrix3D(root).position.clone(); curDist=Math.sqrt(Math.pow(curMid.x-observerPos.x,2)+Math.pow(curMid.y-observerPos.y,2)+Math.pow(curMid.z-observerPos.z,2)); var sortVO:SortVO=new SortVO(); sortVO.object=currFace; sortVO.observerPointDistance=curDist; trace("face "+currFace.id+" dist "+sortVO.observerPointDistance); distArray.push(sortVO); } distArray.sortOn("observerPointDistance", Array.NUMERIC | Array.DESCENDING); for each(vo in distArray) { setChildIndex(vo.object, index++); } } |
![]() |
Часовой пояс GMT +4, время: 22:27. |
|
|
« Предыдущая тема | Следующая тема » |
|
|