Урок из книги "Основы 3ds Max 8 MAXScript": Преобразования и анимация

Эта глава посвящена реализации принципов анимации средствами MAXScript. Анимация организуется в 3ds Max с помощью одного из множества классов контроллеров, доступных в окне Track View и на панели Motion либо автоматически назначаемых средствами 3ds Max, когда пользователь выбирает кнопку Animate для расстановки ключевых кадров анимации. Все эти классы контроллеров доступны и в MAXScript.

Задание

После изучения этой главы вы должны уметь следующее.

n Работать с преобразованиями перемещением, вращением и масштабированием в MAXScript

n Точно рассчитывать вращения

n Изменять точку опоры объекта или ось его вращения

n Создавать и удалять ключевые кадры анимации

n Работать с контроллерами

n Работать с разными типами касательных

Введение

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

Кроме того, в этой главе вы научитесь устанавливать и применять контроллеры для специальной настройки анимации.

Свойства преобразований изменением положения и масштабированием

Для всех геометрических объектов, независимо от их типа, имеются следующие свойства положения и масштаба:

.pos
.position – то же, что и .pos
.scale

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

Преобразование изменением положения

Положение объекта может быть установлено двумя способами.

n Непосредственно с помощью свойства .pos или .position

n Косвенно с помощью метода move

В главе 1 вы научились устанавливать положение любого объекта непосредственно с помощью свойства .pos или .position:

s = sphere()
s.pos = [150, 10 , 0]
s.pos.x = 200

А с помощью метода move это делается следующим образом:

move s [10.0, 10.0, 10.0]

Перечень аргументов метода move состоит из ссылки на перемещаемый объект и величины этого перемещения в виде данных типа Point3. Следует, однако, иметь в виду, что метод move перемещает объект не в точку с координатами [x, y, z], а на величину [x, y, z]. Следовательно, если применить данный метод несколько раз, объект будет непрерывно перемещаться на указанную величину.

Значение свойства положения задается явно и не увеличивается всякий раз.

Для того чтобы воспользоваться свойством pos и методом move, выполните следующее упражнение.

1. Установите 3ds Max в исходное состояние.

2. Введите в приемнике команд следующую строку кода:

s = sphere()

3. Введите следующий ряд строк кода:

s.pos.x = 25
s.pos.x = 25
s.pos.x = 25

При выполнении данной строки кода три раза подряд сфера устанавливается в точке с координатой x = 25.

4. Введите следующий ряд строк кода и нажмите клавишу <Enter> после каждой из них:

move s [25, 0, 0]
move s [25, 0, 0]
move s [25, 0, 0]

В итоге сфера переместится на 75 единиц по оси X.

Преобразование масштабированием

Свойство масштаба (scale) определяет сжатие или растяжение объекта вдоль указанной оси. По умолчанию значение составляющих X, Y и Z свойства масштаба равно 1,0, что соответствует масштабу 100% объекта по каждой из осей координат. Если установить значение одной из составляющих свойства масштаба равным 2,0, исходный масштаб объекта увеличится вдвое, а если установить ее значение равным 0,5, то исходный масштаб объекта сократится наполовину.

Масштаб объекта можно изменить по всем трем координатам следующим образом:

s.scale = [2.0, 1.0, 0.5]

Аналогично положению, масштаб указывается в виде данных типа Point3. В приведенном выше примере объект растягивается в два раза вдоль оси X, не изменяет свой размер вдоль оси Y и сокращается вдоль оси Z. Если же объект требуется растянуть только вдоль оси X, для этого достаточно ввести следующую строку кода:

s.scale.x = 2.0

Для пропорционального масштабирования объекта достаточно умножить свойство масштаба на требуемую величину:

s.scale = 3.0 * s.scale -- или
s.scale *= 3.0

Приведенный выше фрагмент кода означает следующее: “Установить новое значение свойства масштаба, которое в 3 раза больше его текущего значения”. При этом объект масштабируется по всем трем осям.

Аналогично свойству pos и методу move для свойства масштаба имеется соответствующий метод scale. Данный метод реализуется следующим образом:

b = box()
scale b [1.0, 2.0, 3.0]

В этом фрагменте кода параллелепипед масштабируется на разную величину в направлении каждой из осей координат. Свойство .scale и метод scale действуют таким же образом, как и свойство .position и метод move, а именно: значение свойства задается явно в виде данных типа Point3, а метод изменяет это значение с указанным приращением.

Для масштабирования объекта выполните следующее упражнение.

