На каком языке пишутся скрипты для 3ds max

Обновлено: 06.07.2024

MAXScript – встроенный в 3ds max язык написания скриптов. Скрипт – это текстовый файл, обычно с расширением .ms.


  1. Программировать множество действий пользователя, таких как моделирование, анимация, наложение материалов, визуализация (rendering) и др.

  2. Интерактивно контролировать программу из командной строки окна Listener.

  3. Создавать для скриптов стандартный пользовательский интерфейс, размещая его элементы в свитках панели Utility, или в управляющих окнах.

  4. Создавать из скриптов макрокоманды и вставлять их в качестве кнопок на панели инструментов 3ds max.

  5. Расширять или изменять пользовательский интерфейс для объектов (objects), модификаторов (modifiers), материалов (materials), текстур (textures), эффектов визуализации (render effects) и атмосферных эффектов (atmosperic effects).

  6. Создавать дополнения для собственных объектов-сеток (mesh objects), модификаторов и эффектов визуализации.

  7. Создавать свои собственные инструменты импорта/экспорта с помощью встроенного средства ввода/вывода файлов (file I/O).

  8. Писать процедурные контроллеры и с их помощью управлять состоянием всей сцены.

  9. Создавать инструменты групповых вычислений, например, скрипты для последовательной визуализации множества сцен.

  10. Управлять внешними приложениями через механизм OLE Automation.

  11. Записывать свои действия в 3ds max, как команды MAXScript.

  12. Хранить в файлах сцен скрипты, которые будут запускаться при каждом из определенных событий, например, до и после открытия файла сцены, созданием нового файла, после и перед визуализацией, изменением выбранных объектов и т.п.

MAXScript – падающее меню

Open Listener отображает окно MAXScript Listener. Это окно также можно открыть, нажав кнопку ^ F11.

New Script отображает окно MAXScript Editor для записи нового скрипта.

Open Script открывает диалоговое окно File Open. Выбранный скрипт отображается в новом окне MAXScript Editor.

^ Run Script открывает диалоговое окно File Open. Выбранный скрипт прочитывается и выполняется. Все выходные данные печатаются в окне Listener.

Utilities отображает список доступных программ-скриптов (утилит). Имя утилиты не появится в окне до тех пор, пока MAXScript ее не запустит.

Close Закрывает свиток MAXScript и все свитки утилит.

^ Окно MAXScript Listener

Чтобы выделить строку целиком, нужно подвести курсор к ее левому краю (он примет вид стрелки) и щелкнуть один раз. Если щелкнуть, не отпуская, и повести мышкой, выделяться будут сразу несколько строк.

Методом drag-and-drop можно перемещать выделенный текст между частями окна Listener и между окнами Editor и Listener. Если переместить его на панель инструментов 3ds max, создается макроскрипт с этим текстом.

Выделенный текст автоматически загружается в поле поиска, когда пользователь выбирает из падающего меню Search пункт Find или Replace.

^ Некоторые полезные команды

CTRL+B Выделяет текст внутри скобок любого типа. Можно нажимать несколько раз, если есть еще скобки, выделение будет расширяться (В Editor тоже работает).

ENTER Если курсор находится на конце последней строки, она выполняется, в окне Listener печатается выходной текст и курсор переходит на новую строку.

Если курсор находится в другом месте, добавляется новая строка, начиная с его текущей позиции.

^ Number-Pad ENTER Выполняется строка, содержащая курсор.

SHIFT+ENTER То же самое, если текст не выделен. Иначе выполняется только выделенный текст.

? Всякий раз, когда выполняется одна или несколько команд, последний вычисленный результат, отображаемый в окне Listener сохраняется во внутренней переменной ?. Для дальнейшего использования можно присвоить его любой пользовательской переменной: x = ?

Окно MAXScript Editor

^ Некоторые полезные команды

File>Evaluate All, CTRL+E Выполняет весь код из окна MAXScript Editor. Также можно выделить весь текст и нажать SHIFT+ENTER.

^ TAB, CTRL+I Смещает выделенный текст вправо на один шаг табуляции.

SHIFT+TAB, SHIFT+CTRL+I Смещает выделенный текст влево на один шаг табуляции.

^ Number-Pad ENTER Посылает выделенный текст для выполнения в окно Listener, результаты печатаются в конце текущего текста окна Listener. Если текст не выделен, в Listener для выполнения посылается строка, содержащая курсор.

SHIFT+ENTER То же самое.

CTRL+Right-Click Отображает меню со всеми определениями элементов, существующих в данном скрипте: utility, structure, user-interface item, function, handler, plugin, tool, Macro Script, rcmenu. Выберите любой пункт, и его определение окажется в верхней строке окна Editor. Эта возможность упрощает навигацию по большим скриптам.

