Экспорт геометрии коллизии с материалом из 3DS Max в формат XML.
Автор: Aviator777
В предыдущей статье http://www.gamedev.ru/code/tip/Collision_material мы разобрали как написать простой скрипт, с помощью которого можно создать костюмный материал, но мы не разобрали, как его использовать. В данной статье мы разберём как создать скрипт для экспорта из 3DS MAX геометрии коллизии с наложенным материалом.
В MAX Script Help предлагаю ознакомиться со следующими материалами:
Standard Open and Save File Dialogs
https://knowledge.autodesk.com/search-result/caas/CloudHelp/cloud… D37C-htm.html
Rollout User-Interface Controls Types
http://docs.autodesk.com/3DSMAX/15/ENU/MAXScript-Help/index.html?… EA5380E32.htm,topicNumber=d30e621026
Button UI Control
http://docs.autodesk.com/3DSMAX/15/ENU/MAXScript-Help/index.html?… 6A6602ACA.htm,topicNumber=d30e621971
Create Dialog
http://docs.autodesk.com/3DSMAX/15/ENU/MAXScript-Help/index.html?… EA5380E32.htm,topicNumber=d30e621026
Сам скрипт начнём писать с создания пользовательского интерфейса, где будет простое меню.
rollout exportCollisionRollout "Collision Exporter" width:175 height:142 ( ) createDialog exportCollisionRollout
Также нам понадобится всего одна кнопочка — «экспорт статической коллизии».
<item_type> <name> [<label_string>] [ <parameters> ]
<item_type> — тип элемента пользовательского интерфейса (полный список:
http://docs.autodesk.com/3DSMAX/15/ENU/MAXScript-Help/index.html?… F2A2C0A06.htm,topicNumber=d30e621029)
<name> — используется, чтобы называть автоматически построенную локальную переменную, которая будет содержать значение, представляющее элемент управления, и используется для связывания функций обработчика событий с элементом управления.
<label_string> — используется в качестве заголовка, метки элемента или текстового содержимого, в зависимости от типа элемента управления, как описано в разделах для каждого типа.
<parameters> — последовательность аргументов ключевого слова, используемых для установки параметров или влияния макета для элемента управления. Точные параметры, поддерживаемые каждым типом элемента управления, также определяются в разделах для каждого типа.
button 'btn1' "Export Static Collision" pos:[27,21] width:120 height:40 align:#left
Еще нам понадобится обработчик сообщения нажатии кнопки.
on <item_name> <event_name> [ <argument> ] do <expr>
где:
<item_name> — указывает имя элемента, к которому будет подключен наш обработчик “btn1”.
<event_name> — определяет тип события, которое необходимо обработать “pressed”, аргументов в данном случаи не будет.
<expr> — тело функции заключённое в скобки ().
получаем следующее:
on btn1 pressed do ( )
Всё вместе на данный момент:
rollout exportCollisionRollout "Collision Exporter" width:175 height:83 ( button 'btn1' "Export Static Collision" pos:[27,21] width:120 height:40 align:#left on btn1 pressed do ( ) ) createDialog exportCollisionRollout
Теперь нам предстоит создать функционал, который будет производить запись геометрии в файл формата XML. Дальше я не буду описывать всё в деталях и мелочах, так как это уже синтаксис cамого скриптового языка, буду добавлять некие замечания, объяснения, где это необходимо.
Для начала создадим новый метод “fn exportCollision =”. Его задачей будет получить имя файла, в который мы будем производить запись, получить 3д объект коллизии, который мы будем записывать, выставить трансформацию для объекта и, конечно, вызвать метод, который и произведёт запись.
fn exportCollision = ( clearListener() local fileName = (getSaveFileName types:"Static Collision|*.xml") local collObj = selection[1] if collObj != undefined then ( if fileName != undefined then ( local colTransform = collObj.transform collObj.transform = Matrix3 1 createXMLFile fileName collObj collObj.transform = colTransform ) else ( messagebox "Bad file name." title:"Information" ) ) else ( messagebox "Nothing to export! You haven't selected any object!" title:"Information" ) )
Пояснения:
local collObj = selection[1] — тут происходит захват первого объекта который выделен во воюпорте и запись его в локальную переменную.
local colTransform = collObj.transform — записываем трансформацию объекта во временную переменную
collObj.transform = Matrix3 1 — назначаем нашему объекту единичную матрицу для того что бы он встал по центру вюпорта x = y = z = 0, убераем также любой поворот, а также маштаб.
createXMLFile fileName collObj — вызываем наш метод для записи меша колизии во файл.
collObj.transform = colTransform — возвращаем объект в изначальное положение.
Примечание: Не всегда статическую коллизию надо выставлять по центру. Перед экспортом в не которых физических движках более эффективно оставлять статику на своём оригинальном положении, как, например, с Bullet Physics.
Метод “createXMLFile”