Внимание! Вы находитесь в архиве форума aeclub.net
Действующий форум находится здесь

История благодарностей участнику Tango ::: Спасибо сказали: 1 раз(а)
Дата поста: В теме: За сообщение: Спасибо сказали:
10.08.2009, 21:06 Скрипты и готовые решения для AE
как бы не совсем скрипт...но зато вполне себе готовое решение для АЕ smile.gif
озадачился я тут было анимацией персонажа, и в силу специфики исходного материала было принято решение осуществить эту самую анимацию с помощью Puppet Tool. прежде я с этим инструментом никогда не сталкивался и трудоемкость процесса анимации конечностей оказалась для меня сюрпризом. сюрпризы я не люблю, поэтому по моему заказу мой товарищ написал необходимые экспрешены, которыми и хочу поделиться с согласия автора.

итак, суть автоматизации в том, что анимация руки или, скажем, ноги, осуществляется по трем точкам (Puppet Pins) -- плечо/бедро (Puppet Pin 1), локоть/колено (Puppet Pin 2) и кисть/ступня (Puppet Pin 3). далее, вращение и изгиб конечности осуществляется перемещением только третьей точки (кисть/ступня). вторая (локоть/колено) при этом совершает естественное движение благодаря экспрешенам, а третья -- неподвижна, выполняет роль оси вращения.
собственно, для наглядности небольшой ролик:
[attachmentid=7106]
это сделано всего лишь анимацией Position для Puppet Pin 3, что упрощает и ускоряет работу весьма и весьма.
теперь, собственно, решение:

1. к своему изображению конечности применяете Puppet Tool и создаете Puppet Pins таким образом, чтобы их нумерация соответствовала указанным выше "суставам".

2. создаете Null Object и переименовываете его в "Puppet Controller" -- к нему привязан Puppet Pin 3, так что вся ручная анимация, собственно, именнео с помощью этого налла и будет осуществляться.

3. создаете еще один Null Object и переименовываете его в "Bending Controller" -- позиция этого налла относительно воображаемой линии между "плечом" и "кистью" будет определять направление изгиба конечности.

4. далее, Position для Puppet Pin 2 описываете следующим экспрешеном:
CODE

if (time < 0) {
C = value;
}
else {
A = effect("Puppet").arap.mesh("Mesh 1").deform("Puppet Pin 1").position.valueAtTime(-1);
B = effect("Puppet").arap.mesh("Mesh 1").deform("Puppet Pin 3").position.valueAtTime(-1);
C = effect("Puppet").arap.mesh("Mesh 1").deform("Puppet Pin 2").position.valueAtTime(-1);
BC = thisComp.layer("Bending Controller").transform.position;
T = thisComp.layer("Puppet Controller").transform.position;
R1 = length(A, C);
R2 = length(B, C)
A = effect("Puppet").arap.mesh("Mesh 1").deform("Puppet Pin 1").position;
d = length(A, T);
if (d > R1 + R2) {
C = add(A, mul(sub(T, A), R1/d));
}
else if (d < 1.0) {
C = add(A, mul(sub(BC, A), R1/length(BC, A)));
}
else {
B = T;

a = ((R1 * R1 - R2 * R2 + d * d) / (2 * d));
h = Math.sqrt(R1 * R1 - a * a);
D = add(A, mul(sub(B, A), a/d));
C1 = [D[0] + h * (B[1] - A[1]) / d, D[1] - h * (B[0] - A[0]) / d];
C2 = [D[0] - h * (B[1] - A[1]) / d, D[1] + h * (B[0] - A[0]) / d];
try {
S1 = length(C1, BC);
S2 = length(C2, BC);
if (S1 < S2) {
C = C1;
}
else {
C = C2;
}
}
catch(e) {
C = add(A, mul(sub(BC, A), R1/length(BC, A)));
}
}
}
C


5. Position для Puppet Pin 3 описываете следующим экспрешеном:
CODE

if (time < 0) {
B = value;
}
else {
A = effect("Puppet").arap.mesh("Mesh 1").deform("Puppet Pin 1").position.valueAtTime(-1);
B = effect("Puppet").arap.mesh("Mesh 1").deform("Puppet Pin 3").position.valueAtTime(-1);
C = effect("Puppet").arap.mesh("Mesh 1").deform("Puppet Pin 2").position.valueAtTime(-1);
BC = thisComp.layer("Bending Controller").transform.position;
T = thisComp.layer("Puppet Controller").transform.position;
R1 = length(A, C);
R2 = length(B, C)
A = effect("Puppet").arap.mesh("Mesh 1").deform("Puppet Pin 1").position;
d = length(A, T);
if (d > R1 + R2) {
B = add(A, mul(sub(T, A), (R1+R2)/d));
}
else {
B = T;
}
}
B


единственным недостатком такого решения является ограничение самого Puppet Tool, связанные с вращением и перемещением всего слоя как единого целого. но это легко преодолевается посредством вложенной композиции. этот нехитрый "workaround"а также экспрешены в текстовом формате -- в прилагаемом проекте.
[attachmentid=7107]
ну и напоследок: автор экспрешена -- программист-фрилансер Анатолий Московский, писать ему можно сюда: avm@sqlbatch.com.
m1gUn0v,

Внимание! Вы находитесь в архиве форума aeclub.net, регистрация и авторизация здесь недоступны!
Действующий форум находится здесь