Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
MAXScript Part 2.doc
Скачиваний:
4
Добавлен:
01.03.2025
Размер:
89 Кб
Скачать
☆

Контекстные выражения

Контекстные выражения являются частью грамматики MAXScript, предназначенной для работы, главным образом, с объектами 3ds max и их свойствами. Суть их в том, что обычное выражение, чаще всего, но не обязательно блоковое, предваряется некой конструкцией языка, которая называется префиксом. Этот префикс устанавливает свойства, которые одинаковы для всех объектов, упоминаемых в выражении, или, говоря научным языком, определяет контекст. Разберем применяемые в MAXScript префиксы по одному.

Animate

Префикс animate можно еще записать как with animate, а применяется он следующим образом. Изменение анимируемых свойств объектов в выражении, которое следует за этим префиксом, приводит к созданию ключей анимации. Для ясности разберем пример.

animate on

( box01.position = [10,10,10]

box02.position = [-10,-10,-10]

)

В данном случае создадутся ключи анимации для перемещения объектов box01 и box02. Обратите внимание на значение on, которое стоит после animate. На самом деле вместо него может стоять сколь угодно сложное логическое выражение, а on – это просто другая форма записи true. Если после animate стоит off или false или логическое выражение, имеющее значение false, то изменения, сделанные внутри выражения, которому предшествует этот префикс, не приводят к созданию анимационных ключей, даже если включена кнопка Animate. Следует отметить, что при использовании этого префикса, кнопка анимации не включается и не выключается, но ключи, тем не менее, успешно создаются.

At time

Префикс at time чаще всего работает в одной упряжке с префиксом animate on. Он устанавливает позицию ползунка на линейке треков для всех изменений, которые происходят с объектами в том выражении, которому он предшествует. Сам ползунок при этом, однако, не двигается. Например

animate on

( at time 0 $box01.position = [ 0 , 0 , 0 ]

at time 10 $box01.position = [ 10 , 10 , 10 ]

)

Приведенный скрипт создает два ключа анимации – один в нулевом кадре и один в десятом. Разумеется, вместо числового значения номера кадра в префиксе at time можно указывать и переменную, и выражение.

At level или in

Данный префикс в любой из приведенных форм записи применяется при работе с иерархиями объектов. В качестве параметра ему задается объект сцены 3ds max. Пусть у нас имеется объект с именем man (человек), который является родительским для руки несколько дочерних объектов – шаров. Предположим наша задача – анимация клоуна, жонглирующего шарами на ходу (Пример не претендует на удачность, а призван проиллюстрировать работу префикса at level).

in $man/hand

( ball1 = sphere( )

ball2 = sphere( )

ball3 = sphere( )

)

Все три созданные сферы будут дочерними по отношению к объекту hand. Таким образом можно не только создавать, но и совершать любые другие действия с уже существующими объектами. Особенно это актуально, если иерархия сложна, а объектов много

Coordsys

Coordsys или in coordsys устанавливает для действия со всеми объектами выражения одну и ту же систему координат. Допустимы следующие формы написания этого префикса

  • coordsys world или in coordsys world – устанавливает мировую систему координат;

  • coordsys local или in coordsys local – устанавливает систему координат, связанную с объектом;

  • coordsys parent или in coordsys parent – устанавливает систему координат, связанную с родительским объектом;

  • coordsys grid или in coordsys grid – устанавливает систему координат, связанную с активной сеткой;

  • coordsys имя объекта или in coordsys имя объекта – устанавливает систему координат, связанную с указанным объектом;

  • coordsys матрица 3х3 или in coordsys матрица 3х3 – устанавливает систему координат, заданную матрицей.

В качестве матрицы может выступать любое выражение, возвращающее матрицу размерности 3х3.

Например, такой скрипт

in coordsys local selection.position.x = random 10 –10

Сдвигает все выбранные объекты по связанной с ними оси x на случайную величину в диапазоне от 10 до -10.

About

Если Вам нужно повернуть или отмасштабировать один или несколько объектов, то, возможно, есть смысл использовать этот префикс. Он применяется в следующих формах

  • about selection – повороты и масштабирования осуществляются относительно центра выбранных объектов;

  • about pivot – повороты и масштабирования осуществляются относительно опорной точки объекта;

  • about coordsys – повороты и масштабирования осуществляются относительно центра системы координат, которая может быть задана префиксом coordsys;

  • about имя объекта – повороты и масштабирования осуществляются относительно опорной точки указанного объекта;

  • about матрица 3х3 – повороты и масштабирования осуществляются относительно центра системы координат, заданной указанной матрицей;

  • about точка в трехмерном пространстве – повороты и масштабирования осуществляются относительно указанной точки.

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

Например, скрипт

about [ 0 , 0 , 0 ] rotate $box01 15 axis_y

повернет объект с именем box01 на 15 градусов относительно оси y вокруг точки с координатами 0, 0, 0.

Undo

Все действия, которые MAXScript совершает с объектами сцены 3ds max, могут быть отменены командой undo из главного меню. Иногда, особенно если манипуляции проводятся с большим количеством объектов, это совершенно лишняя возможность. В этом случае действия, которые надо исключить из списка отменяемых, нужно собрать в выражение, которому предшествует префикс

undo off

Само собой, вместо off, как и для префикса animate, может стоять и false, и любое логическое выражение, его возвращающее. Можно, напротив, включать возможность отмены, используя префикс

undo on

Каскадирование префиксов

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

animate on, at time 100, undo off, coordsys local

( rotate $box* 15 x_axis )

повернет все объекты с именами, начинающимися на box, относительно их осей x на 15 градусов и создаст соответствующие ключи анимации в сотом кадре. Причем эти действия нельзя будет отменить с помощью команды undo.

Вложенные контексты

Контексты могут быть вложены друг в друга. Например

animate on

( at time 10

( in coordsys local move $box01 [10,0,0]

in coordsys local move $sphere01 [10,0,0]

)

at time 20

( in coordsys local move $box01 [20,0,0]

in coordsys local move $sphere01 [20,0,0]

)

)

При этом все функции, как стандартные, так и составленные Вами, вызываемые в текущем контексте, выполняются в этом контексте. Иными словами, если внутри выполняемой функции совершаются какие-нибудь действия с объектами, то они выполняются в том контексте, который на момент обращения к функции, установила вызывающая программа. Впрочем, этого может не происходить, если функция устанавливает свой контекст, отменяющий текущий.

Установка постоянных контекстов

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

set animate on

set time 30

move $box01 [10,0,0]

$box02.bend.angle = 15

set time off

set animate off

Первые две строки включают анимацию и устанавливают позицию ползунка в тридцатый кадр. Третья и четвертая строки перемещают объект box01 на 10 единиц и изгибают box02 на 15 градусов. Последние две строки возвращают контекст в исходное положение. Для того чтобы запомнить текущий контекст можно использовать следующий способ. При установке нового контекста, старый может быть занесен в переменную. Делается это, например, так

OldContext = set coordsys parent

После этого все действия, совершенные с объектами, будут выполняться в системе координат родительских объектов. Когда надо будет вернуться к старой системе координат, надо будет написать

set coordsys OldContext

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]