CTRL+B Выделяет текст внутри скобок любого типа. Можно нажимать несколько раз, если есть еще скобки, выделение будет расширяться.

CTRL+D Перекрашивает текст: комментарии – зеленым, зарезервированные слова – синим, строковые переменные – красным. Изначально весь текст печатается черным.

CTRL+R Помещает курсор в его предыдущую позицию (задается щелчком левой кнопки или операцией поиска). Последовательное нажатие перемещает курсор по последним восьми запомненным позициям. Эта возможность сильно сокращает количество мышиных щелканий.

ESC Нажмите и не отпускайте до тех пор, пока работающий скрипт не закончит выполняться. Кнопка останавливает выполнение любого скрипта, откуда бы его ни запустили.

Если строка длинная, ее можно разбить. Исходная строка: a + b * c / d – e + f * g / h

Можно разбить только после любого оператора. MAXScript будет искать продолжение на следующей строке.

Так работает: a + b * c / d – e + А так не работает: a + b * c / d – e

f * g / h + f * g / h

Можно разбить, добавив символ “\”: a + b * c / d – e \

Несколько выражений можно записать в одной строке, разделив их символом “;”:

print “End of input data reached” to: f; close f; f = undefined

Комментарий первого типа в MAXScript начинается с символов “--” и распространяется до конца строки: a = 5 -- В переменную а записано число 5

/* Комментарий второго типа

может располагаться

на нескольких строках*/

Целые (integer) и вещественные (float) числа

При выполнении простейших математических операций результат, как правило, имеет тот же тип, что и аргументы: 3 + 4 возвращает 7, 3.0 + 4.0 возвращает 7.0. Однако, если совместно используется оба типа чисел, целое понимается как вещественное: 3 + 4.0 возвращает 7.0

variable_name = variable_value -- присвоение переменной значения

variable_name = “Текст” -- строковая переменная

local y = 2, x -- объявление локальных переменных (действуют в текущем блоке)

global bzzz -- объявление глобальных переменных (действуют всю сессию 3ds max)

Имя переменной должно начинаться с буквы или символа “_”. Ее значение – любое число, строка или выражение.

В массиве может содержаться любое количество элементов, каждый любого типа.

a[int] -- элемент массива, int - номер элемента (целое число, нумерация с 1)

Например: a[2] возвращает “four”

Простейшие математические операторы и выражения

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 , где это любое целое или вещественное число. Пример: seed 5

+= добавляет к переменной

-= вычитает из переменной

*= умножает переменную на

/= делит переменную на

Поэтому запись x = x + 1 равносильна записи x += 1

Операторы сравнения

== оба операнда равны

!= оба операнда не равны

левый операнд меньше правого

левый меньше или равен правому

> левый операнд больше правого

>= левый больше или равен правому

^ Логические операторы

and истина, если истинны оба

or истина, если истинен хотя бы один

not истина, если операнд ложен

^ Управляющие конструкции

if then [else ]

if do

Результат выполнения выражения должен быть либо истиной (true), либо ложью (false).

if a > b and a b then

else (print d; x = sin (e))

Выражения, находящиеся внутри круглых скобок, образуют блок. Значение последнего выражения в блоке является значением всего блока. Поэтому можно писать, например, так: if a > (y = sin b; sqrt (y*z)) then print c

case [ ] of ( )

Выражение сравнивается с метками выражений :

new_width = case obj.width of

2: copy $Box01

3: instance $Box01

default: reference $Box01

Выражение после ключевого слова default будет выполнено, если не выполнятся остальные условия. Если default не задано и другие условия не выполнились, выражение case возвращает значение undefined.

Если выражение не задано, метки должны быть булевыми (Boolean) величинами или выражениями, и первая метка, дающая истину, определяет выполняемое выражение . Пример:

(a > b): print “a is big”

