2009-08-27

選んだレイヤーを内接する大きさのコンポにするスクリプト

需要あるかわからないけど、選んだレイヤーをぴったり含むコンポジションに変えます。
レイヤーを回転、拡大していても、コンポに内接するようになります。
マスクと3Dレイヤーは未対応。


//選んだレイヤーを内接する大きさのコンポにする。
//3Dレイヤーは未対応
(function (){
//ヌルを作るプロトタイプ
LayerCollection.prototype.addNull = function(){
var color = [1,1,1];
var name = "ヌル 1";
var n = this.addSolid(color,name,100,100,1,1);
var comp = n.containingComp;
n.outPoint = comp.duration;
n.nullLayer = true;
n.source.width = comp.width;
n.source.height = comp.height;
n.source.pixelAspect = comp.pixelAspect;
return n;
}


//Arrayオブジェクトの拡張
Array.prototype.min = function(){
return Math.min.apply(null,this)
}
Array.prototype.max = function(){
return Math.max.apply(null,this)
}


function length(point1 ,point2) {
var n = Math.sqrt(Math.pow(point2[0] - point1[0], 2) + Math.pow(point2[1] - point1[1], 2));
return n;
}

//レイヤーの左上、右下のポイントを算出する関数
//レイヤーが反転していても、コンポ内での見た目の左上と右下を得る
//[x1,y1,x2,y2]という配列を返す
//transformプロパティはmatchNameでとってるので長々しいが一番正確かなと
//使ってないプロパティもとってるのはtransformプロパティのとり方の参考として。
//レイヤーのアスペクト比、そのレイヤーのあるコンポのアスペクト比も計算する
function get4RectanglePoint(target){
if(target instanceof AVLayer){
var layer_pixelAspect = target.source.pixelAspect;
var comp_pixelAspect = target.containingComp.pixelAspect;

var anchorX = target.property("ADBE Transform Group").property("ADBE Anchor Point").value[0];
var anchorY = target.property("ADBE Transform Group").property("ADBE Anchor Point").value[1];
var anchorZ = target.property("ADBE Transform Group").property("ADBE Anchor Point").value[2];

var posX = target.property("ADBE Transform Group").property("ADBE Position").value[0];
var posY = target.property("ADBE Transform Group").property("ADBE Position").value[1];
var posZ = target.property("ADBE Transform Group").property("ADBE Position").value[2];

var scaleX = target.property("ADBE Transform Group").property("ADBE Scale").value[0];
var scaleY = target.property("ADBE Transform Group").property("ADBE Scale").value[1];
var scaleZ = target.property("ADBE Transform Group").property("ADBE Scale").value[2];

var rotX = target.property("ADBE Transform Group").property("ADBE Rotate X").value;
var rotY = target.property("ADBE Transform Group").property("ADBE Rotate Y").value;
var rotZ = target.property("ADBE Transform Group").property("ADBE Rotate Z").value;

var r = (rotZ+180)*Math.PI/180*-1;
scaleX = scaleX * layer_pixelAspect;

var p = [];
var x = [];
var y = [];
var n = [];

p[0] = [anchorX/100*scaleX, anchorY/100*scaleY];
p[1] = [anchorX/100*scaleX - target.width/100*scaleX, anchorY/100*scaleY];
p[2] = [anchorX/100*scaleX - target.width/100*scaleX, anchorY/100*scaleY - target.height/100*scaleY];
p[3] = [anchorX/100*scaleX, anchorY/100*scaleY - target.height/100*scaleY];

for(var i=0;i

var dist = length(p[i], [0,0]);
var rr = Math.atan2(p[i][0], p[i][1])+r;
n[n.length] = [Math.sin(rr)*dist/comp_pixelAspect+posX, Math.cos(rr)*dist+posY];
}
return n;
}
}

function get2RectanglePoint(layer){
var m = get4RectanglePoint(layer);
var x = [],y=[];
var min = [],max = [];
var n = [];
for(var i=0;i
x[x.length] = m[i][0];
y[y.length] = m[i][1];
}
for(var i=0;ix[i]) ? x[i] : min[0];
min[1] = (min[1]>y[i]) ? y[i] : min[1];
max[0] = (max[0]
max[1] = (max[1]
}else{
min[0]= x[i];
min[1]= y[i];
max[0]= x[i];
max[1]= y[i];
}
}
n = [min[0], min[1], max[0], max[1]];
return n;
}

//main
var comp = app.project.activeItem;
var newRectanglePoints = [];
var parentList = [];
var lockList = [];

if(comp){
var lay = comp.selectedLayers;
if(lay != ""){
app.beginUndoGroup("コンポの大きさをレイヤーにあわせる");

//親子関係とロック状態を保存してはずす
for(var i=1;i<=comp.numLayers;i++){
parentList[parentList.length] = comp.layer(i).parent;
lockList[lockList.length] = comp.layer(i).locked;
comp.layer(i).locked = false;
comp.layer(i).parent = null;
}

//選んだレイヤーの合計の矩形を求める
for(var i=0;in[0]) ? n[0] : newRectanglePoints[0];
newRectanglePoints[1] = (newRectanglePoints[1]>n[1]) ? n[1] : newRectanglePoints[1];
newRectanglePoints[2] = (newRectanglePoints[2]
newRectanglePoints[3] = (newRectanglePoints[3]
}else{
newRectanglePoints[0] = n[0];
newRectanglePoints[1] = n[1];
newRectanglePoints[2] = n[2];
newRectanglePoints[3] = n[3];
}
}
}

//ヌルを追加して、合計の矩形の左上に配置
var nu = comp.layers.addNull();
nu.property("ADBE Transform Group").property("ADBE Position").setValue([newRectanglePoints[0], newRectanglePoints[1]]);

//新しくするコンポのサイズを設定する
comp.width = Math.floor(Math.abs(newRectanglePoints[2] - newRectanglePoints[0]));
comp.height = Math.floor(Math.abs(newRectanglePoints[3] - newRectanglePoints[1]));

//ヌルにすべてを親子付け、ヌルを新コンポサイズの左上(0,0)に移動、移動後ヌル削除
for(var i=2;i<=comp.numLayers;i++){
comp.layer(i).parent = nu;
}
nu.property("ADBE Transform Group").property("ADBE Position").setValue([0,0]);
nu.source.remove();

//親子関係とロック状態を元に戻す
for(var i=1;i<=comp.numLayers;i++){
comp.layer(i).parent = parentList[i-1] ;
comp.layer(i).locked = lockList[i-1] ;
}



app.endUndoGroup();
}
}
})();


