Render.ru

Parent и не только...

Рейтинг
54
#1
Не знал как правильно тему обозвать.
Суть вопроса:
Есть солид1 с анимацией вращения к нему пэрентом привязан нуль2.
Как заставить изменятся параметр Anchor Point у нуля2 (требуется для привязки к нему эффекта Corner Pin выражением)
 

Вложения

bassline

Знаток
Рейтинг
24
#2
честно говоря не совсем понял суть вопроса
делаете нуль трехмерным
заходите в трансформ у этого нуля и двигаете там анкор так, как вам заблагорассудится
ставите этот нуль туда, куда нужно
назначаете ему родителем синенький солид

если я правильно понял, то как-то так
http://zorin.tv/anchor_turn.aep
 
Рейтинг
54
#3
Попробую более развернуто:
у меня анимирован солид вращение, хотел привязать к нему одну из точек Corner Pin, но т.к. опорная точка в центре вращения то привязать собственно не к чему. Для обозначения второй точки я и припэрентил нуль, и уже к его агнкору хотел привязать Corner Pin. Но значения агнкора нуля при пэренте остаются неизменными (локальные) и выражение не работает. Где то я видел, что можно заставить обьект, привязанный пэрентом, выдавать глобальные координаты (относительно композиции), а как это сделать вот собственно и вопрос.
PS Проект в Маке, я на Пс не могу открыть.
 
Рейтинг
54
#4
После долгих мучений и многих советов получилось боле мене похоже
____________________________________
R = thisComp.layer("Cyan Solid 1").transform.rotation;
X= -600*Math.cos(R/57,7);
Y= -600*Math.sin(R/57,7);
[X, Y]
____________________________________
выражение ставилось на позишн нуля,
вопрос к знатокам выражений, откуда взялось 57,7 так как подбирал я методом проб.
 

mazzza

Знаток
Рейтинг
22
#5
цейтнот и вообще нет времени врубится в задачу,сори, только хотела сказать , что цифра 57 в контексте вращений и косинусов напомнила вот эту тему:
http://ru.wikipedia.org/wiki/%D0%A0%D0%B0%D0%B4%D0%B8%D0%B0%D0%BD
может, как-то поможет...
удачки!)
 
Рейтинг
54
#6
Спасибо mazzza, похоже на правду.
Но еще одно но, данное выражение не совсем полное, позиция точки получается рандомная (от изначального угла), нужно приписать значение для возможности изменения позиции точки (ну или что-то вроде того) .
 

mazzza

Знаток
Рейтинг
22
#7
после 29-го постараюсь разобраться (если еще актуально будет, раньше совсем никак)...
 

mazzza

Знаток
Рейтинг
22
#8
(я сразу скажу, что по экспрешнам я совсем не спец, но постараюсь что могу пояснить...))
сначало еще одно отступление по поводу 57 (вы наверное и сами уже разобрались, но на всякий случай...
если написать
R = degreesToRadians(thisComp.layer("Cyan Solid 1").transform.rotation);
X= -600*Math.cos(R);
Y= -600*Math.sin(R);
[X, Y]

это будет тоже самое , что было у вас , но без шаманства))

насчет того, что "позиция точки получается рандомная (от изначального угла)", слово рандомное тут лишнее .
исходя из того , что у вас написано в выражении, ваш Null (или на чем там висит выражение) описывает круг радиусом 600 px относительно левого верхнего угла композиции (где в АЕ расположены координаты (0,0)), если ваш Cyan Solid 1 вращается на 360 градусов.(лень уже формулировать понятнее, но, наверное смысл улавливаецца).Вобщем, вы установили такую вот функциональную связь позишна нула с ротейшном солида.
если вам нужно сместить центр вращения , напишите:

R = degreesToRadians(thisComp.layer("Cyan Solid 1").transform.rotation);
X1= ваше значение;
Y1= ваше значение;
X=X1+(-600)*Math.cos(R);
Y=Y1+ (-600)*Math.sin(R);
[X, Y]
центр вращения сместится в точку (X1;Y1)

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

mazzza

