
- •Часть 1
- •Окно maxScript Listener
- •Окно maxScript Editor
- •Простейшие математические операторы и выражения
- •Пропуск проходов и принудительный выход из циклов
- •Часть 2 Функции
- •Объекты и классы в объектно-ориентированном программировании
- •Определения
- •Операции со строками
- •Операции с массивами
- •Команды 3ds max в maxScript
- •Часть 3 Создание свитков
- •События
- •Элементы интерфейса
- •Часть 4 Сплайны
- •Класс SplineShape
- •Часть 5 Простейшие диалоговые окна
- •If queryBox “Хотите продолжить?” beep:false then ... Некоторые из методов работы с объектами
- •Характерные точки объектов
- •Системы координат
- •Координатные сетки
- •Определение угла между двумя векторами
- •Представление ориентации при помощи кватернионов (quaternions)
- •Создание вспомогательных объектов-пустышек Dummy
- •Изменение общих параметров анимации
- •Анимация вершин сплайнов
- •Примеры контроллеров анимации path constraint и link constraint
- •Методы print и format
Простейшие математические операторы и выражения
С числами
4/3 * pi * 2.5^3 -- формула объема сферы радиусом 2.5. Возвращает 49.0874
3 as string -- возвращает “3”
Со строками
a = “MAXScript”; b = “ FOREVER”
a + b -- возвращает “ MAXScript FOREVER”
“3” as float -- возвращает 3.0
“3.56” as integer -- возвращает 3
Создание случайных чисел
Тип числа зависит от типа первого аргумента в операторе random
random 1 100 -- возвращает случайное целое число между 1 и 100
random 1.0 100 -- возвращает случайное вещественное число между 1 и 100
Числа будут одинаковыми всякий раз при перезагрузке 3ds max. Чтобы избежать этого, можно использовать оператор seed <number>, где <number> это любое целое или вещественное число. Пример: seed 5
Приращения
<переменная> += <выражение> добавляет <выражение> к переменной
<переменная> -= <выражение> вычитает <выражение> из переменной
<переменная> *= <выражение> умножает переменную на <выражение>
<переменная> /= <выражение> делит переменную на <выражение>
Поэтому запись x = x + 1 равносильна записи x += 1
Операторы сравнения
<compare_operand> == <compare_operand> оба операнда равны
<compare_operand> != <compare_operand> оба операнда не равны
<compare_operand> < <compare_operand> левый операнд меньше правого
<compare_operand> <= <compare_operand> левый меньше или равен правому
<compare_operand> > <compare_operand> левый операнд больше правого
<compare_operand> >= <compare_operand> левый больше или равен правому
Логические операторы
<logical_operand> and <logical_operand> истина, если истинны оба
<logical_operand> or <logical_operand> истина, если истинен хотя бы один
not <logical_operand> истина, если операнд ложен
Управляющие конструкции
if <if_expr> then <expr> [else <expr>]
if <if_expr> do <expr>
Результат выполнения выражения <if_expr> должен быть либо истиной (true), либо ложью (false).
Пример 1:
if a > b and a < c do (print d; print e)
if a == b then c = 0
a = (if d == 0 then 0 else a / d)
Пример 2:
if a > b then
(
print c
x = sqrt (c)
)
else (print d; x = sin (e))
Выражения, находящиеся внутри круглых скобок, образуют блок. Значение последнего выражения в блоке является значением всего блока. Поэтому можно писать, например, так: if a > (y = sin b; sqrt (y*z)) then print c
case [ <case_expr> ] of ( <cases> )
Выражение <case_expr> сравнивается с метками выражений <cases>:
<factor>: <expr>
default: <expr>
Пример:
new_width = case obj.width of
(
2: copy $Box01
3: instance $Box01
default: reference $Box01
)
Выражение после ключевого слова default будет выполнено, если не выполнятся остальные условия. Если default не задано и другие условия не выполнились, выражение case возвращает значение undefined.
Если выражение <case_expr> не задано, метки должны быть булевыми (Boolean) величинами или выражениями, и первая метка, дающая истину, определяет выполняемое выражение <expr>. Пример:
case of
(
(a > b): print “a is big”
(b < c): print “b is little”
(c <= d*3): ...
default: ...
)
Циклы
do <expr> while <test_expr> -- форма do
while <test_expr> do <expr> -- форма while
Циклы while и do повторяют выполнение выражения <expr> до тех пор, пока тестовое выражение <test_expr> не возвратит ложь, т.е. пока оно истинно, они работают. Форма do выполняется минимум один раз, вычисляя тестовое выражение в конце каждого прохода. Форма while вычисляет тестовое выражение в начале каждого прохода и может не выполниться ни разу. Обе формы в качестве своего значения возвращают результат выражения <expr> после последнего удачного прохода. Форма while возвратит значение undefined, если тестовое выражение ложно изначально и ни одного прохода не выполнится.
Пример 1: Пример 2:
x = -10 do
while x < 0 do (
( print x exchanged = false
x += 1 for i=1 to imax do
) (
j=i+gap
if (compare array[j] array[i]) do
(swap array[j] array[i];exchanged=true)
)
)
while exchanged
for <var_name> (in | = ) <sequence> (do | collect) <expr>
Цикл for повторяет определенное число проходов, которое может задаваться диапазоном чисел, временным интервалом или последовательностью определенных величин, таких, как массив или набор выделенных объектов. Переменной с именем <var_name> последовательно присваиваются значения из набора <sequence>, формат которого бывает либо такой: <expr> [where <expr>], либо такой: <expr> to <expr> [by <expr>] [where <expr>]
Примеры:
for i = 1 to 10 do print i -- последовательность чисел
for item in array1 do x = x + item.height -- последовательность элементов массива
for t in 0f to 100f by 5f do ... -- временной интервал (0–100) через каждые 5 фреймов
Следующий пример собирает объекты в массив bigones:
bigones = for obj in $box* -- для всех объектов, чье имя начинается с box
where obj.height > 100 collect obj -- собирать объекты с высотой больше 100
Выражение <expr>, стоящее после ключевого слова where, вычисляется перед каждым проходом и должно возвращать либо true – тогда проход просчитывается, либо false – цикл игнорирует текущий проход и переходит к следующему.