|
|
|||||
Еще раз про z-сортировку
Здравствуйте, друзья
Поздравляю всех с Новым Годом и Рождеством, удачи и здоровья, успеха в проектах и всех начинаниях Я хочу попросить взглянуть на мою проблему с 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++); } } |
|
|||||
Вообще простая сортировка по одной из выбранных точек грани _не_ должна работать в общем случае.
На счёт кубика не уверен. Попробуйте поискать отличия вашего и этого творения: http://www.silin.su/#AS3/zod/simple/bin |
|
|||||
не уверен, но возможно ошибка в определении координат центра грани в руте
попробуй вот так |
|
|||||
Спасибо за ответы
К сожалению, Utils3D не меняет ничего, также ошибается алгоритм |
|
|||||
вот не могу ничего вменяемого сказать, не разобрался с этим до конца, сори
только transform.getRelativeMatrix3D(root).position это совсем не координаты в системе рута, которые здесь нужны (проверяется самыми простыми тестами) вот такой еще вариант у меня еще 'правильно показывал', в моей схеме он так остался как последний var mtrx:Matrix3D = root.transform.getRelativeMatrix3D(obj); mtrx.invert(); curMid = mtrx.position; PS. тема такого 3D и изначально не очень-то цвела, а теперь и совсем никчемушной выглядит, не ? |
|
|||||
Спасибо, щас попробую
У меня нет выхода - данные приходят именно под такую отрисовку объектов в 3д мире |
|
|||||
Ну, это может быть и не куб вовсе, я могу передать хоть 10 точек
нижняя и верхняя грани отрисуются по этим точкам + в цикле добавятся "боковые" грани + мне обязательно нужн учесть полупрозрачность Друзья, а кто-нибудь работал с BPS деревьями ? |
|
|||||
Lorem ipsum
|
__________________
Поймай яблоко 2! |
|
|||||
Больше всех с ними, кажется, Alternativa работала
Я делал некоторые эксперименты с BSP, если потребуется, могу накидать сюда исходников (но это эксперименты, на практических применениях не реализованные) Но если есть движущиеся части, то BSP не поможет (помешают низкая производительность и артефакты разрезки полигонов). P.S. Скачал куб silin'a, пытался его растянуть, придать ориентацию как на вашем скриншоте - не похоже, чтобы лажало, если лаги и есть - то в 1,5 пикселя отсилы. Но Вы говорите, вам не только куб нужен. Последний раз редактировалось expl; 09.01.2012 в 14:52. |
Часовой пояс GMT +4, время: 00:37. |
|
« Предыдущая тема | Следующая тема » |
|
|