1. Введите в окне приемника команд следующую строку кода:

b = box()

2. Для того чтобы установить свойство масштаба, введите и вычислите следующую строку кода:

b.scale = [2, 2, 2]

В качестве результата в приемнике команд возвращается значение [2, 2, 2] данного свойства.

3. Для того чтобы вновь установить масштаб, введите следующую строку кода:

b.scale = [2, 2, 2]

В приемнике команд по-прежнему возвращается значение [2, 2, 2].

4. Примените метод scale, введя следующую строку кода:

scale b [2, 2, 2]

В приемнике команд возвращается значение [4, 4, 4].

Преобразование вращением

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

Как и для изменения положения и масштаба, для вращения объектов в MAXScript предусмотрены два способа.

n Установка свойства .rotation объекта явным образом

n Применение метода rotate

При изменении положения и масштаба значения по каждой из осей X, Y и Z всегда выражаются одним числом, например 1,0 или 34,5. А вращение на определенное количество градусов вокруг конкретной оси выражается несколькими способами, причем с разной интерпретацией величины вращения. Итак, для вращения объекта имеются следующие методы.

n EulerAngles

n Кватернионы

n AngleAxis

Метод EulerAngles

Метод EulerAngles является, вероятно, самым понятным и лучше всего соответствующим тем операциям вращения, которые можно выполнять и наблюдать в интерфейсе 3ds Max.

Конструктор класса EulerAngles воспринимает три аргумента, выражаемые в градусах (по одному для каждой из осей). Эти значения используются в данном методе для вращения объекта на указанное число градусов вокруг заданной оси в системе мировых координат:

b.rotation = eulerAngles 0 45 0

В приведенной выше строке кода объект поворачивается на 45° вокруг оси Y в системе мировых координат. Вращение по методу eulerAngles проще всего понять, поскольку оно соответствует вращению объектов, наблюдаемому в видовых окнах.

Результат вращения по методу eulerAngles можно присвоить переменной, чтобы затем использовать в другом объекте:

ang = eulerAngles 0 45 0
b.rotation = ang

Переменная ang в действительности представляет собой объект MAXScript, имеющий тип данных вращения.

Углы вращения вокруг нескольких осей указываются следующим образом:

ang = eulerAngles 30 20 44

При установке ключевых кадров анимации с помощью метода eulerAngles изменение вращения между двумя последовательными ключевыми кадрами ограничивается углом 180°, поскольку в методе eulerAngles используется кратчайший путь перехода от одного ключевого кадра к другому.

Для того чтобы повернуть объект методом eulerAngles, выполните следующее упражнение.

1. Введите в приемнике команд следующий фрагмент кода, чтобы создать цилиндр и переменную euAngle:

c = cylinder height:50
euAngle = eulerAngles 0 45 0

В итоге значение угла поворота типа eulerAngles присваивается переменной euAngle.

2. Введите следующую строку кода, чтобы повернуть цилиндр:

rotate c euAngle

Когда объект поворачивается подобным методом, сначала происходит его вращение вокруг оси X, затем вокруг оси Y и наконец вокруг оси Z. Это обстоятельство очень важно иметь в виду, потому что от перестановки порядка вращения меняется результат. Иными словами, вращение вокруг оси Y после вращения вокруг оси X дает иной результат, чем вращение вокруг оси X после вращения вокруг оси Y.

Свойство вращения

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

euAngle = eulerAngles 30 45 60
rotate b euAng

можно заменить выражениями, в которых свойство вращения устанавливается непосредственно:

b.rotation.x_rotation = 30
b.rotation.y_rotation = 45
b.rotation.z_rotation = 60

При таком способе установки свойства вращения угол поворота ограничивается величиной 360°.

Для проверки ограничения угла поворота величиной 360° выполните следующее упражнение.

1. Установите 3ds Max в исходное состояние.

2. Создайте стандартный параллелепипед, введя в приемнике команд следующую строку кода:

b = box()

3. Переместите ползунок временной шкалы к кадру 100, включите режим Auto Key (Автоматическая расстановка ключевых кадров), а затем введите следующую строку кода:

b.rotation.z_rotation = 720

4. Выключите режим Auto Key и воспроизведите анимацию.

Объект не вращается.

5. Переместите ползунок временной шкалы к кадру 100, включите режим Auto Key, а затем введите следующую строку кода:

b.rotation.z_rotation = 450

6. Выключите режим Auto Key и воспроизведите анимацию.