(b while -- форма do

while do -- форма while

Циклы while и do повторяют выполнение выражения до тех пор, пока тестовое выражение не возвратит ложь, т.е. пока оно истинно, они работают. Форма do выполняется минимум один раз, вычисляя тестовое выражение в конце каждого прохода. Форма while вычисляет тестовое выражение в начале каждого прохода и может не выполниться ни разу. Обе формы в качестве своего значения возвращают результат выражения после последнего удачного прохода. Форма while возвратит значение undefined, если тестовое выражение ложно изначально и ни одного прохода не выполнится.

Пример 1: Пример 2:

while x (in | = ) (do | collect)

Цикл for повторяет определенное число проходов, которое может задаваться диапазоном чисел, временным интервалом или последовательностью определенных величин, таких, как массив или набор выделенных объектов. Переменной с именем последовательно присваиваются значения из набора , формат которого бывает либо такой: [where ], либо такой: to [by ] [where ]

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

Выражение , стоящее после ключевого слова where, вычисляется перед каждым проходом и должно возвращать либо true – тогда проход просчитывается, либо false – цикл игнорирует текущий проход и переходит к следующему.

^ Пропуск проходов и принудительный выход из циклов

Оператор continue осуществляет мгновенный переход в конец цикла и начинает следующий проход.

for i=1 to 8 do (if i == 5 do continue; print i) -- печатает 1..4, 6..8

while not eof do -- читает данные, пока не дойдет до конца файла

local line=readline f -- считывает одну строку

if line[1] == “-” do continue -- если комментарий, переход на следующую строку

line1=parser1 line -- вызов функции parser1

processobjs line1 -- вызов функции processobjs

Оператор exit немедленно прекращает выполнение любого цикла, даже если тестовое выражение по-прежнему истинно. Он полезен при поиске ошибок в телах циклов. exit [with ]

while x возвращает значение OK.

Выход из цикла for . collect с использованием параметра with возвращает массив величин, собранный на момент выхода.

[mapped ] (function | fn)

> = , где – имя функции, – тело функции,

– ее параметры (их может не быть вообще или быть несколько), которые записываются так:

: [ ] – необязательное значение по умолчанию, если не его задать, возвращается значение unsupplied. Префих mapped означает, что функция будет автоматически повторно вызываться на каждом элементе коллекции, если колЧасть задана в качестве первого аргумента функции.

function add a b = a + b

fn factorial n = if n . Если тело – блок, то значение последнего выражения в блоке. Если нужно найти функцию используется метод showSource , который отображает окно Editor с файлом, содержащим данную функцию и пролистанным до места ее определения – метод полезен, когда много функций находятся в разных файлах.

Чтобы принудительно завершить выполнение функции используется оператор return , где – выражение, которому будет равно значение принудительно завершенной функции. Если return используется в функции с префиксом mapped и колЧасть задана в качестве первого аргумента, возвращаемое значение будет OK, а не .

^ Объекты и классы в объектно-ориентированном программировании

Все величины (values), с которыми работает MAXScript, имеют четко определенный тип, например integer, matrix3, twist. Тип величины – это ее класс. В MAXScript термины величина (value) и объект (object) – синонимы. Объект – особый отдельный представитель класса.

Например, в MAXScript Box – это класс. Это не трехмерный объект в окне проекции 3ds max, а набор характеристик, которыми этот объект box (ящик) обладает. В этих характеристиках заложены способы создания представителей класса Box (объектов box); свойства этих объектов (например, Height – высота, Width – ширина, Length – длина); операции, которые можно с ними производить (например, move – перемещение, copy – копирование, delete – стирание). Чтобы создать объект box, можно написать: b=box()

В этой строке фраза box() – конструктор, который создает объект box и возвращает на него ссылку, сохраняемую в переменной b. Здесь для конструктора не применяются никакие параметры (вроде высоты или ширины), поэтому используются значения по умолчанию, определенные в классе Box. Объект box появляется в окнах проекции 3ds max и с ним можно делать все то же самое, что и с другими трехмерными объектами. Если параметры для конструктора нужно применить, они заменят “()”. Пример: b=box width: 10 length: 100 – создается объект box с указанными параметрами. Все неуказанные параметры используют значения по умолчанию.

Определения

Properties (Свойства): Доступные параметры объектов класса. Например, ширина, длина, высота для ящиков и радиус для сфер.

Methods (Методы): Определения всех функций, которые можно вызывать для объектов класса. Примеры: перемещение или поворот объекта, применение модификатора и получение координат вершин объекта. Термины method (метод) и function (функция) в MAXScript синонимы.

Operators (Операторы): Определения всех математических и других символьных операторов, которые работают с величинами класса. Пример: оператор ”-”, который производит математическую операцию вычитания над числами, цветами, векторами и матрицами, но произведет булево вычитание, когда будет использован совместно с объектами 3ds max.

Constructors (Конструкторы): Различные способы, которыми можно создавать объекты класса. Например: Point3 0 0 0 и as Point3 – конструкторы для класса Point3. Выполнение любого из них создает новый объект Point3.

Literals (Символы): Любая символьная форма объектов класса. Примеры: [0, 0, 0] – символьная форма класса Point3, слово “Hello world” – символьная форма класса String.

^ Операции со строками

as string Конвертирует значение в строку

.count Число знаков в строке (Целое число - только чтение)

== Сравнение двух строк (чувствительно к регистру)

!= Чтобы сделать проверку не зависящую от регистра,

> необходимо конвертировать строки в значения Name

[ ] Возвращает знак с указанной позиции (начиная с 1)

as Конвертирует строку в величину указанного класса

Можно использовать любые числовые классы – Number, Float, Integer. В случае Number подходящий класс определится в зависимости от синтаксиса чисел строки.

copy Создает независимую копию строки и возвращает ее. Пример: newstr = copy oldstr

execute Выполняет содержимое строки, как выражение MAXScript и возвращает результат вычисления.

Примеры: execute “2+2” – возвращает 4

execute “select $Box01” – выделяет объект Box01.

findString Возвращает номер первого символа найденной строки или undefined, если строка не найдена.

Пример: findString “Я обожаю MAXScript” “M” – возвращает 10.

filterSting Разбивает строку на части и возвращает массив строк. Разбиение происходит на основе символов, заданных в строке

substring – возвращает новую строку, содержащую часть исходной строки, начиная с номера и длиной . Если сумма чисел и больше длины исходной строки или для задано отрицательное число, возвращается вся оставшаяся часть строки, начиная с номера .

Пример: s=”Дирижабль”; ss=substring s 2 4 -- “ириж”; ss= substring s 6 -1 --“абль”

Чтобы включить в строку кавычки и другие полезные символы, необходимо использовать символ “\” – обратная косая черта (backslash). Комбинации:

\n -- новая строка

\r -- возврат каретки

\x -- непечатные символы, где - шестнадцатеричный символ (0-9, a-f)

Пример: print “Заключим в кавычки \”фу\” и перейдем на новую строку:\n”

Возвращает: “Заключим в кавычки ”фу” и перейдем на новую строку:

Примеры непечатных символов в строках:

str=”Copyright \xa9 2005, Ist02Works, Inc” --a9 – код символа ©

Следующий пример выводит в окно Listener все непечатные символы и их коды:

Уроки

"Помогите" это значит "Подскажите, вот здесь не получается, вот мой код" ? - Тогда можно и помочь.
или
"Помогите" = "Сделайте мне, я вообще невдупляю ничего в этом" ?

Я подобную работу (Кубик-Рубик (тетраэдр)) на диплом студентке делал за 5000р. и то мне показалось это ещё продешевил.

Юрий Марков

Юрий Марков запись закреплена
Подскажите, как при помощи maxscript вызвать окошко Weight Tool для выделенного в данный момент меша ? Задалбывает каждый раз прокручивать вниз свиток дабы тыкнуть эту кнопку.
Вычитал только что-то вроде skinOps.weightTool но как это дописать без понятия у меня лапки ) Хочется кнопочку сделать на панель инструментов.

