Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   drawTriangles и z-sort (http://www.flasher.ru/forum/showthread.php?t=145173)

deamoK 30.09.2010 23:05

drawTriangles и z-sort
 
Народ, кто может помочь решить проблему:
Рендерю модельку с несколькими текстурами при помощи нескольких drawTriangles, но as3 3d api не сортирует полигоны, которые должны рисоваться. Как были объявлены треугольники в модельке, так и рисует >.<
Еффект, мягко говря, немного нереалистичный...
Для сортировки полигонов использующих токо одну текстуру запихивал все в массив и методом sortOn сортировал по свойству z и все замечательно, но для полигонов у которых разные текстуры это не прокатит, тк drawTriangles принимает токо одну заливку =\
Как сортировать полигоны?

gloomyBrain 30.09.2010 23:33

Почитайте про GraphicsPath - может, наведет на нужные мысли.
А вообще - я бы сделал несколько Shape, у каждой из которых будет своя текстура для вывода. Ну и, соответственно, после сортировки полигонов учитывал их текстуру - то есть, если текстура данного полигона отличается от текстуры предыдущего, то данный полигон рисуем в другой шейп. Если нет - то в тот же. Тут как раз и пригодится IGraphicsData

expl 30.09.2010 23:38

Можно склеивать текстуры на одной битмапе, и рисовать треугольники, заливая ей.
Т.е. есть например слой - имитация затенения по фонгу,
второй слой - сама текстура.
1. copyPixels основной текстуры в общую битмап-дату
2. расчет освещения, отрисовка всего этого добра на shape в координатах текстуры,
3. отрисовка shape на общую битмапу
4. рисование треугольников в экранных координатах с заливкой общей битмапой
По скорости почти тоже самое должно получиться - если бы треугольники все стразу рисовались - рендерилось бы такое же количество треугольников, тололько сразу а не в 2 этапа.

Бонус - отрисовка текстуры на одной битмапе дает более гибкие настройки по склейке слоев

gloomyBrain 30.09.2010 23:43

Цитата:

Можно склеивать текстуры на одной битмапе, и рисовать треугольники, заливая ей.
Чем это поможет при сортировке? Ведь придется рассчитывать текстурные координаты заново. Как я понял, итоговая текстура уже имеется, ее нужно только вывести правильно.

Кстати, deamoK, рекомендую Вам использовать класс Vector и собственную функцию сортировки. Ибо так оно побыстрее =)

Alex Lexcuk 30.09.2010 23:51

Можно рендерить со многими текстурами, ну к примеру с двумя. Делаете битмап в который отрисовуете первую текстуру а с права вторую. Получится битмап с двумя текстурами, с лева одна справа другая, не знаю какая у вас цель. Однако подозреваю, к примеру, отрисовать свет и нанести затем какой-то рисунок на модельку.
Ну так с рисуном проблем нет, он делается в 3Д редакторе и у негу естественно будут UW координаты, при отрисовке их можно
Код AS3:

uwx = 0.5+uwxObj*0.5;

Теперь суем в массив треугольников на торисовку сначала треугольник с первой половины битмапа, а затем со второй, так они наложаться один на другой, естественно он должен быть с прозрачностью.

deamoK 30.09.2010 23:56

Цитата:

Сообщение от gloomyBrain (Сообщение 939971)
Чем это поможет при сортировке? Ведь придется рассчитывать текстурные координаты заново. Как я понял, итоговая текстура уже имеется, ее нужно только вывести правильно.

Кстати, deamoK, рекомендую Вам использовать класс Vector и собственную функцию сортировки. Ибо так оно побыстрее =)

Насчет склеивания в одну битмапдату была мысль, но токо сразу же от нее отказался, тк ето извращение и, действительно, еще снова uv-координаты пересчитывать...