Объект повернется только на 90°, поскольку полный его оборот на 360° игнорируется (450 – 360 = 90).

Ограничения, присущие методу EulerAngles

Выполнение эйлерова вращения вызывает особые трудности как внутри 3ds Max, так и в MAXScript. Эти трудности связаны с тем, что при вращении объекта вокруг одной оси соответствующие изменения происходят относительно остальных осей. Данный факт иллюстрирует следующее упражнение.

1. Установите 3ds Max в исходное состояние.

2. Откройте окно приемника команд MAXScript Listener.

3. Создайте в окне вида сверху плоский и длинный параллелепипед, введя следующую строку кода:

b1 = box length:100 width:75 height:25

4. Создайте копию параллелепипеда:

b2 = copy b1

5. Переместите вновь созданную копию параллелепипеда в сторону от оригинала:

b2.pos.x = 100

Такие размеры обоих параллелепипедов позволят вам лучше представить себе вращения, выполняемые в данном упражнении.

6. Выберите команду Graph EditorsðTrack View - Dope Sheet (Редакторы графических представленийðВид трека — Подготовительная таблица) из главного меню 3ds Max. Разверните иерархию треков в окне Track View вплоть до треков анимации вращения объекта Box01.

В итоге должны быть видны треки X Rotation, Y Rotation и Z Rotation. В данный момент значения углов вращения данного объекта вокруг всех трех осей равны нулю.

7. Выберите локальную систему опорных координат, введя в приемнике команд следующую строку кода:

set coordsys local

8. Введите в приемнике команд следующую строку кода:

b1.rotation = eulerAngles 45 0 0

Параллелепипед повернется на 45° вокруг оси X мировых координат. Соответствующее значение на треке X Rotation в окне Track View изменится до -45.

Далее вам предстоит повернуть параллелепипед вокруг его оси Y.

9. Введите в приемнике команд следующую строку кода:

b1.rotation = eulerAngles 0 45 0

Казалось бы, в результате этого вращения соответствующее значение на треке Y Rotation должно было бы измениться до 45, однако вместо этого значения на треках X Rotation, Y Rotation и Z Rotation стали равны около -54,74, -30,00 и 35,26 соответственно.

Рамочная система координат

Для того чтобы понять, что же произошло с параллелепипедом в предыдущем упражнении, воспользуйтесь в следующем упражнении рамочной системой координат, в которой точнее всего представлены результаты эйлерова вращения объектов на сцене вокруг осей X, Y, Z.

1. Выделите второй параллелепипед (т.е. объект Box02).

2. Разверните иерархию треков в окне Track View вплоть до треков анимации вращения объекта Box02.

3. Щелкните на кнопке Select and Rotate (Выделить и повернуть) и выберите вариант Gimbal (Рамочная система координат) из раскрывающегося списка Reference Coordinate System (Система опорных координат) на основной панели инструментов 3ds Max. Гизмо этой системы координат похож на гизмо локальной системы координат, но это сходство заканчивается, как только начинается вращение объекта.

4. Поверните второй параллелепипед в любом видовом окне на 45° вокруг его оси X.

5. Затем поверните второй параллелепипед на 45° вокруг его оси Y.

На треках анимации вращения данного объекта в окне Track View появятся значения 45, 45 и 0. Как видите, второй параллелепипед повернулся иначе, чем первый параллелепипед в локальной системе координат.

При вращении объектов в любой системе координат значения из текущей системы координат преобразуются внутри 3ds Max в значения рамочной системы координат для отображения на треках X Rotation, Y Rotation и Z Rotation, причем это делается совершенно незаметно для пользователя. А судить об этом можно лишь по соответствующим значениям на треках в окне Track View.

6. Перейдите от локальной к рамочной системе координат и обратно, повернув в каждой из них оба параллелепипеда. Об отличиях во вращении в обоих системах координат можно судить по их гизмо. Так, в рамочной системе координат происходит следующее.

Вслед за вращением вокруг оси Y поворачивается также гизмо оси X.

Вслед за вращением вокруг оси Z поворачиваются также гизмо осей X и Y.

Объясняется это тем, что эйлерово вращение вокруг осей X, Y, Z должно выполняться поочередно и в определенном порядке. По умолчанию контроллер Euler XYZ выполняет соответствующие расчеты для вращения в следующем порядке: XYZ.

