Просмотр полной версии : z index или глубина объектов в 3д пространстве
абсолютно не понимаю новый флеш хелп в котором ищет гугл, нифига не могу найти, в старом флеше хелп был так легко юзабелен зачем они решили его переделать..
nuff spam, вот проблема:
у меня скажем есть 20 шариков внутри объекта,
этот объект можно крутить с помощью мышки,
как пересчитывать глубину у дочерних объектов, чтобы они правильно накладывались друг на друга?
какие проперти смотреть?
Psycho Tiger
30.10.2009, 19:30
Встроенных алгоритмов сортировки нету. Пишите свой.
да я в курсе, спасибо, я имею ввиду на какие проперти ориентироваться, короче начать с чего
может можно узнать глобальную z-координату объекта как-то?
или возможно стОит изменить подход, и крутить камеру вокруг объекта в пространстве? это возможно? если да то как, с чего начать?
Psycho Tiger
30.10.2009, 19:52
silin.fatal.ru
у него посмотрите реализацию.
я думаю, что самое простое это:
Utils3D.projectVector(obj.transform.getRelativeMatrix3D(root), new Vector3D())
но до конца не уверен
Добавлено через 5 минут
да, еще: в общем случае одной z-координаты мало, надо сортировать по расстоянию от наблюдателя (transform.perspectiveProjection)
спасибо, кажется сдвинулось с мёртвого места
пересчёт глубины оказался неимоверно прост..
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]);
}
}
Подскажите, так быстрее будет работать?
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);
}
}
по моим тестам узкое место не столько в перетасовке дисплейлиста, сколько в самой сортировке,
имо, так будет быстре
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..
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.