Напишем expression для нижнего (подчиненного) цилиндра.

Выберите р2 и откройте Expression Editor.

Введите следующий текст:

if(р1 .ty-p2.ty>2) p2.ty=p1.ty-2; Нажмите Create и сразу установите в меню Expression Editor режим Select Filter=>By Expression Name.

На «человеческом языке» это читается так: если расстояние по вертикали между первым и вторым цилиндром больше двух, переместить второй цилиндр точно на две единицы ниже первого.

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

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

Поэтому для улучшения читаемости нажмите Reload и исправьте текст следующим образом.

if(р1.translateY-р2. translateY>2) { p2.translateY=p1 .translateY-2; }

Некоторые из вас, наверное, заметили, что MAYA самостоятельно «перегрузила» наш expression в «длинную» форму. Меня такое поведение регулярно бесит, однако что поделаешь - пока что приходится мириться с этакой бестактностью.

Перемещайте верхний цилиндр по вертикали.

Теперь нижний следует за ним, если расстояние между цилиндрами превышает 2. Однако это работает лишь при движении цилиндра pi вверх. Добавим в наш expression еще одну строку:

if(р1.translateY - р2.translateY > 2) { p2.translateY=p1 .translateY-2; }

if(p1.translateY - p2.translateY <-2) { p2.translateY=p1.translateY+2; }

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

Не забывайте нажимать кнопку Edit после каждого исправления текста!

Примечание. Взрослые мальчики, конечно, могут тут же начать оптимизировать код с помощью функций abs() (абсолютная величина) или sign () (знак выражения), однако «читабельность» команд от этого испортится, а оптимизация коснется только количества знаков в тексте.

Теперь нижний цилиндр послушно следует за верхним и вниз и вверх.

В принципе, задача решена и пытливые умы быстро сообразят, как написать дополнительные expressions для добавочных цилиндров. Я лишь добавлю «марафет» и прокомментирую некоторые моменты.

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

$scale=p1 .scaleY+p2.scaleY;

if(p1.translateY-p2.translateY>$scale) { p2.translateY=p1 .translateY-$scale;}

if(p1.translateY-p2.translateY<-$scale) { p2.translateY=p1 .translateY+$scale;}

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

Немного "Почистим» сцену.

Наши цилиндры должны перемещаться только по вертикали и могут менять размер.


⇐ вернуться назад | | далее ⇒