MAXScript - упрости себе жизнь, или откровения "чайника"

Предполагается, что читатель разбирается в программировании и 3D студии макс. Если нет, то это его проблемы, так как это статья, а не справочное пособие, и описывать всё-всё я не собираюсь :)

Подался я как-то в глобальную сеть Интернет, дабы нарыть инфу про 3Д студию Макс 5. Искал всё подряд - рисование, рендеринг и прочее. Наткнулся на интересную тему MAX Script, инфы почти ноль - всё про стекло, металл и прочую белиберду. А все, что было - сухие переводы стандартного хелпа по MAX Script. Хе, хе - вот, исходя из этого, я и решил написать откровения "чайника" о том, как с ним бороться.

Вообще 3D Studio Max жутко "гибкая" штука, и, судя по всему, создатели уделяют большую часть внимания этой гибкости, а не удобствам пользователя. Нет, я ни в коей мере не хочу задеть чувства тех, кто уже давно моделирует на 3D Studio Max, просто я "чайник" и это мои ощущения :) Но, так или иначе, в гибкой 3D студии, есть гибкий скриптовый язык, MAX Script, где при помощи команд вы сможете создавать объекты, управлять ими и вообще делать всё, что может делать 3D студия.

Так, для начала предупреждаю всех - я делаю это в первый раз, поэтому могу ошибаться :) Для полного ощущения крутости сделаем всему этому интерфейсик. Я пока нашел два способа изготовления интерфейса, первый: вручную, а второй способ - это при помощи приблуды визуального моделирования под названием "Visual MAX Script", которую можно найти в разделе "Утилиты" (молоток), нажав кнопку More, там в списке он у меня последний.

Но перед тем как начинать создавать интерфейс, я расскажу Вам немного программировании на MAX Script. Правда, я сам мало что знаю про это, хе хе хе.

Вообще, чтобы создать скрипт, на панели утилит есть кнопка MAX Script, который откроет вкладку с утилитами для создания скриптов.

Кратко опишу что тут и зачем:
Open Listener - позволяет тестировать скриптовые команды и записывать ваши действия в скрипт. Довольно полезная штука, помогает когда неохота лезть в хелп.
New Script - открывает редактор с пустым скриптом.
Open Script - открывает скрипт для редактирования.
Run Script - запускает скрипт.
Utilites - понятия не имею, что это такое :)
Close - закрывает панель MAX Script:

Для прикола давайте создадим новый скрипт, и попробуем что-то сделать, а точнее, напишем такой код:

for i = 1 to 10 do (
x=random 1 100.0
y=random 1 100.0
z=random 1 100.0
Sphere radius:20 smooth:on segs:32 chop:0 slice:off sliceFrom:0 sliceTo:0 mapCoords:off recenter:off pos:[x,y,z] isSelected:on
)

Теперь сохраните скрипт и запустите его: Ну как, всё получилось? Хе хе, вот и ваш первый скрипт, который рисует шарики с радиусом 20 по случайным координатам от 0 до 100, по всем осям. Многие скажут : "и в чём тут прикол, такое и мышкой можно быстро сделать:". Для таких любителей напишем наш код по-другому:

for i = 1 to 300 do (
x=sin (i*3*2.6)*100
y=cos (i*3*2.2)*100
z=cos (i*3*1.2)*100
Sphere radius:5 smooth:on segs:8 chop:0 slice:off sliceFrom:0 sliceTo:0 mapCoords:off recenter:off pos:[x,y,z] isSelected:on
)

Ну как, слабо Вам сплести такую загогулину вручную?!! Если нет, то начинайте.

А я пока вернусь к теме интерфейса - кажется, именно об этом я говорил выше :) Давайте подумаем - в последнем примере, чтобы получить разные загогулины нужно поменять пару значений, да и перерисовать всё нафиг. Конечно, можно поменять значения прямо в скрипте, но это нудно, а я говорил о красоте и понтах :)

Ну дык вот, есть в MAX Script возможность создавать всякие кнопочки, окошечки и прочие заморочки. Делается это примерно так.

rollout unnamedRollout "Ролаут :)" width:162 height:130
(
button btn1 "Кнопка" pos:[24,88] width:120 height:32
editText Привет "Хелло" pos:[5,10] width:148 height:22
checkButton ckb1 "CheckButton" pos:[24,48] width:120 height:32
on unnamedRollout open do
x=10
on btn1 pressed do
x=12
)
createDialog unnamedRollout width:162 height:130