Николай Литвинов

Юрий Марков

MAXScript / Max Creation Graph (MCG)

MAXScript / Max Creation Graph (MCG) запись закреплена

Sergey Zhernovoy

Sergey Zhernovoy запись закреплена

Всем привет, хочу поделиться скриптом для 3dsmax : "UV Ultimate Trim" , скрипт написан на питоне, обладает
рядом отличительных особенностей по сравнению с аналогичными. Данный скрипт написал для себя, что бы ускорить
свою работу в 3dsmax , писался скрипт под версию 3dsmax 2021 , в других версиях не проверялся. Скрипт бесплатный,
а исходники можно открыть и ознакомиться, если есть интерес. Инструкция по установке находится в архиве со скриптом.

Показать полностью.
Особенности :
1) Максимум тримов : 1 - 100
2) Выравнивание по трем сторонам : лево, право, центер
3) Отсутп в пикселях сверху и снизу выбранного трима
4) Отсутп в пикселях с левой или правой стороны трима ( опционально )
5) Семь разных подготовленных разрешений для контроля тримов, или использование своего собственного разрешения
6) Работает на текущем выделенном модификаторе UvwrapUVW , нет ограничений на количество UnwrapUVW модификаторов в стеке
7) Работает с множественным выделением объектов
8) Возможность сохранять и загружать ваши настройки в json-файле

Алексей Куликов

Алексей Куликов запись закреплена

Скрипт, который позволит:
Показать полностью.
Вращать сгруппированные объекты (закрытую группу) и выделенную группу НЕ сгруппированных объектов (всех классов) с привязкой к viewport.

Частично данная возможность уже реализован в инструменте Transform Toolbox, но однобоко :( Отсутствует возможность без заморочек повернуть не то, что группу, а просто несколько геом. объектов. Работает только с одной моделью. Очень жаль (

Чтобы не быть обнаглевшим халявщиком, (хотя да, так оно и есть) публикую суть проблемы в коде, который выдрал из макса и подкрутил:

Читайте также: