3D背景をコンポジションサイズに合わせたい
ただイラストをズームするのは絵的につまらないので、すべて3Dレイヤーにしてカメラのズームで空間を感じつつズームする手法はよくやるのですが、Z位置に値を入れた後に目合わせで背景のスケールを調整するのもあれなので、エクスプレッションを使ってコンポジションサイズを探る方法です。
目次
シーンの準備

- カメラ、人物、背景を配置します
- 人物と背景を3Dレイヤーに
- 最後に背景だけ適当にZ位置に値を入れておきます
エクスプレッション
3Dレイヤーの背景のスケールに下記のエクスプレッションを挿入します(※カメラ名を記述してください)。
camera = thisComp.layer("カメラ 1");
point1 = position;
point2 = camera.position;
distance = length(point1, point2);
size = (distance/camera.zoom) * 100;
[size, size, 100]
Z方向をいじっても、コンポジションのサイズにぴったりのままスケールが変化されます。
仕上げ
エクスプレッションが利いたままだと、ズーム中も背景は同じサイズを保ったままになるので、一番背景が引いている時の状態でキーを打ち、エクスプレッションを切ってスケールの値を固めてしまいましょう。

ただのスケールより、カメラのズームのほうが良いですよね!
3D背景をコンポジションのサイズに調整するスクリプト
カメラ名は「カメラ 1」にしておきます。
app.beginUndoGroup("3D背景をコンポジションのサイズに調整");
//エクスプレッションの挿入
var myProperty = app.project.activeItem.selectedProperties;
for (var i = 0; i < myProperty.length; i++) {
if (myProperty[i].canSetExpression) {
myProperty[i].expression = "camera = thisComp.layer("
カメラ 1 ");\rpoint1 = position;\rpoint2 = camera.position;\r distance = length(point1, point2);\rsize = (distance/camera.zoom) * 100;\r[size, size, 100] "
}
}
for (var i = 0; i < myProperty.length; i++) {
//エクスプレッションをキーフレームに変換
convertToKeyframes(myProperty[i]);
var numKeys = myProperty[i].numKeys;
for (var j = numKeys; j > 0; j--) {
//キーフレームの削除
myProperty[i].removeKey(j);
}
}
app.endUndoGroup();
//エクスプレッションをキーフレームに変換
function convertToKeyframes(theProperty) {
if (theProperty.canSetExpression && theProperty.expressionEnabled) {
theProperty.selected = true;
app.executeCommand(2639); //キーフレームに変換
myProperty = app.project.activeItem.selectedProperties;
//エクスプレッションの削除
for (var i = 0; i < myProperty.length; i++) {
if (myProperty[i].canSetExpression) {
myProperty[i].expression = ""
}
}
theProperty.selected = false;
}
}3D背景をコンポジションのサイズに調整するスクリプト2
エクスプレッションを使わないものです。
try {
var myLayer = app.project.activeItem.selectedLayers;
//選択カメラ
if (myLayer[0] instanceof CameraLayer) {
var camera = myLayer[0];
var camTrans = camera.transform.position.value;
var x2 = camTrans[0];
var y2 = camTrans[1];
var z2 = camTrans[2];
//ズーム
var camZoom = camera.zoom.value;
} else {
alert("カメラを選択して、次にレイヤーを選択してください")
}
//選択レイヤー
var selLayer = myLayer[1];
var selTrans = selLayer.transform.position.value;
var x1 = selTrans[0];
var y1 = selTrans[1];
var z1 = selTrans[2];
//2点間の距離
var distance = z2 - z1;
var size = Math.abs((distance / camZoom) * 100);
$.writeln(distance);
$.writeln(camZoom);
//スケール値のセット
myLayer[1].transform.scale.setValue([size, size, 100]);
} catch (e) {
alert("カメラを選択して、次にレイヤーを選択してください")
}今回スケールの値を取得するためだけにエクスプレッションを使ってみました。ちなみにもっと多機能なのが「pt_Multiplane」というスクリプトです。
