Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   z index или глубина объектов в 3д пространстве (http://www.flasher.ru/forum/showthread.php?t=131902)

randoms 30.10.2009 19:19

z index или глубина объектов в 3д пространстве
 
абсолютно не понимаю новый флеш хелп в котором ищет гугл, нифига не могу найти, в старом флеше хелп был так легко юзабелен зачем они решили его переделать..

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

я думаю, что самое простое это:
Код AS3:

Utils3D.projectVector(obj.transform.getRelativeMatrix3D(root), new Vector3D())

но до конца не уверен

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

randoms 31.10.2009 00:51

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

randoms 15.11.2009 05:54

пересчёт глубины оказался неимоверно прост..
Код AS3:

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

Подскажите, так быстрее будет работать?

Код AS3:

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

по моим тестам узкое место не столько в перетасовке дисплейлиста, сколько в самой сортировке,
имо, так будет быстре
Код AS3:

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..


Часовой пояс GMT +4, время: 08:35.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.