Форум 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:
(хм, думаю, если один полигон будет налезать на другой, один из них будет полностью покрыт верхним)

Alex Lexcuk 01.10.2010 15:49

Цитата:

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

:wacko: А те. вы сами решили надумать, дело в том что я во вложении прикрепил архив зип, он называется blender.zip там так и сделано, если не смотрели архив то вот кусок кода
Код AS3:

//отрисовка
if (debug) gr.lineStyle(0,0x408080);
gr.beginBitmapFill(my3Obj.bmd);
gr.drawTriangles(lvr, lind, luv , TriangleCulling.POSITIVE);
return zCoord;

drawTriangles это и есть GraphicsTrianglePath, только лучше, тк его не надо создавать. Не если сами будете думать, то что-ж.

gloomyBrain 01.10.2010 16:00

Цитата:

сортирую по средней арифм z
Центр полигона лучше расчитать заранее. Как и нормаль к нему. Потом, когда обсчитываете положение камеры - делаете все преобразования с центрами и нормалями. Потом смотрите - какие нормали направлены в экран, для тех полигонов нужно пересчитать вершины. Дальше - растеризируем вершины и рисуем полигоны

deamoK 01.10.2010 16:00

Архив-то я смотрел, токо не особо внимательно - много всего
Цитата:

drawTriangles это и есть GraphicsTrianglePath, только лучше, тк его не надо создавать
.
Все равно придется вызывать не один drawTriangles... я думаю

Добавлено через 13 минут
стопстопстоп =\
для того, чтобы сделать загрузчик модельки и пройстой рендер, мне хватило знаний о Matrix3D, drawTriangles, UVT и пары операций с кватернионами
а что такое растеризация, поиск нормалей я не знаю, я еще не на стоко в 3D )))

gloomyBrain 01.10.2010 16:55

Ну, нормали не есть обязательная вещь. Это удобно, когда еще и физика присутствует.
Растеризация (в данном случае) - проецирование точек на экран.

deamoK 01.10.2010 17:01

Цитата:

Растеризация (в данном случае) - проецирование точек на экран.
аааа, ну projectVectors пока хватает))

Alex Lexcuk 01.10.2010 17:42

Цитата:

Сообщение от deamoK (Сообщение 940123)
Архив-то я смотрел, токо не особо внимательно - много всего
.
Все равно придется вызывать не один drawTriangles... я думаю

Добавлено через 13 минут
стопстопстоп =\
для того, чтобы сделать загрузчик модельки и пройстой рендер, мне хватило знаний о Matrix3D, drawTriangles, UVT и пары операций с кватернионами
а что такое растеризация, поиск нормалей я не знаю, я еще не на стоко в 3D )))

А посмотрите, внимательно, а чего один дроТрианглес (одна модель один дроТрианглес), я там вообще з индексы забыл подключить вот архив с z индексами (девочку вставил)
http://www.murmadillo.tut.su/m/doc-female.swf
http://www.murmadillo.tut.su/m/female-blender.zip

deamoK 01.10.2010 18:39

Честно говоря, уж больно злой код у вас =\, внимательно придется оч долго разбираться, хотя результат нравится
Да и с производительностью что-то странное - при вращении вашей модельно проц (q6600) грузится примерно на 30% . Запускал в и в обычном плеере и дебаггере.

вот моя поделка на аире и моделька из q4 для примера (berserker, 2400 полигонов); вращение при нажатой правой кнопке. сработает ли ссылка =\
modelviewer

gloomyBrain 01.10.2010 21:51

Цитата:

сработает ли ссылка
Сработает. Прикольно, мне нравится =) Упаковал бы еще в native installer

deamoK 01.10.2010 23:09

Паковал батником из FlashDevelop, что за натив инсталлер не знаю
Странно еще, что дилоговое окошко выглядит по-старому, в дебаг режиме нормально выглядит - в стиле висты/7
Паковать пока еще рано, z-sort все еще не сделал (мб пока над анимацией поработаю - md5anim которая)

Добавлено через 39 часов 14 минут
все, мозг уничтожен...
а что быстрее drawtriangles или moveTo/lineTo drawGraphicsPath?
поковырял еще оба Away3D - оба используют graphicsData с trianglePath, но как ето все они сортируют - ето пипец =\


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

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