|
1,2부에서 두 지점간의 거리를 구하는 방법을 공부했습니다. 하긴 했는데 요넘을 어디에 쓸고.....하고 생각하시는 분들도 있겠지만 활용할 곳은 무궁무진 합니다. 1. 가령 두 레이어간 거리가 일정 거리 이상이 되면 레이어를 사라지게 한다든지(조건문 사용) 2. 두 레이어간 거리를 다른 이펙트의 수치로 사용할 수도 있을 것이다.(블러 등) 다시 말해 두 지점의 거리가 멀어지면 블러값이 증가하고 거리가 가까워지면 블러값이 감소하는 마치 카메라의 포커스를 조절하는 것 같은 효과를 쉽게 제어 할 수 있습니다. 3. 혹은 두 레이어간 거리의 수치를 스케일에 더하거나 빼줄 수도 있을 것이다. 다시 말해 두 지점간의 거리가 멀어지면 스케일이 커지고, 가까워지면 스케일이 줄어들게끔... 이처럼 두 지점간 거리의 변화에 따라 다른 무언가의 속성이나 이펙트가 자동으로 반응하게 하고 싶다면 어디서든 적용이 가능하다. 자 그럼 하나씩 적용해 보겠습니다. 먼저 두 레이어간 거리가 일정 거리 이상이 되면 레이어를 사라지게 해보겠습니다. 먼저 작업환경을 구성하겠습니다. 1. 600*400 사이즈의 콤프를 만듭니다. 2. 100*100 사이즈의 솔리드 2개를 만듭니다.(색상을 다르게) 3. 두 솔리드의 이름을 각각 “layer A” “layer B” 로 수정합니다.(대소문자 구분) 4. layer A의 위치를 (50.200), layer B의 위치를 (550.200) 으로 이동합니다.

자 이제 두 레이어의 거리가 300 이하가 되면 “layer A” 레이어가 사라지도록 하겠습니다. 아래 식을 layer A 의 Opacity 속성에 추가합니다. point1=transform.position; point2=thisComp.layer("layer B").transform.position; n=length(point1, point2); if ( n <=300) 0 else transform.opacity

이제 두 레이어 중 아무거나 스테이지 상에서 움직여 보십시오 두 레이어의 거리가 300 이하가 되는 순간 layer A 는 사라지게 될 것입니다. 이쯤에서 혹자는 이런 생각을 할 수 있습니다. 저정도야 그냥 키를 잡아도 되지 않을까? ... 음 그렇죠 저정도라면 그냥 키를 잡는 것이 편하고 빠를 것입니다. 하지만 다음과 같은 경우를 생각해 보겠습니다. layer B의 위치가 불규칙하게 움직이고 있다고 가정해 보겠습니다. 이때도 키를 잡을 수 있을까요 다시 말해 매 프레임마다 거리를 확인해서 300 이하면 투명도를 0으로 300 이상이면 투명도를 100으로... 이론상 가능하기는 하지만 매우 불필요한 전투력 소비일 것입니다. 직접 확인해 보겠습니다. layer A 의 Opacity 속성의 익스프레션을 삭제합니다. 이어서 layer B의 Position 속성에 wiggle(8,500) 란 익스프레션을 추가합니다.

콤프를 플레이 해보면 layer B가 불규칙하게 움직이는 것을 확인할 수 있습니다. 자 이제 여러분이 직접 두 레이어의 거리가 300 이하인지 이상인지 확인해 가면서 layer A의 Opacity 속성에 키를 잡아 보십시오(아마 콤프가 30초 이상이라면 미칠지경일 겁니다.) 이때 layer A의 Opacity 속성에 위에서 배운 식을 추가한다면 자동으로 알아서 보였다 안보였다 하게 됩니다.
 ------------------------------------------------------------------------------------
혹은 두 레이어간 거리를 다른 이펙트의 수치로 사용할 수도 있을 것이다.(블러 등) 다시 말해 두 지점의 거리가 멀어지면 블러값이 증가하고 거리가 가까워지면 블러값이 감소하는 마치 카메라의 포커스를 조절하는 것 같은 효과를 쉽게 제어 할 수 있습니다. layer A 의 익스프레션을 삭제합니다. 그림과 같이 어저스트먼트 레이어를 추가하고 Fast Blur 이펙트를 추가합니다.

이어서 Fast Blur의 Blurriness 항목에 다음과 같은 익스프레션을 추가합니다. point1=thisComp.layer("layer A").transform.position; point2=thisComp.layer("layer B").transform.position; length(point1, point2) 혹시라도 화면에 아무것도 안보이게 되더라고 걱정하지 않아도 됩니다. 블러값이 너무 크게 적용되어 있어서 입니다. 이제 두 레이어중 아무 것이나 움직여 보세요 두 레이어의 거리가 줄어들면 자연스럽게 블러값이 감소하고, 거리가 멀어지면 블러값이 증가합니다. 적용되는 블러값이 너무 크다면 적당한 수치로 나누어 주면 된다. length(point1, point2)/10
 ------------------------------------------------------------------------------------
이번에는 두 레이어의 거리가 멀어지면 스케일이 커지고, 가까워지면 작아지게 만들어 보겠습니다. 바로 위의 작업 환경에서 어저스트먼트 레이어는 삭제 합니다.

layer A의 Scale 속성에 아래 익스프레션을 추가합니다. point1=transform.position; point2=thisComp.layer("layer B").transform.position; n=length(point1, point2); add(value,[n,n])

두 레이중 아무 것이나 움직여보면 거리에 따라 스케일이 달라지는 것을 확인 할 수 있습니다. 만약 스케일이 너무 크게 적용된다면 아래처럼 적당히 나누어 주면 됩니다. add(value,[n,n])/2

하지만 위처럼 그냥 실수로 나누어 주면 약간의 문제가 발생합니다. 두 레이어가 정확히 겹쳤을때 사이즈가 1:1 로 맞지 않게 됩니다.

물론 이 문제를 해결하는 방법에도 여러 가지가 있을 수 있지만, 그중 가장 고급적인 방법을 하나 배워보겠습니다. linear(t, tMin, tMax, value1, value2) 표현식을 사용하는 방식입니다. 위 함수는 인터폴레이션 함수중 하나 입니다.(인터폴레이션 함수는 나중에 자세히 다룰 겁니다.) 아래처럼 익스프레션을 수정합니다. point1=transform.position; point2=thisComp.layer("layer B").transform.position; n=length(point1, point2); linear(n, 0, 500, [100,100], [300,300]) 간단히 설명하자면 n값(거리)가 0 부터 500까지 변하는 동안 스케일은 100% 부터 300%까지 변하게끔 대응시켜 준 겁니다.

 두 레이어를 정확히 겹쳐보시면 사이즈가 1:1로 딱 맞게 되는 것을 확인 하실 수 있습니다. linear함수의 수치를 조절하면 원하는 대로 거리나 사이즈를 조절할 수 있습니다.
|