Vector токо и использую
Собственную функцию сортировки я и хочу сделать, только алгоритм мне подскажите =\
По сути, мой просмотрщик моделек работает, за исключением сортировки...
Переворошил away3dlite, там как-раз и рисуют несколько моделей с разными материалами, но после неск часов изучения той функции (sortFaces в BasicRender) уже начали кипеть мозги, там зло какое-то. Но он работает, так что придется еще его поизучать, ну лучше кончено просто знать алгоритм

Добавлено через 3 минуты
Цель: сделать просмотрщик моделек из квачи, дума, вобщем MD5Mesh моделек.
Просто для себя, justfun, может пригодится, кто знает
Хочу еще прикрутить MD5Anim для анимации, но сначала было бы неплохо с норм отображением разобраться =\

expl 01.10.2010 01:11

Цитата:

Насчет склеивания в одну битмапдату была мысль, но токо сразу же от нее отказался, тк ето извращение и, действительно, еще снова uv-координаты пересчитывать...
Если посмотреть сколько тратиться на сам рендеринг, то можно считать, что пересчет координат делается процессором за даром,
на счет изврата не знаю - по крайней мере в одной из версий Papervision так делали

Однако, да, есть более объективные недостатки такого подхода:
- если текстура зеркалится (т.е. одна и та же половина человека используется для одной и другой половины модели) - то освещение корректно не наложишь - придется дублировать текстуру
- если объект состоит из нескольких и они динамически меняются - придется менять размер текстуры для каждой комбинации объектов, и искать место для нескольких объектов на одной общей текстуре, т.е. метод подходит только для неизменного количества объектов.

deamoK 01.10.2010 01:18

Цитата:

по крайней мере в одной из версий Papervision так делали
хммм, переобдумаю
До освещения мне еще далеко, сортировку-то не могу сделать, а вы все про освещение))

Alex Lexcuk 01.10.2010 01:38

Вложений: 2
Цитата:

Сообщение от deamoK (Сообщение 939976)
Насчет склеивания в одну битмапдату была мысль, но токо сразу же от нее отказался, тк ето извращение и, действительно, еще снова uv-координаты пересчитывать...
:)Всего делов-то разделить на 0.5 и прибавить 0.5 же

Код AS3:

lvr.push(vr[j], vr[j + 1], vr[j + 2], vr[j + 3], vr[j + 4], vr[j + 5]);
 
lvr.push(vr[j], vr[j + 1], vr[j + 2], vr[j + 3], vr[j + 4], vr[j + 5]);
 
luv.push(0.6, normS[k], 1, normS[k], 0.6, normS[k]);
 
 
luv.push(uv[j] /2, uv[j + 1], uv[j + 2] /2, uv[j + 3], uv[j + 4] /2, uv[j + 5]);

Как и говорил k это свет для грани, а uv[j] это координата объекта uv из 3Д редактора
100 лет не открывал свой самодельный 3Д двиг и вот открыл 5мин и готово 2 текстуры на одном объекте, на заднем фоне их видно, куб можно крутить слайдерами, этакий псевдо свет получился.

deamoK 01.10.2010 15:08

неплохо))) еще и с "освещением" ))
но, попытаюсь сделать так:

Цитата:

Сообщение от gloomyBrain (Сообщение 939966)
Почитайте про GraphicsPath - может, наведет на нужные мысли.
А вообще - я бы сделал несколько Shape, у каждой из которых будет своя текстура для вывода. Ну и, соответственно, после сортировки полигонов учитывал их текстуру - то есть, если текстура данного полигона отличается от текстуры предыдущего, то данный полигон рисуем в другой шейп. Если нет - то в тот же. Тут как раз и пригодится IGraphicsData

попробую разбить всю модельку на полигоны, в каждом будет по 3 координаты и материал, потом сортирую по средней арифм z, и забиваю в GraphicsData.
GraphicsBitmapFill-GraphicsTrianglePath-GraphicsEndFill
Если другой материал следующего полигона, значит забиваю в новую тройку fill, tris, endfill...
потом drawGraphicsData...
=\ пошел думать :confused:
(хм, думаю, если один полигон будет налезать на другой, один из них будет полностью покрыт верхним)


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

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