Цитата:
Сообщение от 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);
}