Запустите этот скрипт, и увидите что получится. Попробую коротко описать что тут и как.
unnamedRollout - это "разворот" (поле), на котором находятся разные кнопочки окошечки и прочее (компоненты).

Button - кнопка.
EditText - окошко с текстом который можно водить
checkButton - кнопка которая может быть зажать или отпущена.

Каждая компонента имеет свои свойства и события.

on btn1 pressed do - если кнопка нажата, то x=12
x=12

Если вы не разбираетесь в объектно-ориентированном программировании, то попытаюсь коротко объяснить. Свойства (Propertis) это координаты компонента, состояние, текст и прочие фишки управления компонентом, а события (Events) это то, что происходит - например, нажатие на кнопку, изменение текста и прочие действия, которые мы вытворяем с нашими компонентами, вплоть до наведения на них мышкой. Подробнее о компонентах можно узнать в разделе помощи 3D Studio Max, в разделе MAX Script Reference. Там надо смотреть в разделе Creating Max Tools/Scripted Utilities and Rollouts. Я это читал, нихрена толком не понял, так как хелп перенасыщен всем подряд, да и строить окошки вручную лень. На этом, думаю, пока закроем тему о ручном создании всяких там окошек и вернемся к Visual MAX Script, о котором я говорил ранее.

По началу у нас пустой роллаут, на который нам нужно перетащить нужные нам компоненты. Компоненты расположены на панели компонентов.

Там есть такие штучки.

Пойду по порядку, картинки выдирать не буду, лень :)

Стрелка - Позволяет изменять размер компонентов
Bitmap - Картинка. Можно нарисовать свою или загрузить текстурку..
Button - Просто кнопка, на которую можно нажимать, также можно загрузить картинку или написать надпись:
MapButton - Кнопка выбора карты текстуры
MaterialButton - Кнопка выбора материала.
PickButton - Кнопка выбора чего-то из сцены.
CheckButton - Кнопка с двумя положениями, зажата или нет.
ColorPiker - Выбор цвета.
ComboBox - Выбор пункта из списка.
DropDownList - Список, выпадающий вниз.
ListBox - Ещё один вид списка в виде листинга.
Label - Метка для создания надписей на форме.
GroupBox - Панель для группы компонентов.
CheckBox - Галочки
RadioButtons - Точки-переключатели, можно выбрать только одну
Spiner - контроль над значением выбранного параметра при помощи управляющих стрелок.
Progress Bar - индикатор в виде полоски
Slider - бегунок которым можно что-то выбрать
Timer - таймер
Ole - Ole контейнер
User - что-то созданное пользователем:

Подробнее описывать мне в лом, мы интерфейс делаем или кнопки изучаем?!! Все-таки злой я :)

Ладно, давайте что-нибудь сделаем.
Давайте дорабатывать наши шарики, на пустой роллаут выносим следующие компоненты - 3 штуки типа Spiner и одну кнопку Button. Теперь, если мы выделим Edit Text, то в правой части экрана появятся его свойства, в поле Caption для первого Spiner мы напишем "Коф X", для второго "Коф Y" и для третьего "Коф Z". А для кнопки в поле Caption введём "Создать".
Так или иначе, у вас должно было получиться нечто вроде такого:

Получилось? Молодца, теперь идём на закладку Event Handlers, выделяем нашу кнопку "Создать" и в списке появившихся событий выбираем Pressed, а в появившееся окошко вводим код события.

for i = 1 to 300 do (
x=sin (i*3*spn2.value)*100
y=cos (i*3*spn3.value)*100
z=cos (i*3*spn4.value)*100
Sphere radius:5 smooth:on segs:8 chop:0 slice:off sliceFrom:0 sliceTo:0 mapCoords:off recenter:off pos:[x,y,z] isSelected:on
)

Узнали наш код, всё то же, но с маленькими изменениями. Формула расчёта пути по x, y, z содержит множитель spn2.value, spn3.value и spn4.value. Это значения, хранящиеся в наших Spinner'ах. У каждого элемента в наше форме есть название, оно дается программой автоматически, но вы свободно можете изменить его на другое. Для этого просто нужно изменить поле name в закладке Value, это там где мы вводили caption.

У каждого компонента есть свойства, к которым мы можем обращаться по имени компонента через точку. Например, значение компонента Spinner хранится в поле Value, ну мы и говорим скрипту, умножай на spn2.value, и т.п.

