MAX SCRIPT. Пишем экспортер
Данным уроком я хочу продолжить тему геймдева, начатую мной ранее. В принципе урок будет интересен не только людям интересующихся этим направлением 3Д, а всем кто не знаком с MAX SCRIPT и хочет научится писать свои скрипты, которые могут отлично сэкономить время при выполнении рутинных операций и не только.
В прошлом уроке я рассказывал вам о использовании графического движка OGRE и утилиты/плагина под 3DS MAX для экспорта сцен — oFusion. Но у данного подхода есть небольшой, но довольно неприятный минус, это платность этого самого oFusion при использовании его в коммерческих целях. Данный факт не помеха пока вы изучаете и экспериментируете с OGRE, но когда вы захотите наконец написать свой супер мега шутер, или простенькую казуальную игрушку, возникнет вопрос о оплате n-ой суммы за использование oFusion, или же написать свой экспортер. Второй вариант я вижу на много предпочтительней, как в плане экономии денег, так и в плане полного контроля и интегрирования нужных вам функций в экспортер, таких как физика, звук и т.д.
Наш экспортер, как я упоминал ранее, мы будем писать на MAX SCRIPT-е. Это даёт нам много преимуществ: совсем не обязательно знание программирования, простота написания и редактирования, универсальность относительно версий 3DS MAX.
Давайте определимся с «планом работ», а точнее что должен уметь наш экспортер, какие мы будем реализовывать опции и т.д. Самое главное, это экспорт самих моделей в огровский .mesh формат и запись их положения в сцене. Экспорт моделей стандартным огровским экспортером разбит на 2 части, это експорт модели из макса в .xml файл, и последующей конвертации его в .mesh отдельной программкой, что является очень не удобным и забирает много времени. Тем более, что экспортировать можно только по одной модели за раз, что является совсем не допустимым при экспорте большой сцены с множеством объектов. Сама часть создания .xml и конвертации нареканий не вызывает, по этому мы не будем их переделывать, а создадим оболочку, которая по очереди будет экспортировать и конвертировать все имеющиеся в сцене модели. Данные о позиции, ориентации и других параметрах каждой модели мы сохраним в файл со структурой xml, что даст возможность без проблем загрузить всё это в вашу игру.
Начинать мы будем с простого, постепенно добавляя нужные нам возможности. Итак, запускаем 3DS MAX, открываем закладку «Utilities» и нажимаем кнопочку «MAXScript», после чего вы увидите появившийся роллаут MAXScript:
Значения кнопок «New Script», «Open Script», «Run Script» я думаю, в пояснении не нуждаются, их названия говорят сами за себя, а вот кнопочка «Open Listener» открывает окошко содержащее 2 поля. Верхнее поле представляет собой что то типа лога, в которое макс выводит информацию после каких либо действий пользователя, а в нижнем можно вводить команды макс скрипта для одноразового немедленного выполнения. При написании скриптов данное окно желательно держать открытым, так как там будут отображаться ваши ошибки и вообще много полезной информации. Нажимаем кнопочку «New Script», перед нами появится чистый, готовый к работе, текстовый редактор. Предлагаю сразу же сохранить его. Я сохранил его под именем LesExpScene.ms. Сейчас нам надо расставить визуальные элементы управления, кнопки, выпадающие списки ит.д. Для чего выберите Edit->Edit Rollaut из меню редактора скриптов. Это откроет окно Visual MAXScript, где мы быстро и наглядно расставим всё, что нам нужно. Серый квадрат по центру, это и есть наш будущий роллаут. Большинство элементов находящихся в низу данного окна мы разберём по ходу работы. Для начала нам необходимо текстовое поле, чтоб мы могли назвать файл нашей сцены. Для этого нажмите кнопочку «Edit Box» на нижней панели, и нарисуйте прямоугольник, он и будет служить нам полем для ввода текста. Также для более удобного размещения элементов можно использовать кнопку «Grid/Snap» находящуюся в верхней части.
Теперь с правой стороны вы можете видеть параметры нарисованного нами «Edit Box». Сначала дайте имя данному элементу в поле «name», но помните, что мы будем использовать его в тексте скрипта, поэтому давайте узнаваемые имена, чтоб потом долго не вспоминать какой же элемент вы назвали «xyz» или «abc». Я назвал его «scName». В поле «caption» впишите «Scene Name», это надпись которая будет отображаться возле нашего поля. В «width» и «height» установите 200 и 17 соответственно. Сейчас давайте установим два обьекта «Color Picker» которые будут отвечать за выбор Ambient и Background цветов для нашей сцены. Нажмите на нижней панели кнопку «ColorPicker» и нарисуйте 2 прямоугольника. Для первого установите такие параметры:
name — amColor
caption — Ambient Color
width — 120
height — 32
Для второго:
name — bcColor
caption — Back Color
width — 120
height — 32
Нам надо добавить элементы отвечающие за настройку теней, и для более красивого вида нашего экспортера мы объединим их в одну группу, для чего выберите «Group Box» и нарисуйте квадрат побольше. В «caption» впишите «Shadow Settings», поле «name» в данном случае значения не имеет, так как обращаться к нему из скрипта мы не собираемся. Внутри разместите 2 объекта «Drop Down List» один «ColorPicker» и один «Label». «Drop Down List» — это выпадающий список, а «Label» мы используем для более компактного размещения элементов внутри нашей группы, так как «ColorPicker» со стандартным «caption» будет занимать слишком много места. Чтоб вам стало понятней, посмотрите на скриншот:
И установите следующие параметры для данных объектов:
Первый «Drop Down List»:
name — shadowTec
caption — Shadow Technique:
width — 136
height — 40
items — «NONE», «STENCIL_MODULATIVE», «STENCIL_ADDITIVE», «TEXTURE_MODULATIVE», «TEXTURE_ADDITIVE»
В поле «items»мы вписали те пункты, которые будут показаны при развороте списка. Вписывать их надо обязательно в кавычках.
name — shadowSyze
caption — Shadow Texture Syze:
width — 136
height — 40
items — «128», «256», «512», «1024», «2048»
Для элемента «Label» в поле «caption» напишите «Shadow Color». А элементу «ColorPicker» установите «name» — «shadowColor» и поле «caption» сделайте пустым. Разместите всё это так как показано на скриншоте выше. Сейчас самое время сохранить нашу работу. Для этого выбирете File->Save или просто закройте окно Visual MAXScript и на вопрос сохранять ли изменения ответьте Да. Всё нами проделанное выше окажется строками кода макс скрипта в нашем файле. Сохраните его.
Нам осталось разместить всего несколько элементов. Как это делается я думаю больше объяснять не надо, поэтому я приведу только скриншот с их размещением и параметры которые следует установить
Первый Edit Box, для отображения и/или ввода с клавиатуры пути для сохранения продуктов жизнедеятельности нашего скрипта.
name — saveText
caption — save to:
width — 255
height — 17
Кнопка «Browse» для выбора того самого пути.
name — butSave
caption — Browse
width — 80
heiht — 24
Check Box для выбора конвертировать ли модели в .mesh формат после экспорта, или оставить их в XML.
name — convert
caption — Convert XML
width — 96
height — 17
enabled — true
checked — true
Опция «enabled» указывает будет ли активен этот чекбокс или нет. А «checked» выбран ли он.
Второй Edit Box, для отображения пути к программе конвертирования XML в .mesh (Она идёт в комплекте с файлами Огра)
name — XMLText
caption — XML Converter
width — 255
height — 17
Ещё одна кнопка «Browse», для выбора пути к XML конвертеру.
name — butXML
caption — Browse
width — 80
height — 24
Второй чекбокс предназначен для выбора экспортировать ли модели в принципе, или только файл с их размещением и настройками сцены. Экономит время если вы изменили только цвет фона или позицию модели, например.
name — onlyxml
caption — Export XML Scene Only
width — 137
height — 17
И последняя, самая главная кнопка «Export». Её назначение, я думаю, в пояснении не нуждается.
name — expBut
caption — Export
width — 100
height — 30
Всё, с размещением элементов мы закончили. Давайте дадим имя нашему роллауту. Выделите тот серый квадрат в нутри которого мы размещали все элементы и установить ему: name — ExportRollout и caption — FreeS Export Dialog. Сохраните всё это, и окно визуального редактирования можно закрыть.
Наверное вам не терпится увидеть в действии то, что вы так долго делали. Но пока это всего лишь набор строк. Чтоб «дать им жизнь» мы создадим окно, в котором разместится данный ролаут, и установим кнопку для его открытия. Сперва поместите содержимое архива в папку «3DSMAX\UI\Icons».
Это картинка которая будет отображаться на кнопке. Если вы закрыли ваш скрипт, откройте его. Сейчас мы имеем:
rollout ExportRollout «FreeS Export Dialog» width:296 height:528
(
—
— Тут описание всех созданных нами элементов интерфейса.
— Комментарии в МаксСкрипте начинаются с двойного дефиса.
—
)
В самом начале, перед данным текстом, мы должны вписать следующее:
macroScript ExportDialog
category:»FreeS Tools»
internalCategory:»Export Dialog»
— Текст кнопки.
buttonText:»FreeS Ogre Export Dialog»
— Надпись появляющаяся при наведении мыши на кнопку.
tooltip:»FreeS Ogre Export Dialog»
— Иконка отображаемая на кнопке.
Icon:#(«FreeS»,3)
(
— Имя и размеры создаваемого окна.
FreeSOgreExportFloater = newRolloutFloater «FreeS Export Dialog» 300 600;
— Добавляем наш ролаут в окно.
addRollout ExportRollout FreeSOgreExportFloater ;
Сохраните изменения в тексте скрипта, и мы продолжим. Чтобы макс начал использовать данный скрипт нажмите File->Evaluate All. Если вы допустили какую либо ошибку, данные о ней появятся в окне MAXScript Listener. Чтоб не тратить много времени на поиск ошибки в случае её возникновения, сравните свой скрипт с моим:
Нам осталось показать кнопку запуска скрипта, и делается это очень просто. Выберите пункт меню Customize->Customize User Interface. Сейчас мы создадим Toolbar который и будет содержать нашу кнопку, и любые другие, по вашему желанию. Нажмите кнопочку «New» и в появившемся окошке дайте имя создаваемому тулбару, и нажмите «Ок». Появится маленькое окошко, на которое мы можем переместить нужные нам кнопки. В окне «Customize User Interface» в «Category:» найдите «FreeS Tools» (Если вы следовали моим советам, и не назвали категорию в скрипте по другому) и увидите в низу список возможных кнопок в этой категории. В данном случае у вас будет только один пункт, который вы и перетащите мышью в только что созданный тулбар.
Теперь вы можете разместить этот тулбар в любом месте интерфейса 3D Max, а при нажатии на кнопку мы увидим созданный нами роллаут. Правда пока он никак не реагирует на нажатия кнопок, и не может сохранять свои настройки, но сейчас мы это исправим.
Когда передо мной стал вопрос как сохранять настройки отдельных объектов в сцене, то я решил записывать их в User Defined Properties, что очень удобно в плане использования и редактирования. Найти это можно щёлкнув правой кнопкой мыши на каком либо объекте, и в появившемся меню выбрать «Properties. » где вы и найдёте закладку «User Defined». А вот с сохранением настроек сцены было не всё так гладко, но в конце концов я решил что их тоже можно сохранить в User Properties специально созданного для этого объекта, который будет игнорироваться экспортером в качестве меша, и будет служить только контейнером нужных параметров. Я дал ему имя «SceneBox». Создавать его и записывать все параметры мы конечно же будем при помощи MAXScript.
Все наши дальнейшие действия будут базироваться на событиях, которые происходят при выполнении каких либо действий. Например, при нажатии кнопки открывающей наш тулбар происходит событие «open» в этот момент нам надо проверить есть ли в сцене «SceneBox», и если да, то установить всем элементам роллаута сохранённые в нём параметры, а если его нет, то есть роллаут открывается впервые для данной сцены, то надо его создать.
Для проверки присутствия «SceneBox» мы используем конструкцию «try()catch()». В скобках после «try» мы попробуем выбрать этот бокс, и если его не окажется, начнёт выполнятся код находящийся в «catch()», если же операция выбора пройдёт успешно, то «catch()» пропускается, скрипт продолжит свою работу дальше.
Выбирать объект в MAXScript можно многими способами, но в данном случае самым удобным для нас будет выбор по имени. Чтоб MAXScript понял что мы обращаемся именно к имени, перед ним надо ставить знак «$»
Записывать данные в User Properties мы будем таким образом:
setUserProp /переменная или имя объекта/ /имя параметра/ /значение параметра/
А читать так:
значение параметра = getUserProp /переменная или имя объекта/ /имя параметра/
Каждый из созданных нами ранее элементов интерфейса содержит множество параметров, и обращение к ним происходит через точку, то есть:
Цвет объекта «shadowColor» в формате RGB можно получить так:
shadowColor.color
Чтоб получить только синий параметр цвета:
shadowColor.color.b
При сохранении и загрузке цветов мы будем делать это отдельно для каждого элемента RGB, так как корректно загрузить цвет записанный одной строкой мне не удалось.
Итак, после строк описания интерфейса, перед скобкой закрывающей роллаут мы пишем:
Сохраните все изменения, сделайте File->Evaluate All и попробуйте поизменять параметры в созданном нами окне. Всё должно сохраняться и загружаться. Если у вас что то не работает, или вы получили сообщение о ошибке, посмотрите на мой файл скрипта, возможно вы упустили какую либо деталь.
Последнее что нам осталось сделать, это установить реакцию на нажатие кнопки «Export», но в силу обширности темы, этим мы займёмся в следующем уроке.
Если у вас возникнут какие либо вопросы, задавайте их на мой e-mail:
frees_les@mail.ru
А также читайте справку по макс скрипту, там много полезной информации, и всё довольно хорошо и подробно описано.
Спасибо всем кто дочитал до конца 🙂 , удачи вам в ваших начинаниях.
Источник статьи: http://render.ru/ru/a.pidvirnyy/post/11801
3ds Max Script, с чего начать
Вне сомнений, макс скрипт это замечательное расширение стандартных возможностей 3ds Max. Используя его, можно не ограничиваться доступными инструментами создания, редактирования, позиционирования и анимирования 3d объектов.
Это не упрощенный вид программирвоания. Это программирование на определенном уровне . Другими словами, ты не будешь прописывать адреса ячеек памяти и производить базовые операции с двоичными данными. Программирование будет происходить на уровне объектов (суб-объектов) в 3ds Max — как раз тем, с чем сталкивается каждый рядовой тридешник.
По замыслу, Maxscript может быть использован и без опыта программирования. Это так. Однако, базовые знания принципов программирования обязательны. Без понимания того, что такое переменные, их типы, массивы и их индексы, операции присваивания, сравнения, условные конструкции и циклы, получить что-то стоящее не выйдет 🙄
Все же, никто не мешает начать осваивать программирование именно с Max Script, особенно если вооружиться толковой литературой 👍
Я бы сказал даже не так. Max Script хоть и встроен в 3ds Max, это функция скорее для разработчиков программного обеспечения, нежели для пользователей.
Тридешнику, который занимается 3d, а не разработчику, который занимается разработкой, именно для его работы, макс скрипт не нужен. Визер или моделлер не должны в нем разбираться.
Максскрипт для тех, кто хочет написать плагин, сделать новую функцию, автоматизировать какое-то действие и т.д.
Если у тебя есть большое желание автоматизировать или упростить некоторые операции в работе 3ds Max, тебе стоит воспользоваться плодами тех, кто уже умет программировать на Max Script, и заглянуть на Мекку макскриптеров – специализированный ресурс ScriptSpot. Там такое количество скриптов и плагинов для макса, что у тебя глаза разбегутся.
Особой прелестью этого ресурса является то, что подавляющее большинство скриптов и плагинов там – бесплатны 😉
Там наконец-то нормальным понятным языком обьясняется что такое все эти переменные, массивы и прочая фигня — а то иногда возьмешь какую-нибудь книгу например по C++ или Delphi, сразу сталкиваешься с непонятками, что-как-и откуда?
Типа книги были написаны не для новичков — а вот как раз для новичков у нужно было написать хотя бы несколько книг о базовых понятиях в программировании на нормальном языке, а не умничать.
Вообщем-хотел сказать что сам MaxScript нужен думаю многим 3d-шникам, так как хоть они могут быть и моделлерами или матерриаловедами-но чисто для себя могли бы упростить жизнь.
Лично я взялся за него именно с этой целью — а то есть некоторые вещи, которые в максе делать уже просто задолбался — например что-то нудное и долгое, а так сценарий написал — нажал на кнопочку и готово.
Опять же с разрешения администрации я бы хотел, чтобы здесь люди могли развивать данную тему и чтобы ее не закрывали, только потому что она и близко не стоит рядом с обычным рабочим процессом как в Максе, так и в V-ray-е, но все же может тоже помочь чем-то кому-то в процессе работы в Максе.
Сам же я хочу тоже внести свой вклад в эту тему-и если надыбаю ещё информации о книгах или чём-то полезном, выложу здесь ссылочки (опять же если нужно будет указать источник или автора информации, укажу) правила публикации я знаю и уважаю
Разумеется, если ты ссылаешься на что то авторское, то авторство следует указывать в обязательном порядке.
Темы мы не закрываем, по этому не волнуйся, она будет тут всегда.
Если ты что-то надыбаешь прикольное, то обязательно делись. Но главное, кроме авторства, не просто давать ссылку не полезность, а и давать ей описание от себя. То есть высказывать своем мнение что это, зачем нужно и как тебе лично оно помогает в работе 😉
Вообще любой скрипт можно вынести кнопкой на панель инструментов макса самостоятельно.
Если скрипт верно написан, то там должна быть прописана категория в которой находится кнопка скрипта.
category:»MyScripts»
ButtonText:»Скрипт Артема 🙂»
Тогда можно добавить кнопку этого скрипта на панель инструментов 3ds Max. Просто вытащив его на нее.
Запускаешь скрипт MAXScript=>Run Script… Идешь в нужную папку и запусакешь свой скрипт.
Теперь он есть в Toolbars UI.
Открываешь UI — правая кнопка на панели инструментов=> Customize. В появившемся окне Customize User Interface => вкладка Toolbars. В ней просто ищешь кнопку твоего скрипта, в его категории, в нашем примере это MyScripts и через Drag-and-drop, кидаешь ее в нужное место на панели инструментов.
Если хочешь создать свою панель, то просто там же в Toolbars, жми кнопку New… и создаешь свой тулбар, задав ему имя.
Вот классное видео, посмотри. Там все вполне наглядно:
1 – по ссылке качаешь RegularizeEdgeLoop.zip
2 – переименовываешь его а RegularizeEdgeLoop.mzp
3 – драг энд дропом кидаешь RegularizeEdgeLoop.mzp во вюпорт
4 – создаешь/берешь Editable Poly обект
5 – переходишь на уровень редактирования ребер/границ/граней (edge/border/polygon)
5 – нажимаешь правую клавишу мышки и в левом нижнем кваде, в самом низу находишь пункт Regularize
Видео выше показывает не универсальный способ установки подходящий для всех скриптов, а добавление кнопки скрипта на панель инструментов.
Инструкция по установки самого скрипта находится в его описании на странице его скачки 😁
ЗЫ: я проверил скрипт – все работает 😉
Всем привет. Я сам не программист вообще и в математике не очень силён, и думал, что у меня не получится создавать скрипты самому.
Но почитал, поизучал азы MaxScript и основ объектно-ориентированного программирования, начинал с простой переделки уже готовых скриптов. А сейчас если вижу, что если например, несколько схожих операций можно одной кнопкой делать, то пишу скрипт, объединяющий эти операции. Как оказалось, не так страшен этот чёрт, как его малюют. Очень сильно помогает MaxScript Help, в котором можно прочитать что делает каждая функция и найти нужную.
Я даже не представлял на сколько расширяет возможности знание даже элементарных основ MaxScript
Вот мои скрипты, которыми я постоянно пользуюсь и сам для себя создал (всего лишь примерно за пол-года)
Суперцель моего сообщения в том, чтобы объяснить, что не нужно бояться и думать, что в MaxScript нужен какой то особый дар и гибкий ум математика и программиста. Нужо всего лишь желание и интерес (собственно как и в любом другом деле). Всем удачи.
Источник статьи: http://ru.renderstuff.com/3dsmax-script-chego-nachat-314/