Предполагается, что читатель разбирается в программировании и 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, а
текст скрипта сохраняется прямо в текст скрипта. Забавная штука, даже
работает: хе хе хе:
Источник: http://www.render.ru/books/show_book.php?book_id=46 |