После этого, с помощью операции EditPolygons=>Extrude, превратите тарелку в другой вид посуды, например, в рюмку или бутылку. Вся анимация «устаканивания» будет успешно унаследована новой формой.
Сохраните сцену (plateFinal.ma). И попытайтесь отказаться от навязчивых мыслей о дальнейших усовершенствованиях.
Скорость объекта. Использование expressions для ориентации объекта по направлению движения. Работа с динамическими атрибутами Если перемещение объекта анимировано по ключам, никакой информации о скорости объекта у нас нет. Мы можем лишь узнать позицию объекта в каждом кадре. С помощью expressions можно вычислить скорость, ускорение и другие «динамические» свойства объекта, анимированного «традиционным» способом. Эти свойства можно затем использовать, например, для автоматического разворота объекта «носом» по направлению движения (то есть необходимо только проанимировать положение объекта по ключам, а вращение будет получаться автоматически).
Создайте полигональный конус.
Чтобы определить его будущую скорость, необходимо знать его положение в предыдущем кадре. Это положение удобно сохранять в дополнительном атрибуте, а скорость вычислять как разницу между двумя позициями - в текущем и предыдущем кадрах.
Добавьте к конусу три динамических атрибута (Modify=>Add Attribute), назовите их oldX, oldY, oldZ.
Создайте довольно примитивный expression:
pConel .oldX=pCone1 .translateX;
pConel .oldY=pCone1 .translateY;
pConel .oldZ=pCone1 .translateZ; Пока этот expression абсолютно бесполезен, ибо просто копирует текущее положение конуса в дополнительные атрибуты в каждом кадре. Однако если мы допишем некоторые формулы перед этими строками, то сможем использовать «старую» позицию конуса перед тем, как она обновится.
Создайте локатор.
Допишите в expression еще три строчки:
locatorl ,translateX=pCone1 .oldX;
locatorl .translateY=pCone1 .oldY;
locatorl .translateZ=pCone1 .oldZ;
pConel ,oldX=pCone1 .translateX;
pConel .oldY=pCone1 .translateY;
pConel .oldZ=pCone1 .translateZ; Как следует из этих незамысловатых формул, локатор будет всегда отставать от конуса ровно на один кадр.
«Подергайте» за конус, чтобы в этом убедиться.
Поставьте несколько ключей на перемещение конуса, задав «быстрые» и «медленные» участки. Теперь можно воспользоваться тем фактом, что направление скорости - это вектор идущий от локатора в центр конуса.
Таким образом, если мы заставим конус «смотреть» на локатор, он будет всегда ориентирован «по скорости», то есть поворачиваться по направлению движения. Проще всего это сделать с помощью Aim Constraint.
Выберите локатор, затем конус и выполните Constrain=>Aim Constraint с параметрами по умолчанию. Чтобы конус повернулся «макушкой» от локатора, задайте в Channel Box для объекта pConel_aimConstraint1 значение offsetZ=90. Опять «подергайте» за конус и убедитесь, что он теперь поворачивается макушкой по ходу движения.
Задача решена. Осталось, как обычно, навести блеск.
Теперь вы можете как угодно ставить ключи на перемещения конуса - вращения при этом будут получаться автоматически, и вам не нужно будет дополнительно разворачивать объект и ставить ключи на атрибуты rotate.