Parent и не только...
- Автор темы Andrey Varlamov
- Дата создания
- Рейтинг
- 54
Попробую более развернуто:
у меня анимирован солид вращение, хотел привязать к нему одну из точек Corner Pin, но т.к. опорная точка в центре вращения то привязать собственно не к чему. Для обозначения второй точки я и припэрентил нуль, и уже к его агнкору хотел привязать Corner Pin. Но значения агнкора нуля при пэренте остаются неизменными (локальные) и выражение не работает. Где то я видел, что можно заставить обьект, привязанный пэрентом, выдавать глобальные координаты (относительно композиции), а как это сделать вот собственно и вопрос.
PS Проект в Маке, я на Пс не могу открыть.
у меня анимирован солид вращение, хотел привязать к нему одну из точек Corner Pin, но т.к. опорная точка в центре вращения то привязать собственно не к чему. Для обозначения второй точки я и припэрентил нуль, и уже к его агнкору хотел привязать Corner Pin. Но значения агнкора нуля при пэренте остаются неизменными (локальные) и выражение не работает. Где то я видел, что можно заставить обьект, привязанный пэрентом, выдавать глобальные координаты (относительно композиции), а как это сделать вот собственно и вопрос.
PS Проект в Маке, я на Пс не могу открыть.
- Рейтинг
- 54
После долгих мучений и многих советов получилось боле мене похоже
____________________________________
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 так как подбирал я методом проб.
____________________________________
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 так как подбирал я методом проб.
(я сразу скажу, что по экспрешнам я совсем не спец, но постараюсь что могу пояснить...))
сначало еще одно отступление по поводу 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)
минусы в множителях при косинусах и синусах я не совсем поняла...
(знак влияет только на фазу вращения, т.к. и синус и косинус периодические фукции)
и, честно говоря, не совсем поняла и саму задачу...
Есть подозрение, что ее всеже можно решить парентингом без экспрешнов
вобщем как то так...
(занудный какой-то топик получился ))
сначало еще одно отступление по поводу 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)
минусы в множителях при косинусах и синусах я не совсем поняла...
(знак влияет только на фазу вращения, т.к. и синус и косинус периодические фукции)
и, честно говоря, не совсем поняла и саму задачу...
Есть подозрение, что ее всеже можно решить парентингом без экспрешнов
вобщем как то так...
(занудный какой-то топик получился ))
в вашу задачу всеже въехала))
(без выражений, похоже, правда никак)
привожу пример для композиции шириной и высотой
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, поправь, если что не так))
(без выражений, похоже, правда никак)
привожу пример для композиции шириной и высотой
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, поправь, если что не так))
- Рейтинг
- 54
Ого, 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. вобще нуль я взял для упрощения, в итоге будет привязываться точка эффекта.
Мне тоже бывает лень формулировать, конечно отправным значением будет градус солида (начало анимации вращения) но
он может быть разный по этому и написал рандомная. Почему -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. вобще нуль я взял для упрощения, в итоге будет привязываться точка эффекта.
- Рейтинг
- 54
Условия задачи немного изменились и усложнились:
нуль не обязательно должен быть привязан парентом (к какому углу тоже не важно), важно чтоб нам выдавались верные его координаты относительно композиции. Кроме всего прочего есть еще один солид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;
Громоздко но все работает, если есть что поправить пишите
нуль не обязательно должен быть привязан парентом (к какому углу тоже не важно), важно чтоб нам выдавались верные его координаты относительно композиции. Кроме всего прочего есть еще один солид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;
Громоздко но все работает, если есть что поправить пишите
Вложения
-
32,1 КБ Просмотров: 288
-
86,7 КБ Просмотров: 299