AE 익스프레션만으로 LINE 메시지 화면 애니메이션
16013 단어 adobeAfterEffects표현
익스프레션만으로 해결!
앱 LINE의 움직임을 재현하려고 하면 상당히 힘들었습니다.
내용은 그렇지 않습니다만, 어떻게 하면 스마트한지 생각해 버렸습니다.
AE 화면은 이렇게 되어 있습니다.
메시지 나누어진 컴포지션이 나란히 있을 뿐입니다.
완성은 이런 움직임
익스프레션 설명
기본적으로 최초의 메세지의 위치를 바꾸어 가는 형태로 했습니다.
기본 레이어는 첫 번째 메시지 레이어뿐입니다.
다른 레이어는 그것에 대해 가는 형태입니다.
실제로는 아래 레이어의 위치에 대해 갑니다.
우선 try{}cathe{}
에서 이 레이어가 기준점인지 여부를 정의합니다.
이 레이어가 기준점이 아니면
var check = layerRefer.name.split(/\s+/)[0];
이것은 레이어의 이름을/로 구분합니다.
실제 check에는 grp라는 문자열이 저장됩니다.
if ( check == 'msg' && layerRefer.active)
여기에는 레이어 이름에 "msg"가 포함되어 있고 레이어가 활성 상태일 때
var temp = layerRefer.height/2;
var x = thisLayer.width/2;
var y = temp+layerRefer.position[1]+thisLayer.height/2+pad ;
[x, y];
이제 아래 레이어의 위치 아래에 thislayer 레이어가 오도록 설정하고 있습니다.
첫 번째 try에서 기점이 되는 레이어의 경우 이것은 이른바 thislayer의 인덱스 위의 숫자로 msg의 레이어가 없으면 된다.
이것이 기점인지 판단하고 기점이라면
if (xxx() > bottomPosition ){
[thisLayer.width/2,260+bottomPosition -xxx()]
}
else {
[thisLayer.width/2,260+thisLayer.height/2]
}
적응합니다.
이것은 처음으로 결정한 1550px;
초과한 경우와 초과하지 않는 경우의 처리입니다.
이것에 의해 1550px를 넘으면
기점의 레이어가 표시되어 넘은 레이어분의 포지션을 위로 올리고 있습니다.
설명이 정말 좋지 않습니다.
var CinLNum = thisComp.numLayers; //レイヤー総数
var myIndexNum = thisLayer.index;//レイヤーインデックス
var bottomPosition = 1550; //折り返すポジション
var pad = 50; //コンポジション間のパディング
for ( var i = myIndexNum ; i <= CinLNum ; i++){
try{
var layerRefer = thisComp.layer(i+1);
var check = layerRefer.name.split(/\s+/)[0];
if ( check == 'msg' && layerRefer.active){
var temp = layerRefer.height/2;
var x = thisLayer.width/2;
var y = temp+layerRefer.position[1]+thisLayer.height/2+pad ;
[x,y]
break;
}
}
catch (e){
e
}
if (xxx() > bottomPosition ){
[thisLayer.width/2,260+bottomPosition -xxx()]
}
else{
[thisLayer.width/2,260+thisLayer.height/2]
}
}
function xxx(){
var temp = 0;
for ( var i = myIndexNum ; i >= 1 ; i--){
var layerRefer = thisComp.layer(i);
var check = layerRefer.name.split(/\s+/)[0];
if ( check == 'msg' && layerRefer.active){
temp = temp + layerRefer.height+ pad;
}
}
return temp;
}
조금 정정판
var CinLNum = thisComp.numLayers;
var myIndexNum = thisLayer.index;
var firstposition = 260;
var bottomPosition = 1800;
var pad = 50;
for ( var i = myIndexNum ; i <= CinLNum ; i++){
try{
var layerRefer = thisComp.layer(i+1);
var check = layerRefer.name.split(/\s+/)[0];
if ( check == 'msg' && layerRefer.active){
var temp = layerRefer.height/2;
var x = thisLayer.width/2;
var y = temp+layerRefer.position[1]+thisLayer.height/2+pad ;
[x,y]
break;
}
}
catch (e){
e
}
if (xxx() > bottomPosition-pad ){
[thisLayer.width/2,firstposition+bottomPosition -xxx()]
}
else{
[thisLayer.width/2,firstposition+thisLayer.height/2]
}
}
function xxx(){
var temp = 0;
for ( var i = myIndexNum ; i >= 1 ; i--){
var layerRefer = thisComp.layer(i);
var check = layerRefer.name.split(/\s+/)[0];
if ( check == 'msg' && layerRefer.active){
temp = temp + layerRefer.height+ pad;
}
}
return temp+firstposition/2+pad*2;
}
Reference
이 문제에 관하여(AE 익스프레션만으로 LINE 메시지 화면 애니메이션), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/TimeToEdit/items/bbfaffa047803b15c77b
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
기본적으로 최초의 메세지의 위치를 바꾸어 가는 형태로 했습니다.
기본 레이어는 첫 번째 메시지 레이어뿐입니다.
다른 레이어는 그것에 대해 가는 형태입니다.
실제로는 아래 레이어의 위치에 대해 갑니다.
우선 try{}cathe{}
에서 이 레이어가 기준점인지 여부를 정의합니다.
이 레이어가 기준점이 아니면
var check = layerRefer.name.split(/\s+/)[0];
이것은 레이어의 이름을/로 구분합니다.
실제 check에는 grp라는 문자열이 저장됩니다.
if ( check == 'msg' && layerRefer.active)
여기에는 레이어 이름에 "msg"가 포함되어 있고 레이어가 활성 상태일 때
var temp = layerRefer.height/2;
var x = thisLayer.width/2;
var y = temp+layerRefer.position[1]+thisLayer.height/2+pad ;
[x, y];
이제 아래 레이어의 위치 아래에 thislayer 레이어가 오도록 설정하고 있습니다.
첫 번째 try에서 기점이 되는 레이어의 경우 이것은 이른바 thislayer의 인덱스 위의 숫자로 msg의 레이어가 없으면 된다.
이것이 기점인지 판단하고 기점이라면
if (xxx() > bottomPosition ){
[thisLayer.width/2,260+bottomPosition -xxx()]
}
else {
[thisLayer.width/2,260+thisLayer.height/2]
}
적응합니다.
이것은 처음으로 결정한 1550px;
초과한 경우와 초과하지 않는 경우의 처리입니다.
이것에 의해 1550px를 넘으면
기점의 레이어가 표시되어 넘은 레이어분의 포지션을 위로 올리고 있습니다.
설명이 정말 좋지 않습니다.
var CinLNum = thisComp.numLayers; //レイヤー総数
var myIndexNum = thisLayer.index;//レイヤーインデックス
var bottomPosition = 1550; //折り返すポジション
var pad = 50; //コンポジション間のパディング
for ( var i = myIndexNum ; i <= CinLNum ; i++){
try{
var layerRefer = thisComp.layer(i+1);
var check = layerRefer.name.split(/\s+/)[0];
if ( check == 'msg' && layerRefer.active){
var temp = layerRefer.height/2;
var x = thisLayer.width/2;
var y = temp+layerRefer.position[1]+thisLayer.height/2+pad ;
[x,y]
break;
}
}
catch (e){
e
}
if (xxx() > bottomPosition ){
[thisLayer.width/2,260+bottomPosition -xxx()]
}
else{
[thisLayer.width/2,260+thisLayer.height/2]
}
}
function xxx(){
var temp = 0;
for ( var i = myIndexNum ; i >= 1 ; i--){
var layerRefer = thisComp.layer(i);
var check = layerRefer.name.split(/\s+/)[0];
if ( check == 'msg' && layerRefer.active){
temp = temp + layerRefer.height+ pad;
}
}
return temp;
}
조금 정정판
var CinLNum = thisComp.numLayers;
var myIndexNum = thisLayer.index;
var firstposition = 260;
var bottomPosition = 1800;
var pad = 50;
for ( var i = myIndexNum ; i <= CinLNum ; i++){
try{
var layerRefer = thisComp.layer(i+1);
var check = layerRefer.name.split(/\s+/)[0];
if ( check == 'msg' && layerRefer.active){
var temp = layerRefer.height/2;
var x = thisLayer.width/2;
var y = temp+layerRefer.position[1]+thisLayer.height/2+pad ;
[x,y]
break;
}
}
catch (e){
e
}
if (xxx() > bottomPosition-pad ){
[thisLayer.width/2,firstposition+bottomPosition -xxx()]
}
else{
[thisLayer.width/2,firstposition+thisLayer.height/2]
}
}
function xxx(){
var temp = 0;
for ( var i = myIndexNum ; i >= 1 ; i--){
var layerRefer = thisComp.layer(i);
var check = layerRefer.name.split(/\s+/)[0];
if ( check == 'msg' && layerRefer.active){
temp = temp + layerRefer.height+ pad;
}
}
return temp+firstposition/2+pad*2;
}
Reference
이 문제에 관하여(AE 익스프레션만으로 LINE 메시지 화면 애니메이션), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/TimeToEdit/items/bbfaffa047803b15c77b텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)