Знаток
Рейтинг
22
#9
в вашу задачу всеже въехала))
(без выражений, похоже, правда никак)
привожу пример для композиции шириной и высотой
thisComp.width ,thisComp.height
солид, к которому парентится нул соответственно
thisComp.layer("White Solid 4").width ,(thisComp.layer("White Solid 4").height
и находится в центре композиции для упрощения, в примере нулл прицеплен к правому верхнему углу солида

R = degreesToRadians(thisComp.layer("White Solid 4").transform.rotation);
X=(thisComp.width/2)+1.43*(thisComp.layer("White Solid 4").width/2)* Math.cos(R-.785);
Y=(thisComp.height/2)+1.43*(thisComp.layer("White Solid 4").height/2)* Math.sin(R-.785);
[X, Y]


множитель 1.43 получился из:
если нулл должен находится в углу солида - радиус (длина вектора вращения) будет ширина и высота композици , умноженная на 1/cos(45град) =(примерно)1.4
при вращении солида нул должен быть смещенным по углу:, например, если в правом верхнем, то отставать на 45 град, отсюда взялось (R-.785) (0.785 - это радиан 45 градусов)
другие углы - аналогично, центр сдвинуть - тоже просто (прибавить в начале нужные значения...
вообще - центр вращения можно задать в явном виде, как и ширину и высоту солида, я просто хотела написать универсальнее...))
у меня все работает, круто!))
monter, поправь, если что не так))
 

mazzza

Знаток
Рейтинг
22
#10
блин,работает только для квадратного солида!
(ну да... потому что в множителе 45 градусов...
вобщем, школу немного вспомнить , и заработает и не для квадрата...)))
 
Рейтинг
54
#11
Ого, mazzza, наверно бессонница)).
Мне тоже бывает лень формулировать, конечно отправным значением будет градус солида (начало анимации вращения) но
он может быть разный по этому и написал рандомная. Почему -600, сам не знаю, просто когда +, вращение происходит как бы в противофазе.
С позицией точки я решил опять по топорному:

R = thisComp.layer("Cyan Solid 1").transform.rotation;
X= -600*Math.cos(R/57,7)+900;
Y= -600*Math.sin(R/57,7)+300;
[X, Y]


в принципе то же что и у вас, значения +900 +300 опять же методом научного тыка (лень высчитывать).
Спасибо за R = degreesToRadians(thisComp.layer("Cyan Solid 1").transform.rotation); , более точно получается.
Последнее ваше выражение еще не пробовал.
PS. вобще нуль я взял для упрощения, в итоге будет привязываться точка эффекта.
 

mazzza

Знаток
Рейтинг
22
#12
не совсем бессонница, просто от работы както хотелось отвлечься...(вобщем, лишь бы не работать)))
напиши, пожалуйста, размер своей композиции, размер солида и к какому углу должен быть прицеплен нул (при повороте солида 0 градусов)
 
Рейтинг
54
#13
Условия задачи немного изменились и усложнились:
нуль не обязательно должен быть привязан парентом (к какому углу тоже не важно), важно чтоб нам выдавались верные его координаты относительно композиции. Кроме всего прочего есть еще один солид2 которому наш нуль и солид1 являются дочерними.
вобщем иерархическая цепочка (типа локтевого сустава), в итоге костей может быть больше)).

Решение:
От парента слой к слою отказываемся, вся привязка експрешенами.
нуль-
R = degreesToRadians(thisComp.layer("White Solid 1").transform.rotation);
X=(thisComp.layer("White Solid 1").width)* Math.cos(R);
Y=(thisComp.layer("White Solid 1").width)* Math.sin(R);
[X, Y]+thisComp.layer("White Solid 1").transform.position;


солид1- для привязки позиции используем это же выражение,
R = degreesToRadians(thisComp.layer("White Solid 2").transform.rotation);
X=(thisComp.layer("White Solid 2").width)* Math.cos(R);
Y=(thisComp.layer("White Solid 2").width)* Math.sin(R);
[X, Y]+thisComp.layer("White Solid 2").transform.position;

ротейшен просто связываем с возможностью анемировать параметр
value+thisComp.layer("White Solid 2").transform.rotation;

Громоздко но все работает, если есть что поправить пишите
 

Вложения

Сверху