Загрузка модели из файла

Xtreme3D v3

Урок 7
Загрузка модели из файла

Уровень: начинающий
Версия Xtreme3D: 3.0.x
Автор урока: Gecko

Примитивы - это, конечно, хорошо, но для создания полноценной игры их явно недостаточно. Самое любимое занятие каждого, кто начинает знакомиться с 3D-движками, - несомненно, загрузка в движок собственных моделей, подготовленных в стороннем редакторе. Xtreme3D поддерживает загрузку моделей форматов 3DS (3D Studio), OBJ (Maya), LWO (Lightwave), BSP (Quake), MS3D (Milkshape), B3D (Blitz3D), LOD (LODka 3D) и многих других.
Статичная (то есть, неанимированная) модель в Xtreme3D загружается в специальный объект - Freeform:

model = FreeformCreate('model.3ds', matlib, matlib, global.scene);

Второй и третий параметры этой функции отвечают за библиотеки материалов, которые следует использовать, соответственно, для обычных текстур и карт освещения модели. Хорошим тоном является создание отдельной библиотеки материалов для каждого объекта Freeform, чтобы гарантированно избежать конфликта имен материалов. В данном случае для простоты используется одна и та же библиотека.
Если файл с моделью включает информацию о текстурах, Xtreme3D попытается автоматически загрузить их. Вопрос только в том, где именно движок будет искать эти текстуры. По умолчанию - в рабочей директории игры. Но хранить их там - не лучшая идея. Гораздо удобнее поместить текстуры в какую-либо папку, наример, textures. Тогда нам придется указать активной библиотеке материалов, что текстуры следует искать именно там:

MaterialLibrarySetTexturePaths(matlib, 'textures');

Материалы будут загружены в библиотеку под теми именами, какие были заданы в 3D-редакторе. Используя эти имена, вы можете настраивать характеристики материалов. Это дает возможность частично изменять внешний вид модели. Например, представьте, что вы загрузили модель автомобиля. Вы можете изменить цвет корпуса или салона, не затрагивая другие детали, сделать прозрачные окна тонированными, добавить эффекты отражения на диски колес и т.д.

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

car = DummycubeCreate(global.scene);
FreeformToFreeforms(model, car);

Мы создаем Манекен, который будет родителем для всех деталей автомобиля, и разбиваем модель на отдельные самостоятельные Freeform. Примите во внимание, что эта операция возможна только в том случае, если детали автомобиля (кузов, колеса, дверцы, багажник и т.д.) представляют собой отдельные меши - не все форматы моделей поддерживают такое разделение.
Исходный Freeform нам уже не нужен, и мы его удаляем:

ObjectDestroy(model);

Чтобы управлять созданными объектами, нам нужно получить их идентификаторы. Это можно сделать функцией ObjectGetChild. Для этого не лишним будет знать, сколько всего мешей было в исходной модели. Допустим, что пять - четыре колеса и кузов:

car_body = ObjectGetChild(map, 0);
car_wheel1 = ObjectGetChild(map, 1);
car_wheel2 = ObjectGetChild(map, 2);
car_wheel3 = ObjectGetChild(map, 3);
car_wheel4 = ObjectGetChild(map, 4);

Помните, что отсчет ведется с нуля, поэтому первый потомок - нулевой.
Таким образом, мы получили новую иерархию, по структуре полностью идентичную с исходной моделью. Вы теперь можете вращать колеса:

ObjectPitch(car_wheel1, 3);
ObjectPitch(car_wheel2, 3);
ObjectPitch(car_wheel3, 3);
ObjectPitch(car_wheel4, 3);

Вместо ObjectPitch можно использовать ObjectRoll - в зависимости от того, куда "смотрит" кузов автомобиля: вдоль оси Z или X.

Вы также можете заменять одни части модели на другие. Например, если создать модель сразу с двумя вариантами колес, можно скрыть одни колеса, оставив другие, и наоборот. Или сделать несколько вариантов кузова с различной степенью повреждений, чтобы динамически переключаться между ними, когда автомобиль врезается в препятствие. А еще вы можете использовать координаты деталей в пространстве, чтобы создать в них различные спецэффекты - дым или пламя. Или, например, если вы создали танк, то можете вращать его башню и выстреливать из дула снаряды в соответствующем направлении. Xtreme3D позволяет делать с моделями все, что угодно!