Ладно, нажимаем Ok. В теории наш RollOut готов. Сохраняем его на диске с названием test.vms, а затем сохраняем его как test.ms. Дважды сохраняемся потому, что Visual MAX Script не сможет открыть файл формата ms, и мы не сможем больше что-то изменить в форме. Теперь закрываем Visual MAX Script и открываем наш скрипт для доводки в 3D Studio Max.

У нас получилось нечто вроде:

rollout unnamedRollout "Untitled" width:160 height:128
(
button btn8 "Создать" pos:[32,96] width:104 height:24
spinner spn2 "Коф X" pos:[24,16] width:128 height:16
spinner spn3 "Коф Y" pos:[24,40] width:128 height:16
spinner spn4 "Коф Z" pos:[24,64] width:128 height:16
on btn8 pressed do
(
for i = 1 to 300 do (
x=sin (i*3*spn2.value)*100
y=cos (i*3*spn3.value)*100
z=cos (i*3*spn4.value)*100
Sphere radius:5 smooth:on segs:8 chop:0 slice:off sliceFrom:0 sliceTo:0 mapCoords:off recenter:off pos:[x,y,z] isSelected:on
)
)
)

Если мы сейчас запустим скрипт, то ничего не произойдёт, так как мы сделали только описание ролаута. Нужно добавить еще одну строчку, чтобы сказать максу, как использовать этот скрипт.
И вот эта строка:

createDialog unnamedRollout width:160 height:128

которая говорит максу, что нужно создать диалог, размером 160 на 128 с нашим ролаутом.

Также нужно немного довести наши Spinner'ы, указав параметр Range [0,100,2.6] для spn2,
Range [0,100,2.2] для spn3 и Range [0,100,1.2] для spn4.
Сделать это нужно так:

spinner spn2 "Коф X" pos:[24,16] width:128 height:16 range:[0,100,2.6]
spinner spn3 "Коф Y" pos:[24,40] width:128 height:16 range:[0,100,2.2]
spinner spn4 "Коф Z" pos:[24,64] width:128 height:16 range:[0,100,1.2]

где:
первое значение - минимальное, что можно ввести
второе значение - максимальное, что можно ввести
третье значение - это значение по умолчанию, которое будет установлено сначала.

Теперь сохраняем наш скрипт, и запускаем его.
Ура!!! Работает. У меня, по крайней мере, работает. Теперь передаём привет нашим творцам, которым я ранее предложил нарисовать шарики вручную, они наверное ещё корпят. Для тренировки можно попробовать самим модифицировать скрипт, сделать возможность управления количеством шариков, количеством граней и т.п.

Уф, устал, ладно, на первый раз хватит :) Ах да, тут натыкал ещё одну штучку, для того чтобы создавать ролауты. Когда мы открываем новый скрипт, то в меню EDIT есть пункт Edit Rollout и New Rollout, воспользовавшись этим пунктом у нас открывается Visual MAX Script, а текст скрипта сохраняется прямо в текст скрипта. Забавная штука, даже работает: хе хе хе:


Автор: VDragon
http://v2studia.narod.ru


576 0 850 9
8
2006-02-18
Не плохо! для "чайника"... =)
2007-01-18
Круто!! А как на счёт моделирования с помощю Макс Скриптов ?? Это возможно? Было бы не плохо если бы ты написал об этом :)
2008-10-24
можно с помощью Maxscript делать скелеты?
2010-07-19
Класно . Было бы не плохо ещё по этой теме ...
2010-11-05
Урок - просто супер!!! Много доходчивых иллюстраций, чувствуется, что автор - с эстетическим чувством. Надо бы еще... ___________ P.S. Похожая информация есть на сайте HTTP://WWW.COMPART.AT.UA/PUBL, но тоже мало!
2011-01-24
Кстати, для создания массивов можно использовать и другие объекты! Вот здесь некоторые из них: [url=http://www.compart.at.ua/publ/bazovye_znanija/i/osnovnye_obekty/4-1-0-4/]http://www.compart.at.ua/publ/bazovye_znanija/i/osnovnye_obekty/4-1-0-4/[/url]
2013-02-10
[quote]Bitmap - Картинка. Можно нарисовать свою или загрузить текстурку..[/quote] Как подгружать картинку в Bitmap??? Что-то у меня не совсем получается!!! (((
2013-02-10
Как сделать так чтоб параметры морфинга можно было перекинуть на свою кнопку а лучше слайдер???
RENDER.RU