5 Вопросов по 3D-графике и AS3
Изменение оси вращения Допустим есть объект, состоящий из 6-ти спрайтов, каждый из которых имеет св-ва x, y, z, rotationX, rotationY, rotationZ, таким образом из них составлен куб, как показано на рис. Все эти шесть сторон куба помещены в контейнер «cube» Этот куб вращаю вокруг оси Y X или Z так: Код AS3:
Но тогда возникает вопрос, а как вращать объект по другой оси, назовем ее «A», она отличается от осей Z X и У. Пробовал вращать по одной оси быстрее, по другой медленнее: Код AS3:
Вопрос 1: Как вращать объект по оси «A» ? см. рисунок. http://imglink.ru/pictures/18-01-10/...a7ab03b153.jpg Вращение через Matrix3D Возьмем к примеру тот же самый cube из предыдущего вопроса. Каждый кадр поворачиваю его с помощью Matrix3D: Код AS3:
Вопрос 2: Что это за точка? Как изменить эту точку? Или я что-то делаю неправильно? Z-сортировка между плоскостью и другой плоскостью большего размера Происходит сортировка всех плоскостей по величине Z. Вот функция, вызывается каждый кадр. Код AS3:
Но только в том случае, если все плоскости одинакового размера и не пересекаются между собой. Если же сделать одну большую плоскость, допустим это каменный пол комнаты, то не всегда получается нужный результат. Например на этом рисунке координата Z плоскости находится от нас дальше в глубь, чем координаты плоскостей куба, обведенного красным цветом → childIndex плоскостей куба больше чем childIndex плоскости пола и все отображается нормально. http://imglink.ru/pictures/18-01-10/...bb0e113823.jpg Но если повернуть контейнер, в котором размещены все объекты, то... Координаты Z плоскостей куба стали дальше, чем Z плоскости пола → плоскость пола отображается поверх плоскостей куба. Все логично, НО. Куб есть, а его не видно. http://imglink.ru/pictures/18-01-10/...1ceaad4bf4.jpg Можно решить эту проблему, создав пол из кучи таких же маленьких плоскостей, и тогда все отображается нормально. Но колисчество плоскостей значительно возрастает (10 х 10 плиток пола = 100 плоскостей) И все начинает жутко тормозить. Вопрос 3: Можно ли организовать сортировку таким образом, чтобы она корректно работала с разными размерами плоскостей и не возникало ситуаций, описанных выше? Если можно, то как примерно она должна быть устроена? Или же все-таки остается собирать из маленьких плоскостей? Каков вообще правильный подход к решению таких задач? Производительность Делаю следующим образом: Собираю из плоскостей трехмерные объекты путем размещения и поворота этих плоскостей. Каждая плоскость — это Shape, создается следующей функцией: Код AS3:
Код AS3:
все работает нормально, без подвисаний. Код AS3:
Вопрос 4: Нужно ли создавать каждую плоскость как отдельный Shape? Как вообще можно повысить скорость отрисовки всего этого? Ясно, что-то я делаю неправильно, как будет сделать разумнее и оптимизировать хоть как-то все это? Каков правильный подход Все яснее становится, что используя готовые классы Shape или там Sprite и создавая трехмерность таким образом, как описано выше — неправильный путь. Вопрос 5: Так каков же тогда правильный путь? Писать все 3D вручную? Как вообще устроены простейшие 3D-движки на флеше? И если уж все идет на то, что нужно писать все самому, какую литературу посоветуете? Я уже нашел статьи, но хочется именно книгу, в которой бы описывалось программирование 3D-графики с азов. Ну, конечно, кроме учебников по математике и геометрии :) |
>> Вопрос 2: Что это за точка? Как изменить эту точку? Или я что-то делаю неправильно?
Пожалуй единственное, на что смогу ответить - смотрите в сторону projectionCenter. А в остальном - на сколько я понимаю, использовать практически любой из существующих 3Д фреймворков в смысле производительности гораздо лучше родного 3Д... Если задача сделать что-то именно используя флешевые возможности - посмотрите сюда: http://www.flasher.ru/forum/blog.php?b=123 |
насчет вопроса 2. projectionCenter не помогло, однако при вращении
Код AS3:
Код AS3:
вопрос однако остался в силе... а тот фреймворк по ссылке достаточно резвенько работает :) |
1,2: все верно, вращать надо за счет преобразований transform.matrix3D
но чтобы получить адкватный результат (вращение относительно точки регистрации, например) надо мадрицу привести в "исходное" сотояние по координатам, там повернуть и снова вернуть в прежние координаты Код AS3:
остается шаманство со складыванием частей разных объектов в один контейнер с общей сортировкой, естественно чем мельче фрагмены, тем адекватнее они отсортируются, но увлекаться этим тоже не выходит из-за неизбежных тормозов еще нюанс: сортировать по z-координате в общем случаем неправильно, надо сортировать по расстоянию до наблюдателя (transform.perspectiveProjection) 4,5: насчет производительности и правльных направлений мне нечего сказать, грустно все.. рисовательные движки (инфинити, альтернатива, PV3D..), которые выводят этот 3D мир за счет отрисовки полигонов, предварительно спроектированных в экран, выигрывают, конечно же в производительности, но выигрыш этот не таков, чтобы говорить о каком-то съедобном 3D, имхо а для ерунды можно и нативными костылями обойтись |
Вот то-же самоделка по бездвиговому рисованию 3Д (нативными drawTriangles)
http://www.murmadillo.tut.su/3d/draw...es-sort-z.html |
Цитата:
3 - т.е. я понял у perspectiveProjection есть св-во или метод, который определяет расстояние до наблюдателя? Добавлено через 4 минуты Цитата:
|
я понял у perspectiveProjection есть св-во или метод, который определяет расстояние до наблюдателя?
не напрямую, но узнать его координаты в 3D-мире можно у меня сейчас работает такой вариант: Код AS3:
|
Про сортировку плоскостей разного размера:
Если есть много времени и желания, читайте про BSP-деревья Если нет желания делать через BSP - алгоритм Ньюэла-Ньюэла-Санча к Вашим услугам. В него можно врубиться и он полностью решает эту задачу. Про производительность: Я пришел к тому, что нужно сделать буфер шейпов в одном спрайте (спрайт - это Viewport, каждый шейп - ViewportLayer). В каждый шейп нужно рисовать определенную глубину (от и до) методом drawTriangles(). В один шейп должен попадать только один объект (а значит - одна текстура => одна заливка), более того - только участок объекта, не пересекающийся с другими по глубине (при этом по x и y пересечения допустимы). По поводу учебников по математике и геометрии - алгоритмов пруд пруди. Правда их придется все понять =) ЗЫ Про вращение кубика вокруг непонятной точки - а какие координаты у объекта Cube вы выставляете изначально? |
Цитата:
|
если кому нужно могу выложить несколько классов, которые будут отображать 3D с z сортировкой более продуктивно. Начал писать движок 3D, но пока нет времени на него.
|
Часовой пояс GMT +4, время: 02:27. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.