Потому выберите оба цилиндра, выделите в Channel Box все атрибуты, кроме translateY и scaleXYZ, и сначала заблокируйте их (Lock Selected), а затем спрячьте от греха подальше, то есть удалите из Channel Box (Hide Selected).
Посмотрим, как можно быстро добавить несколько звеньев в наш телескоп и при этом затратить минимум энергии на создание и редактирование новых expressions.
Сначала выделите все уже отлаженные команды в Expression Editor и скопируйте их в буфер обмена (Ctrl-c).
Выберите цилиндр р2 и сдублируйте его с помощью операции Edit=>Duplicate.
Появится новый цилиндр - с именем рЗ.
Откройте Expression Editor и нажмите кнопку Hew Expression.
Вставьте скопированный текст (Ctrl-v) в поле Expressions: .
Теперь его надо исправить так, чтобы он устанавливал зависимость третьего цилиндра от второго. То есть имя р2 надо исправить на рЗ, а имя р1 - на р2.
$scale=p2.scaleY+p3. scaleY;
if(p2.translateY-рЗ.translateY>$scale) { p3.translateY=p2.translateY-$scale; }
if(p2.translateY-рЗ.translateY<-$scale) { p3.translateY=p2.translateY+$scale;}
Если вы проделали эту кропотливую процедуру правильно, третий цилиндр будет двигаться за вторым, точно так же, как второй за третьим.
Теперь цилиндры двигаются как система вложенных поршней, и управляющим является первый цилиндр. Если такая модель вас устраивает, сохраните файл (telescope_v1 .та) и далее можете ограничиться только чтением.
Дело в том, что владельцы раритетных ныне транзисторных радиоприемников справедливо заметят, что в телескопической антенне цилиндры складываются «все вместе», как матрешки, в один цилиндр у основания и выдвигаются из него по очереди. Что ж, исправим текущие формулы, дабы достичь глобального консенсуса с радиолюбителями.
Выберите в Expression Editor по очереди оба expressions и исправьте их текст следующим образом:
$scale=p1 .scaleY+p2. scaleY;
if(p1.translateY-p2.translateY>$scale) { p2.translateY=p1.translateY-$scale; }
if(p1 .translateY-p2.translateY<0) { p2.translateY=p1.translateY; }
$scale=p2.scaleY+p3.scaleY;
if(p2.translateY-p3.translateY>$scale) { p3.translateY=p2.translateY-$scale; }
if(p2.translateY-p3.translateY<0) { p3.translateY=p2.translateY; }
Теперь второй логический оператор проверяет, не опустился ли верхний цилиндр ниже нижнего, и если да, то «прицепляет» нижний к верхнему.
Сохраните сцену (telescope_v2.ma).
Если вам захочется покрутить антенну или прикрепить ее к радиоприемнику, то, очевидно, лучше всего объединить цилиндры в группу и ориентировать группу «хитрым» способом. Выберите все три цилиндра, сгруппируйте их: Edit=>Group.
Перетащите пивот группы в основание нижнего цилиндра.
Чтобы ловко вращать антенну за конец или основание, воспользуемся констрейнами. Выберите сначала локатор, затем только что созданную группу и выполните Constrain=>Aim Constraint.
Если параметры этой операции были заданы по умолчанию, цилиндры «лягут» на бок. Чтобы направить их на локатор, найдите в Channel Box атрибуты объекта group1_aimConstraint1 и задайте offsetZ= -90.
Подробнее про использование констрейнов читайте в соответствующем разделе.