Показать сообщение отдельно
Старый 09.01.2012, 18:25
djyamato вне форума Посмотреть профиль Отправить личное сообщение для djyamato Посетить домашнюю страницу djyamato Найти все сообщения от djyamato
  № 15  
Ответить с цитированием
djyamato
 
Аватар для djyamato

Регистрация: Feb 2006
Сообщений: 884
Записей в блоге: 2
Отправить сообщение для djyamato с помощью ICQ Отправить сообщение для djyamato с помощью Skype™
Цитата:
Сообщение от expl Посмотреть сообщение
Странное условие, если это не тестовое задание. Ибо чем самопальный код должен быть лучше обкатанного.
Есть отрендеренная картинка этажа здания
На нее нужно наложить этот 3д мир с комнатами, стенами
Координаты стен и комнат (по сути, точки) приходят в данных
Затем нужно эту всю огромную конструкцию таскать мышкой (вместе с бэкграундом-картинкой этажа)
В Альтернативе я застопорился на ограниченности размера 3д сцены (или View, не помню уже) по ширине и высоте

-------------------------------------------------------------

Вроде получилось без BSP дерева
Но иногда при вращении сортировка все равно ошибается
Я вытащил все грани из контейнера и напрямую кладу их в спрайт, который кручу в 3Д

Код AS3:
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.