ダウンロード



タグ : [タグを追加する]


この記事の投稿者について:t_e_t_s_u_o

フィードバック

1 Star2 Stars3 Stars4 Stars5 Stars
(評価回数:3 , 平均:5.00)
Loading...Loading...

この記事に対する 5 の反応があります


  1. 1 AE-USERS 8月 27th, 2009 at 13:18

    新着記事 : 選んだレイヤーを内接する大きさのコンポにするスクリプト http://bit.ly/19WLXz

  2. 2 AEUSERS(AEP Project) 8月 27th, 2009 at 13:18

    新着記事 : 選んだレイヤーを内接する大きさのコンポにするスクリプト http://bit.ly/19WLXz

  3. 3 カズロング 4月 21st, 2010 at 13:33

    @hide3232 あとテキストレイヤーの文字サイズをプリコンポーズするときにレイヤーサイズでコンポを自動で作ってくれるスクリプト知らない? http://bit.ly/aLMlwc これDLしてもおかしいんだよね。

  1. 1 選んだレイヤーを内接する大きさのコンポにするスクリプト | スクリプト - After Effects - 動画編集ソフト - アプリケーション | Jishuu.net Pingback on 7月 7th, 2012 at 13:06
  2. 2 AfterEffectsでコンポジションのサイズを配置したレイヤーのサイズに合わせる方法 Pingback on 7月 21st, 2015 at 16:46

コメントをどうぞ!




特集