Из приведенного выше упражнения следует, что единственный способ точного расчета вращения вокруг нескольких осей состоит в использовании конкретных значений, представленных в рамочной системе координат. Вращение вокруг только одной оси (например, вокруг локальной оси Z параллелепипеда) можно достаточно точно выполнить в локальной системе координат. Но для вращения вокруг нескольких осей необходимо выбрать рамочную систему координат, чтобы получить точные значения углов вращения вокруг осей X, Y и Z.

Блокировка рамки

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

1. Выберите вариант Gimbal из раскрывающегося списка Reference Coordinate System на основной панели инструментов 3ds Max.

2. Выделите объект в любом видовом окне и поворачивайте его вокруг оси Y до тех пор, пока гизмо оси X не совпадет с гизмо оси Z.

Итак, существенный недостаток рамочной системы координат состоит в том, что при вращении вокруг оси Y на 90° положение гизмо осей X и Z совпадает, а следовательно, они обозначают одну и ту же ось вращения. Такая ситуация называется блокировкой рамки и в значительной степени ограничивает выбор видов вращения, которые можно выполнять.

Подобного осложнения можно в какой-то степени избежать, изменив порядок следования осей вращения. Так, если заранее известно, что объект должен, скорее всего, повернуться на 90° вокруг оси Y, порядок следования осей можно изменить на следующий: YZX или YXZ, чтобы первым выполнялось вращение вокруг оси Y. Это позволяет исключить блокировку рамки при вращении объекта на 90° вокруг оси Y. Но если затем повернуть объект на 90° вокруг оси Z или X, блокировки рамки избежать не удастся.

Это основная причина, ограничивающая применение рамочной системы координат для представления процесса вращения.

Локальные вращения

Во всех приложениях трехмерного моделирования и анимации, включая 3ds Max, имеется собственное представление локального вращения, т.е. поворота вокруг локальных осей объекта. Но как было только что показано, вращение в локальной системе координат не дает истинных значений для треков X Rotation, Y Rotation и Z Rotation в окне Track View. В этом смысле локальное вращение не позволяет правильно судить о происходящем.

С другой стороны, рамочная система координат дает более точное представление об истинных значениях вращения вокруг осей X, Y и Z, хотя вращение в этой системе вокруг нескольких осей рассчитывается в определенном порядке. Если изменить порядок расчетов, конечная ориентация объекта, скорее всего, окажется другой.

Таким образом, точного способа представления конкретного локального вращения с помощью значений эйлерова вращения вокруг осей X, Y и Z не существует. В силу особого характера расчетов вращения в трехмерном пространстве этим недостатком страдают буквально все приложения трехмерного моделирования и анимации.

Кватернионы

Во время работы с объектами сцены непосредственно в пользовательском интерфейсе 3ds Max ограничения, присущие эйлерову представлению вращения вокруг осей X,Y и Z, зачастую никак не мешают поворачивать объекты и получать вполне предсказуемые результаты. Для этого просто выбирается система координат, наиболее подходящая для конкретной ситуации, и далее вращение выполняется визуально для достижения желаемого результата.

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

И в этом случае на помощь приходит метод представления процесса вращения с помощью кватернионов. Кватернионы явно обозначают всякое возможное вращение, что позволяет точно и однозначно задать вращение вокруг осей X, Y и Z.

Значение кватерниона выражается в виде угла и значения типа Point3, описывающего некий вектор:

quat <угол> <вектор>

Векторная часть данного выражения относится к выражению типа Point3. Отдельные значения в выражении типа Point3 всегда находятся в пределах от -1 до 1. Ниже приведены некоторые примеры обозначения кватернионов:

quat 30 [1, 0, 0]
quat 30 [0.266917, 0.534798, 0.801715]

Для того чтобы лучше понять кватернионы, представьте себе сферу с вектором, направленным от центра сферы к ее поверхности. Векторная часть кватерниона обозначает направление вектора, в угол — количество градусов, на которое объект должен повернуться вокруг данного вектора.

Если векторное значение состоит из единицы и двух нулей, то вектор нетрудно себе представить направленным вдоль одной из осей X, Y или Z. При этом 1 определяет ось, вдоль которой вектор направлен. Так, векторное значение [1, 0, 0] направляет вектор вдоль оси X.

В более сложном вектором выражении, как, например, [0.266917, 0.534798, 0.801715], вектор направлен из воображаемого центра сферы к точке поверхности, определяемой данным выражением типа Point3. Объект будет вращаться вокруг данного вектора на количество градусов, определяемых угловым значением кватерниона. В приведенных выше примерах это угловое значение равно 30.

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

Векторные значения

