Quest3D - Русскоязычное сообщество

Quest3D => Программирование => Тема начата: anval от 26 Февраля 2010, 19:22:59



Название: как объединить несколько объектов в один
Отправлено: anval от 26 Февраля 2010, 19:22:59
Всем привет. Имеется в виду объекты созданые с помощью ОО.
Наверное надо лепить,что то подобное Collada импорта, но как быть с matrix?


Название: Re: как объединить несколько объектов в один
Отправлено: dfx от 22 Мая 2010, 02:43:09
Теме, конечно, 100 лет, но могу привести способ склейки моделей в один меш в квесте, может кому понадобится.

Способ работает с версии Quest3D 4.3

Допустим, у нас есть несколько однотипных моделей, которые в целях экономии размера проекта, храним в одном экземпляре, а в мире расставляем, используя матрицы.
Далее, например, каждый объект состоит из 3 частей ( в нем используется 3 материала).

Строим OO структуру объекта так, что бы каждый его элемент можно было вызвать, а так же спросить его, какой у него материал используется. Либо использовать имя этой части...

Так же обязательным условием может быть один лайтмап и общие текстурные координаты для него у всех объектов, например амбиент оклюжен, если, конечно, не хотите, что бы у повернутых объектов тени были направленны в разные стороны). В итоге нам надо получить 40 копий таких объектов. 40х3=120 - неплохо)

В квесте в канале Command есть функция, которая добавляет к текущей геометрии, находящейся в 3dObjectData - новую из другого. Называется "Add object data".
Вот описание команды (взято из Command New Interface) -
This commands allows you to copy 3D Object Data type channels into an 3D Object Data channel. You can call this command multiple times to add multiple meshes to one single mesh. This allows you to combine one or multiple meshes into one bigger mesh. Possible applications include merging meshes or caching meshes that are usually dynamically generated. The Clear Object Data command allows you to clear an object data.

Как видно, про позицию объектов ничего не сказано, НО, если к этому каналу прикрутить на третий вход матрицу, то добавляемый объект будет ее учитывать и появится там, где надо.

Нам понадобятся два списка - исходный и целевой, последний и будет у нас рендериться.
Далее алгоритм такой -
Пробегаем по списку исходных копий объектов и спрашиваем у них информацию об текущем материале. Если не находим элемента с таким материалом в целевом списке, то добавляем  в него класс с пустым 3dObjectData, присваиваем ему нужный материал и добавляем геометрию из исходного списка. Если находим, то просто добавляем геометрию в соответствии с материалом. Не забывая подставлять матрицу с позицией к каналу-склейщику ).

В итоге у нас в списке появится 3 класса с элементами, к которым применены разные материалы. Теперь мы подаем на рендер всего 3 толстых меша, вместо 120 худеньких. А за счет того, что у нас 3 вызова, вместо 120, то скорость будет на порядок выше.

При желании можно манипулировать и ув - координатами. Я не пробовал, но полагаю, что посредством подключения матриц к исходному каналу 3dObjectData. Тогда объединив текстуры освещения в одну, методом таблицы, можно указывать, какой блок из текстуры им нужен, простым смещением текстурных координат. Но это уже для совсем извращенцев. )

Надеюсь, что кому- то помог. Удачи.


Название: Re: как объединить несколько объектов в один
Отправлено: anval от 22 Мая 2010, 13:20:48
Вроде работает,спасибо:) Правда,попробовал без оо и канал надо брать из Channels т.к.в Templates он ограничен двумя входами.