![]() |
|
||||||||||
|
|||||
|
Это типа комнаты
Пол всегда есть Крыши может и не быть У меня приходит набор точек, по которым я рисую на грани bottom фигуру (пол) Затем, если нужно, отрисовываю крышу, причем, на полу и на крыше может лежать текстура (Bitmap) К примеру "комната" на скрине expl, был бы признателен, если бы Вы показали исходники BSP-деревьев |
|
|||||
|
Да, для комнаты bsp должно быть оптимальным вариантом, там же надо нет движущихся частей - один раз разбил на дерево и все.
bsp_sources.zip Суть такая: - дерево перестраивается на каждом кадре. Вам достаточно его построить один раз. Оно и в моем примере не нужно, просто планы были наполеоновскими ![]() - написано на haXe. Не производительности ради, а просто язык мне нравится. Если портируете на as3 - производительность сильно упасть не должна (ну в 2 раза из-за отсутствия inline - это потолок, т.е. можно не обращать внимания). Голос разума говорит, что надо использовать обкатанные движки типа alternativa. (Единственное, они код закрыли и требуют свой значёк впихивать, но, наверно есть и открытые либы с BSP-деревом. Наверно) |
|
|||||
|
Спасибо, попробую разобраться
У меня условие - все должно быть нарисовано нативными средствами флэша, так что движки отпадают сразу ![]() |
|
|||||
|
Странное условие, если это не тестовое задание. Ибо чем самопальный код должен быть лучше обкатанного.
По сути: у меня там треугольники режутся. Для случая комнаты (наверно) будет лучше резать стены не произвольными плоскостями, а плоскостями, перпендикуляными полу. Таким образом будет проще разрезать прямогольную стенку на 2 тоже прямоугольных. Плюс добавить 2 режущие плоскости, чтобы одна совпадала с потолком, другая - с полом и таким образом правильно отобразить потолок и пол. Для начала можно, конечно порезать прямоугольники на 2 треугольника и посмотреть что получится впринципе (даже пока не портируя на as3). Потом попробовать отрисовать эти треугольники с учётом перспективы (api flashplayer 10 позволяет). А потом уже попробовать использовать прямоугьльники и жонглировать порядком отображения этих спрайтов, а не просто рисовать по порядку фигуры. Последний раз редактировалось expl; 09.01.2012 в 17:07. |
|
|||||
|
Цитата:
На нее нужно наложить этот 3д мир с комнатами, стенами Координаты стен и комнат (по сути, точки) приходят в данных Затем нужно эту всю огромную конструкцию таскать мышкой (вместе с бэкграундом-картинкой этажа) В Альтернативе я застопорился на ограниченности размера 3д сцены (или View, не помню уже) по ширине и высоте ------------------------------------------------------------- Вроде получилось без BSP дерева Но иногда при вращении сортировка все равно ошибается Я вытащил все грани из контейнера и напрямую кладу их в спрайт, который кручу в 3Д public static function sort(container3D:Sprite, figures:Vector.<*>):void { var observerPos:Vector3D=new Vector3D(); var vo : SortVO; var index:int = 0; observerPos.x=container3D.transform.perspectiveProjection.projectionCenter.x; observerPos.y=container3D.transform.perspectiveProjection.projectionCenter.y; observerPos.z=-container3D.transform.perspectiveProjection.focalLength; trace("\nobserverPos "+observerPos); var faces:Vector.<Plane>=new Vector.<Plane>(); var distArray:Array=new Array(); for(var i:int=0;i<figures.length;i++) { if(figures[i] is NAnglePrimitive) { var currFigure:NAnglePrimitive=figures[i] as NAnglePrimitive; for(var j:int=0;j<currFigure.faces.length;j++) { faces.push(currFigure.faces[j]); } } else if(figures[i] is Plane) { faces.push(figures[i] as Plane); } } var totalFaces:int=faces.length; for(i=0;i<totalFaces;i++) { var currFace:Plane=faces[i]; var mtrx:Matrix3D = container3D.transform.getRelativeMatrix3D(currFace); mtrx.invert(); var curMid:Vector3D = mtrx.position; // середина 3д спрайта относительно спрайта, который крутится в 3Д curMid = Utils3D.projectVector(currFace.centerSprite.transform.getRelativeMatrix3D(container3D.parent), new Vector3D()); // дистанция от середины 3д спрайта до точки обзора в 3д (трансформируется контейнер а не stage или root) var curDist:Number=Math.sqrt(Math.pow(curMid.x-observerPos.x,2)+Math.pow(curMid.y-observerPos.y,2)+Math.pow(curMid.z-observerPos.z,2)); trace("face "+currFace.id+" MID "+curMid+" distance "+curDist); var sortVO:SortVO=new SortVO(); sortVO.object=currFace; sortVO.observerPointDistance=curDist; distArray.push(sortVO); } distArray.sortOn("observerPointDistance", Array.NUMERIC | Array.DESCENDING); for each(vo in distArray) { container3D.setChildIndex(vo.object, index++); } trace("самая близкая грань "+distArray[0].object.id); } Последний раз редактировалось djyamato; 09.01.2012 в 20:00. |
|
|||||
|
Нет
Все таки сильно лагает механизм и чтобы не создавать еще одну тему я "апну" эту, извините вот я разбил отрезки друг другом и "продолжалками" (на скрине) как дальше BSP дерево сформировать Или я вообще не правильно понял идею ? |
|
|||||
|
блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
|
Вопрос про BSP в 2D?
Выбираем отрезок. Этот отрезок делит остальные отрезки на две группы - одна рендерится до него, другая после него. В этих группах тоже выбираем по отрезку и делим и т.д. http://www.gamedev.ru/code/articles/BSP Ещё раз скажу про движки, негоже таким страдать %)
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают. |
|
|||||
|
Ну, я расчитывал хоть как-то упростить себе задачу поэтому разбивал в 2D
|
![]() |
![]() |
Часовой пояс GMT +4, время: 23:58. |
|
|
« Предыдущая тема | Следующая тема » |
|
|