Векторные значения кватернионов следует рассчитывать очень аккуратно. Квадратный корень из суммы квадратов всех составляющих должен быть равен 1. Так, из приведенного выше примера кватерниона quat 30 [0.266917, 0.534798, 0.801715] можно установить, что

квадратный корень из суммы (0.266917)2 + (0.534798)2 + (0.801715)2 = 1

Это ограничение объясняется тем, что длина вектора должна быть всегда равна 1. Следовательно, длина вектора всегда равна квадратному корню из суммы x2 + y2 + z2.

Правильное определение векторных значений кватерниона — занятие долгое и утомительное. Поэтому для упрощения расчетов применяется метод normalize.

rot_vect = normalize [10, 14, 5]
q = quat 90 rot_vect

Предопределенные значения углов вращения

В MAXScript имеется ряд предопределенных глобальных переменных. К ним относятся три следующие переменные: x_axis, y_axis и z_axis. Они представляют значения типа Point3, обозначающие вращение вокруг соответствующих осей:

x_axis представляет[1, 0, 0]
y_axis представляет[0, 1, 0]
z_axis представляет[0, 0, 1]

В любом выражении, описывающем вращение, выражение типа Point3 можно заменить соответствующей переменной. Зная это, данное выражение можно использовать для составления следующего выражения:

q = quat 45 x_axis

Аналогично методу eulerAngles, объект кватернионного вращения может быть присвоен любому вращаемому объекту.

b = box()
q = quat 45 x_axis
rotate b q

Выражения в качестве аргументов

Нередко оказывается удобнее сократить два или более оператора сценария до одного. В MAXScript это нетрудно сделать при вызове функций. Во всех приведенных выше примерах переменные или явно указываемые числовые значения были приведены в качестве аргументов. Но в этом качестве можно использовать и выражения. Выражение представляет собой конструкцию для вычисления значения. Так, если в приемнике команд ввести quat 20 x_axis и нажать клавишу <Enter>, в ответ появится сообщение об успешном выполнении команды.

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

В первом сценарии сначала создается кватернионный объект, а затем параллелепипед, который далее поворачивается на следующую величину:

rot = quat 30 y_axis
b = box rotation:rot

А во втором сценарии то же самое делается с помощью выражения в конструкторе:

b = box rotation:(quat 30 y_axis)

В выражении quat 30 y_axis вычисляется кватернион, поэтому его можно ввести вместо аргумента функции. Данное выражение сначала вычисляется внутри 3ds Max, а затем его значение присваивается свойству вращения. Такое выражение следует указывать в круглых скобках, чтобы 3ds Max было проще распознать его начало и конец. Где и как часто следует использовать подобные выражения, зависит от ваших целей и стиля программирования.

Кватернионы имеют свои ограничения. В частности, углы можно указывать только в пределах от -180° до 180°. Если же требуется повернуть объект на угол, который превышает данный 360-градусный диапазон, придется воспользоваться методом AngleAxis.

Метод AngleAxis

Если объект нужно повернуть на угол более 360°, в таком случае можно воспользоваться объектами класса AngleAxis. Такие объекты реализуются подобно кватернионам следующим образом:

ang = angleaxis 30 [1, 0, 0]
ang = angleaxis 30 x_axis

Оба приведенных выше выражения равнозначны, поскольку в обоих случаях создается объект ang, который обеспечивает вращение на 3 вокруг оси X.

Для вращения объекта по методу AngleAxis выполните следующее упражнение.

1. Установите 3ds Max в исходное состояние.

2. Введите следующую строку кода в приемнике команд, чтобы создать стандартный параллелепипед:

b = box()

3. Включите режим Auto Key и переместите ползунок временной шкалы анимации к кадру 100. Введите в приемнике команд следующую строку кода:

b.rotation.x_rotation = 720

4. Воспроизведите анимацию.

Объект не вращается.

5. Переместите ползунок временной шкалы анимации к кадру 100. Если режим Auto Key все еще включен, введите в приемнике команд следующий фрагмент кода:

ang = angleaxis 720 [1, 0, 0]
rotate b ang

6. Выключите режим Auto Key и воспроизведите анимацию.

Объект совершит два полных оборота.

Контексты

У всякого геометрического объекта имеется своя точка опоры, которая представляет собой точку, вокруг которой происходит

464 0 850 4
2
2009-01-27
Спасибо за урок!
2009-05-15
класс!хочу такую книгу!более разжёванного варианта я не видел!
RENDER.RU