Пробуем силы в MaxScript

Моим первым скриптом в 3DMax’е была стена по уроку Марины Бондаренко (можно найти в Вконтакте в их группе), но это не самостоятельная работа, а просто переписывание. С этим все понятно, но я хотел бы рассказать про собственный опыт.

Идею я почерпнул на сайте render.ru, из «откровений чайника»: создание петлей из сфер, но обо всем по-порядку. Я не буду разбирать здесь базовые знания из разряда «открыть редактор MaxScript», синтаксиса и прочего; а буду писать то, что, по моему мнению, может действительно вызвать вопросы или вызвало вопросы у меня, после чего пришлось «курить мануал».

Необязательное пояснение

Начальный этап

Идея есть, но ее надо разбить на составляющие. На старте необходимо научится хотя бы создавать сферы. Это делается довольно просто:

Код
Разберем строку: слово Sphere здесь — это команда на создание примитива, все, что идет дальше — параметры создаваемого примитива. Радиус, сглаживание, количество сегментов и прочее (некоторые параметры я сам не знаю зачем, т.к. копипастил этот кусок кода, но все можно найти в мануале), а так же координаты, которые у меня указаны через переменные.

Хорошо, умеем создавать сферы, а дальше то что? Чтобы создать сфер нужное количество, следует запустить цикл. Выглядит это так:

Код

Данный код не будет работать, т.к. не определены переменные x,y,z. Нетрудно догадаться, что каждая переменная отвечает за свою ось. Раз мы хотим сделать замкнутые петли, то нас устроят тригонометрические функции. В данном случае я использовал синусы:

Код

Как видно, x=y=z, а, следовательно, это будут не петли, а прямая, причем очень плотная (сферы радиусом пять в прямой линии от [-1,-1,-1] до [1,1,1]). К тому же, функция sin в MaxScript принимает значения в градусах, и тогда при значении сфер больше 91 они начнут накладываться сами на себя. Попробуем немного модифицировать код и запустить:

Код

И вот результат:

ScriptFail

 

Второй этап

То есть особо-то ничего не поменялось. И вот тут пора что-то кардинально менять. А именно превращать прямую в кривую, да еще и замкнутую. То есть нужно сделать так, чтобы все шары были распределены на 360 (720/1080/и т.д.) градусов по каждой оси, да еще и с разными координатами! На помощь приходит математика (я пропускаю все свои выводы, не об этом пост) и я получаю следующий код:

Код

Чтобы было не страшно, поясняю: spnX.value — значения бегунков в окошке скрипта, о них позже. Сейчас разберемся с математикой:

Переменные с названием step — шаги в градусах для каждой создаваемой сферы по каждой оси, зависящие от количества петлей по этой и количества создаваемых шаров. Таким образом, они распределяются равномерно по всей длине наших петель. Чтобы было понятно, вот результат запуска скрипта с параметрами: 300 сфер, разбросы координат по осям по 100 в каждую сторону от нуля, 1 петля по X, 2 по Y и 3 по Z

ScriptAtWork

 

Создаем интерфейс

В данном случае интерфейс будет являться не только кнопочкой «запустить скрипт», чтобы каждый раз не залезать в редактор, а еще и средством управления переменными: количеством сфер, петель и тому подобного. К сожалению, у меня после сохранения скрипта с подписью полей кириллицей текст превращается в «??? ???», поэтому будет транслит.

Всю необходимую информацию по созданию GUI можно почерпнуть, перейдя по паре ссылок в конце статьи, так что я расскажу только об используемых элементах.

Статья получилась и так не маленькая, переходим к сути. Код интерфейса и его скриншот (функцию анимации рассматривать здесь я не буду, т.к. не до конца разобрался, как это работает):

Код

ScriptGui

Разберем код по составляющим. Ключевое слово rollout создает свиток интерфейса (окошко) со всем своим нутром, счетчиками, кнопками и прочим. Дальше идут строчки, отвечающие за создание счетчиков и кнопок, после чего идет описание функций, которые должны быть вызваны на то или иное событие (в данном случае — на нажатие первой кнопки). Код для нажатия третьей кнопки не привожу.

Почему я подписал «2N волн по оси»? Потому что 360 градусов в функции синуса дает две волны — в одну, и другую сторону относительно нуля. Разброс по осям — уже писал, от [-число] до [+число].

Нюанс, который вызвал затруднения у меня: массивы. В данном случае я объявляю глобальный массив сфер spheres, а потом каждому элементу массива ставлю в соответствие свежесозданную сферу. (Кстати, строчку select spheres стоит вынести за пределы цикла, пока писал статью, доперло)

Да, знаю, глобальные переменные использовать ай-ай-ай, но я не осилил, как здесь можно по-другому. Буду благодарен за советы.

Надеюсь, данная статья поможет чем-то и вам.

Использованные и полезные ссылки
Те самые «откровения чайника» на render.ru — ссылка

Теория MaxScript на русском — ссылка

Официальная справка по MaxScript — ссылка

Группа по MaxScript в ВК — ссылка

 

Обсуждение: есть 1 комментарий

  1. Shishlena:

    Шикарный пост, спасибо! А я лет 6 назад открыла 3dmax… и закрыла. К сожалению. Но благодаря тебе, возможно, начну все с начала

Добавить комментарий

© 2020 CAsperovskii BLOG.RU // Дизайн и поддержка: GoodwinPress.ru