- •Часть 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
Создание вспомогательных объектов-пустышек Dummy
Вспомогательные объекты не визуализируются. Их можно и нужно использовать для хранения значений положения и поворота.
Свойство: <dummy>.boxsize – размер пустышки (Point3). По умолчанию [10,10,10]
Пример: d=dummy pos: [10, 20, 30] rotation: (quat 10 [10, 10, 10]) --кватернион
b=box(); b.rotation=d.rotation; b.position=10*d.position
Изменение общих параметров анимации
animationRange -- получить текущий диапазон анимации (interval 0f 100f)
animationRange = interval 10 50 -- задать диапазон анимации от 10-го кадра до 50
frameRate -- количество кадров в секунду (целое число)
animateonRange.start -- начальный кадр анимации (величина только для чтения)
animationRange.end -- конечный кадр анимации (величина только для чтения)
Анимация вершин сплайнов
Чтобы получить доступ к анимации вершин объекта класса SplineShape, необходимо воспользоваться методом animateVertex, который задает диапазон анимируемых вершин. Впоследствии к этим вершинам можно применять различные контроллеры анимации.
animateVertex <shape> <vertex_spec>, где <vertex_spec> – индекс, массив индексов или ключевые слова #all или #selected (соответствуют всем или только выбранным вершинам). У каждой вершины сплайна есть три индекса: для входящей касательной, самой вершины и выходящей касательной. Индексы всегда следуют друг за другом строго по порядку, в случае нескольких сплайнов сначала для всех вершин первого сплайна в объекте класса SplineShape, потом для второго и т.д.
После определения диапазона анимируемых индексов, становятся доступными свойства вершин и касательных. Вот, например, свойства первых двух вершин первого сплайна объекта $Circle01, которые можно анимировать:
Свойство: Тип: Значение:
$Circle01.Spline_1___InVec_1 Point3 [-75,33,0]
$Circle01.Spline_1___Vertex_1 Point3 [-75,33,0]
$Circle01.Spline_1___OutVec_1 Point3 [-50,0,0]
$Circle01.Spline_1___InVec_2 Point3 [-20,-33,0]
$Circle01.Spline_1___Vertex_2 Point3 [7,-66,0]
$Circle01.Spline_1___OutVec_2 Point3 [32,-95,0]
Пример анимации вершин и касательных объекта из двух сплайнов – окружностей:
animateVertex $Circles #(4, 10, 14, 20)
animate on
( at time 0 ($Circles.spline_1___InVec_2.z = 50)
at time 100 ($Circles.spline_1___InVec_2.z = -50)
at time 0 ($Circles.spline_1___InVec_4.z = -50)
at time 100 ($Circles.spline_1___InVec_4.z = 50)
at time 0 ($Circles.spline_2___Vertex_1.z = 50)
at time 100 ($Circles.spline_2___Vertex_1.z = -50)
at time 0 ($Circles.spline_2___Vertex_3.z = -50)
at time 100 ($Circles.spline_2___Vertex_3.z = 50) )
Примеры контроллеров анимации path constraint и link constraint
--Анимация движения объекта по пути при помощи контроллера path constraint:
thePath=$line01 -- объект line01 будет являться путем
theObj=$Box00 -- объект Box01 будет перемещаться по пути
theObj.pos.controller=path follow:true constantVel:true loop:true -- контроллер
PosCont=theObj.pos.controller -- записываем контроллер в переменную
PosCont.path=thePath -- заносим путь в контроллер
PosCont.axis=0 -- выравниваем локальную ось Z объекта по пути
animate on -- анимируем
( at time 0 PosCont.percent=0 -- в кадре 0 - 0% пути
at time 100 PosCont.percent=100 ) -- в кадре 100 - 100% пути
--Связь объекта с другими на время при помощи контроллера link constraint
b=box pos: [-100, 0, 0]; d1=dummy pos:[0, 0, 0]; d2=dummy pos:[0, 0, 0]
animate on
( at time 0 d1.rotation=quat 0 [0, 0, 1]
at time 25 d1.rotation=quat 90 [0, 0, 1]
at time 25 d2.rotation=quat 0 [1, 0, 0]
at time 50 d2.rotation=quat 180 [1, 0, 0] )
b.transform.controller=Link_Constraint(); links=b.transform.controller
sliderTime=0f; links.AddTarget d1 0 --связываем Box01 с Dummy01 в кадре 0
sliderTime=25f; links.AddTarget d2 25 --связываем Box01 с Dummy02 в кадре 25
sliderTime=50f; links.addWorld frameNo: 50 --убираем связь с Dummy02
animate on
( at time 51 move b [0, 0, 0]
at time 100 move b [100, 0, 0] )
