PDA

Просмотр полной версии : z index или глубина объектов в 3д пространстве


randoms
30.10.2009, 19:19
абсолютно не понимаю новый флеш хелп в котором ищет гугл, нифига не могу найти, в старом флеше хелп был так легко юзабелен зачем они решили его переделать..

nuff spam, вот проблема:
у меня скажем есть 20 шариков внутри объекта,
этот объект можно крутить с помощью мышки,
как пересчитывать глубину у дочерних объектов, чтобы они правильно накладывались друг на друга?
какие проперти смотреть?

Psycho Tiger
30.10.2009, 19:30
Встроенных алгоритмов сортировки нету. Пишите свой.

randoms
30.10.2009, 19:38
да я в курсе, спасибо, я имею ввиду на какие проперти ориентироваться, короче начать с чего
может можно узнать глобальную z-координату объекта как-то?
или возможно стОит изменить подход, и крутить камеру вокруг объекта в пространстве? это возможно? если да то как, с чего начать?

Psycho Tiger
30.10.2009, 19:52
silin.fatal.ru
у него посмотрите реализацию.

silin
30.10.2009, 20:04
я думаю, что самое простое это:
Utils3D.projectVector(obj.transform.getRelativeMatrix3D(root), new Vector3D())
но до конца не уверен

Добавлено через 5 минут
да, еще: в общем случае одной z-координаты мало, надо сортировать по расстоянию от наблюдателя (transform.perspectiveProjection)

randoms
31.10.2009, 00:51
спасибо, кажется сдвинулось с мёртвого места

randoms
15.11.2009, 05:54
пересчёт глубины оказался неимоверно прост..
function reorder():void{

//faces это массив спрайтов
for(var ind:uint = 0; ind < 6; ind++){
this.faces[ind].tempz = this.faces[ind].transform.getRelativeMatrix3D(root).position.z;
this.mainMc.removeChild(this.faces[ind]);
}

this.faces.sortOn("tempz", Array.NUMERIC | Array.DESCENDING);

for(ind = 0; ind < 6; ind++){
this.mainMc.addChild(this.faces[ind]);
}

}

O.K.
12.04.2010, 01:48
Подскажите, так быстрее будет работать?

function reorder():void{

//faces это массив спрайтов
for(var ind:uint = 0; ind < 6; ind++){
this.faces[ind].tempz = this.faces[ind].transform.getRelativeMatrix3D(root).position.z;

}

this.faces.sortOn("tempz", Array.NUMERIC | Array.DESCENDING);

for(ind = 0; ind < 6; ind++){
this.mainMc.setChildIndex(this.faces[ind],ind);
}

}

silin
12.04.2010, 09:13
по моим тестам узкое место не столько в перетасовке дисплейлиста, сколько в самой сортировке,
имо, так будет быстре
function reorder():void{

//faces это массив спрайтов
var sortArr:Array = [];
for(var ind:uint = 0; ind < 6; ind++){
//this.faces[ind].tempz = this.faces[ind].transform.getRelativeMatrix3D(root).position.z;
sortArr[ind]=this.faces[ind].transform.getRelativeMatrix3D(root).position.z;

}
//this.faces.sortOn("tempz", Array.NUMERIC | Array.DESCENDING);
var indArr:Array = sortArr.sort(Array.NUMERIC | Array.RETURNINDEXEDARRAY);
ind = indArr.length - 1;
while(ind--)this.mainMc.addChild(faces[ind]);

}
ps. хотя на шести объектах вряд ли это будет заметно, вот для 600..