Blender по-русски
Panda3D по-русски

среда, 18 февраля 2009 г.

Манипуляции частями модели

Каждая модель после загрузки становится ModelNode в графе сцены. Помимо ModelNode также появляется один и более GeomNodes, содержащие актуальные полигоны. Если вы хотите управлять частями модели, например если вы хотите изменить текстуру только на какой-то части модели, вам понадобится указатель на соответствующий GeomNode - геометрический узел.
Чтобы получить такой указатель вам надо убедиться что необходимая геометрическая часть находится именно в нужном GeomNode узле (и не объединена с остальной геометрией). Другими словами, вы должны убедиться, что механизм оптимизации Panda не изменил геометрию и не объединил нужную вам часть с остальной частью модели. В обычном случае, такая оптимизация - хорошая вещь, если вы хотите изменить текстуру на нужной вам части модели (например только на лице модели) вам необходимо, чтобы эта геометрическая часть была отделена.
Есть два пути сделать это, в соответствии с типами модели.

Анимированные модели (Скелетные модели)

Если ваша модель анимирована с помощью ключевых кадров в таких пакетах как 3DSMax или Maya - то Panda будет агрессивна при комбинировании всей геометрической части и создаст наименьшее возможное число геометрических узлов модели. Чтобы указать, что нужная геометрическая часть должна остаться отдельной следует использовать программу egg-optchar.

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

egg-optchar -d outputDir -flag Sphere01=theHead modelFile.egg anim1.egg anim2.egg

Запомните что вы должны всегда передавать файл модели и файлы анимации программе egg-optchar вместе. Так она сможет определить все части и какая из них анимирована на самом деле, и сможет удалить ненужные части. Выходные данные записываются в директорию, указанную после -d параметра.
Опция "-flag" указывает что Panda не следует реорганизовывать геометрию для именованных полигонных наборов, включая их полностью в модель. Она также присваивает полигон-набору указанное имя. Так как вы пометили нужную часть геометрии, вы можете получить указатель на нее с помощью метода:

myModelsHead = myModel.find("**/theHead")


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

Статические модели
Другой тип модели, которые не имеют скелета и анимации не оптимизируются так агрессивно Panda загрузчиком, расчитывая на то, что модель уже была спроектирована нужным образом. Поэтому объект, спроектированный вами отдельно будет скорее всего и в panda отделен от других и доступен по имени, которое вы указали. Однако не гарантировано, что Panda никогда не попытается оптимизировать узлы, пока вы точно ей это не укажите.

В случае неанимированной модели, чтобы защитить отдельный узел надо установить флаг в egg-файл для отдельной группы. Путь как это сделать зависит от вашего пакета моделирования (и эта документация еще не написана :( )