![]() |
позиционирование в 3D
УРА! :yahoo: наконец во флеше официально вышла поддержка 3D
любой DisplayObject обладает новыми вкусными методамами и свойствами типа sprite.z, sprite.scaleZ, MovieClip.rotationZ; работают пока крайне глючно - НО РАБОТАЮТ! :quiet: и всё же пара вещей хотелось бы решить - а именно позиционирование объектов относительно друг друга. например создавая абсолютно одинаковые по величине объекты но располагая их в разных Z координатах они будут позиционироваться по глубине так как я добавлял их с помощью addChild(); Это логично, но есть ли способ задать им так, чтобы тот что действительно сзади - был сзади а не спереди? Это я простой пример привёл потому что понимаю что можно решить и циклом сортируя по Z но что делать когда объекты поворачиваются с помощью rotationZ - тут что то немогу догадаться как их правильно позиционировать. если получится решить первый вопрос то будет и второй :away: |
Не проверял, но может быть поможет.
http://blog.yesutin.com/?p=246 |
эхх эта штука пашет только при сортировки Z координаты (т.е. чисто положение координат) но вот повороты так и не сортирует
Код:
var ellipse1:Sprite = new Sprite(); |
ага, какая-то досадная непонятка в FP10 - отсутствие сортировки детей в 3D пространстве, даже в five3D есть..
может есть, но плохо искал.. ничего более путного не придумал, как сортировать дисплейЛист по расстоянию детей до viewPoint, пример: http://silin.fatal.ru/#FP10/cube3D |
Шайтан! :eek:
неплохо вышло ;) кстати видно по твоему примеру что 3D у них как то пока не очень 3Dшное в плане проецирования - как то они угол обзора не тот выбрали или в общем что то не то... Пока сам не знаю. как же нехватает мааленького свойства в DisplayObject типа this.enable3Dposition = true :rolleyes: |
3D вам не обещали, обещали 3D-трансформацию.
|
Это называется 2.5D
|
Цитата:
|
если алгоритм z-сортировки примерно ясен, то построение пересечений 3D-объектов и обнаружение столкновений страшно представить.
|
Это фигня ещё - ты посмотри движок альтернативы
вот 3д проецирование я и сам делал типа представляю - вот как текстурой обливать что то как то с трудом представляю а ещё чтобы это работало быстро. как импортировать готовые модели я вообще не представляю. но у них это всё фигня у них даже работа с источником света есть! О__О Девид Блейн ?? ,--__ О_o // |
Цитата:
Что действительно сложно - это построение(и динамическая перестройка) BSP дерева. Это вам не алгоритм художника (: |
ага следущий щас зайдёт скажет "да вообще вы фигню обсуждаете!" вот они разрабатывают готовый пакет для создания собственных онлайн игр :-D
решил зайти в кое веки на их сайт О________________О я НЕЗНАЛ!!!! ЧЕЕСНА!!!! можно руганусь фразой "в рот мне ноги!" ?? http://alternativaplatform.com/ru/alternativacore/ всё пошёл вешаться... |
Цитата:
|
Цитата:
|
Цитата:
|
что то нас троих куда то не туда понесло =)
кстати вот ещё проблемка даж не знаю стоит ли тему открывать по ней... короче если изменять координату спрайта то он стремится к центру экрана (что логично) но вот я решил изменить размер экрана а в настройках сцены стоит Код:
stage.scaleMode = StageScaleMode.NO_SCALE; |
Можно.
Контейнер с объектами располагать по центру stage на RESIZE. |
Цитата:
ой а что делать когда надо определить во сколько раз сжался объект когда мы его перемещали по координате Z ? |
Пользователь DRAGOnoid получает предупреждение за глобальное игнорирование запятых.
|
Цитата:
Ведь при z, стремящимся к бесконечности, scale будет стремиться к нулю. |
не ну это и понятно - я ж не буду делать координату .z = NaN;
|
Дак что Вы конкретно хотите?
|
Код:
var sprite:Sprite = new Sprite(); |
Я еще не работал с CS4, но думаю можно, соотнеся текущий видимый занимаемый Rectangle и width, height.
Но зачем? Если не меняете rotation, используйте scale - будете знать соотношение. |
Цитата:
|
да не сжалась она
она просто "уехала" визуально и кажется будто она сжалась, на самом деле она осталась прежних размеров просто находится визуально дальше!!! хотите чтоб сжималась, используйте за место отдаления ( z ), scale ... |
для определения размеров "уехавшего" объекта относительно экрана проекции можно использовать метод DisplayObject.local3DToGlobal().
Код:
public function local3DToGlobal(point3d:Vector3D):Point |
Здравствуйте всем ещё раз. У меня появился новый вопрос, на который что-то никак не могу найти ответ.
Как известно перерасчёт 3D в 2D идёт по двум простым формулам: Код:
x2D = x3D * distance / z3D + stageWidth / 2Код:
Math.ceil(stage.stageWidth * 0.88);а то этих вещей критически нехватает... |
Вообще-то для перевода из 3D в 2D формулы посложнее и совсем не такие.
|
см.
PerspectiveProjection ( DisplayObject.transform.perspectiveProjection ) DisplayObject.local3DToGlobal () |
Этот параметр distance по-дургому называют focalLength(фокальное расстояние) посмотри у объектов perspectiveProjection наверняка есть что-то подобное.
|
Цитата:
Добавлено через 1 час 23 минуты Цитата:
к сожалению немогу нигде кроме root найти конструктор perspectiveProjection. в остальный DisplayObject он везде null :( хотя Это всё логически обоснованно =) круто! спасибо - он как раз то что надо! |
спустя некоторое время решил вернуться к этому вопросу.
в общем есть пара методов которые изменяют положение центра и дистанцию до препятствия: Код AS3:
Код AS3:
так как же определить вектор от объекта к центру экрана? поясню это ещё нужно для того чтобы определить какой стороной к нам спрайт - лицевой или задней... если зная вектор плоскости и правильный вектор центра экрана получить угол Код AS3:
подскажете какие нибудь идеи? |
Сори, что не отвечаю на Ваш вопрос, а просто комментирую... НО
Если определение лицевой/обратной стороны спрайта Вам необходимо для создание некоего 3d-движка, то советую еще раз подумать Почему? - по тому, что уже при 200 спрайтах на простеньком 2-х ядерном Интеле начинаются тормоза. Причем возникают они и при меньшем количестве спрайтов при условии, что в результате перспективного искажения спрайт на экране занимает площадь бОльшую своего номинального размера. То есть, создавая спрайт размерами 100х100 и приблизив его (z < 0) Вы заставляете флеш его растягивать. Флеш, пытаясь сохранить качество тратит много ресурсов. Что само по себе не очень =) |
флеш сам режет графику и более того - я доказал что в нём есть Z буффер который ещё просто тупо не активировали...
удаление граней хочу сделать для вторичной сортировки так скать... для этого надо найти вектор от точки видимости до центра координат объекта. |
попробуй смотреть getRelativeMatrix3D не относительно stage, а относительно самого верхнего предка
для определения видимости спрайта есть еще такой способ http://www.senocular.com/?id=2.57 |
ты имеешь ввиду root ? да как раз по твоей прошлой наводке использовать getRelativeMatrix3D + root у меня и получилось создать неплохой сортировщик, но нащюпать правильный вектор не удалось... это по сути последнее что осталось разгрести - тогда можно делать полнеоценные 3D махинации =)
З.Ы. есть ли смысл поднять мне топик где с нуля я бы описал как работать с 3D проектированием и что можно от него добиться? |
Цитата:
|
да просто - когда любой спрайт приближаешь к экрану максимально близко - он начинает обрезаться.. такое возможно только расчётом положений пикселей в пространстве.. ну или тем же Z-буффером который этим и занимается.
|
Это клиппинг, а не Z-буфер.
|
| Часовой пояс GMT +4, время: 12:59. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.