編集(管理者用) | 編集 | 差分 | 新規作成 | 一覧 | RSS | FrontPage | 検索 | 更新履歴
== o ==
ねこまたや web出張所
INDEX

トップページ
お知らせ
twitter
お道具箱
技術資料と雑談
ライブラリ
雑貨や(ダウンロード)
最近の更新
ねこまたやについて

twitter

ねこまたやのついった

企画モノ

psAxe情報ページ
自主制作アニメ
ぽこあぽこ られんたんど


あやかしあやし
エフェクトネタ帳



りまぴん
AE エクスプレッション
レンダー乙女とか
簡易版XPSリンカ
おまけギャラリ

BBS

ねこまたやBBS
開発室BBS

Language



開発室みたいなものでしたが
spamアクセスがはげしいのでページは凍結中です。
書き換えは管理人のみが可能です。
Nekomataya/2016

パーセント表示 - [[AEexpression]]


目次

AEexpression

3Dレイヤのパーセント表示

?ふと思いついたので作成。とっても単純

3Dレイヤに"スライダ制御"を作って適用すると、Z値 0px時を100%とする見た目のサイズが比率(%)で得られる。

なにも制御等はしないが、パーセントで撮影指定されたスケーリングを3Dレイヤで処理するときの確認に使える。

アクティブカメラのデータを読んでいるので、カメラレイヤが無い状態(デフォルトカメラのみ)だとエラーが出ます。 カメラレイヤを作ってから適用しましょう。

… 書いたあと昼ご飯食べてる間に気づいたが、「結構雑」かも。

アンカーポイントが考慮されてないし、Z軸方向の距離の比だけで計算してるし

色々後で困りそうなので、もっと正確な計算をしておくことにしましょう。 レイヤ中心と視点間の距離から計算しますね。

ソース(ダメな方)

100*thisComp.activeCamera.zoom/(position[2]+thisComp.activeCamera.zoom);
ん、すごく単純

えーっと、もうちょっと正確なヤツね

100*thisComp.activeCamera.zoom/length(add(sub(position,anchorPoint),[0,0,thisComp.activeCamera.zoom]));

反省して修正

なんだか試験してたら色々不都合が…

この辺がダメ

てなわけで、反省してちょっと動作とか色々調べてみた。

デフォルトカメラの時も使いたいのでカメラレイヤがあってアクティブか否かを判断することに

アクティブカメラ

最初"if(thisComp.activeCamera)"とかしてみたが、スクリプト的に評価される前にアプリに横取りされた

で、しようがないので自前でチェックルーチンを書く

//レイヤにカメラがあるかチェックする
ar hasCamera=false;
for(idx=1;idx<=thisComp.numLayers;idx++){
	if((thisComp.layer(idx) instanceof Camera)&&(thisComp.layer(idx).active)){hasCamera=true;break;}else{continue;}
}
これで、hasCameraを評価するとアクティブカメラの有無がわかる。

デフォルトカメラのデータを調べてみる。

AE5xシリーズでカメラレイヤをつくらないで保存したプロジェクトは、AE6以降で読み込むと元のカメラを付けてくれるのでそれで確認。

AE6以降は、そのへんから推測して以下の様なエクスプレッションで画角を確認

//対角線画角を取得するエクスプレッション
diag=Math.sqrt(Math.pow(thisComp.height,2) + Math.pow(thisComp.width,2));//画面対角線長(px)
//distance=thisComp.activeCamera.zoom;//アクティブカメラズーム値
distance=XXXX;//手入力
//対角線画角
Math.floor(180. * (Math.atan((diag/2)/distance)/Math.PI)* 2 * 10000)/10000;
//水平画角を取得するエクスプレッション
diag=thisComp.width;//画面水平線長(px)
//distance=thisComp.activeCamera.zoom;//アクティブカメラズーム値
distance=XXXX;//手入力
//水平線画角
Math.floor(180. * (Math.atan((diag/2)/distance)/Math.PI)* 2 * 10000)/10000;

AE5xシリーズの標準カメラは 対角画角46.7900°固定っぽい感じ(これは以前からそう思ってた)

AE6シリーズは水平線画角39.5980°で固定な雰囲気(今回調べたらそんな感じ)

つまり画角一定で基準値はAE5xと6以降で対角線か水平線か変更っぽい。

では、zoom値の取得式は以下のとおり

//AE5x
myZoom=Math.tan(degreesToRadians((180-46.7900)/2))*(Math.sqrt(Math.pow(thisComp.height,2)+Math.pow(thisComp.width,2))/2);
myZoom;
//AE6以降
myZoom=Math.tan(degreesToRadians((180-39.5980)/2))*(thisComp.width/2);
myZoom;

zoom値

ズームレンズの代用品

レンダリングするバッファは変更しないで画角を変更して画郭を変える。

カメラの位置を変えると視野からはずれたりするのでこれがあった方が色々便利

"zoom値/被写体距離"に比例して画角が変わる。

あーっと…単純な撮影指定だとzoomだけで操作してもいけそうな気がした。

できる絵は当然三次元的ではなくトリミングである。

できたかな

でもって、グタグタだった計算式を変更

かつ

このエクスプレッションで得られる値は、レイヤ本体のスケールを考慮していません。 カメラから2倍の距離に置いたレイヤには50%のリザルトがでますが、レイヤを200%に拡大しても戻り地は50%のままです。これを処理するのは簡単(単純にかけるだけ)なのでこれを考慮する必要がある場合は、ご自分で処理お願いします。

また、視野が考慮されていないのでカメラの後ろにあったりして視野をはずれた(見えない)レイヤでも距離にしたがってそれなりの値がでます。ご注意ねがいます。

ソース(たぶん正しい方)

/*
	このエクスプレッションを適用した3Dレイヤが
	元のセルの何パーセントで見えているかを取得するエクスプレッション
	AE5xシリーズで使用する場合は、冒頭の定数"AE5"をtrueにしておいてください。

 */
//自分でバージョンを書き込むこと そろそろAE5シリーズのサポートは終りの予定/ 自動判定はもうしない

var AE5=false;//AE6以降ならfalse AE5-5.5はtrue
//デフォルトカメラの値を設定(推測ナノデはずれてたら御免)
if(AE5){
//AE5xデフォルトカメラ
	var myZoom=Math.tan(degreesToRadians((180-46.7900)/2))*(Math.sqrt(Math.pow(thisComp.height,2)+Math.pow(thisComp.width,2))/2);
	var cameraPosition=[thisComp.width/2,thisComp.height/2,-myZoom];
}else{
//AE6以降のデフォルトカメラ
	var myZoom=Math.tan(degreesToRadians((180-39.5980)/2))*(thisComp.width/2);
	var cameraPosition=[thisComp.width/2,thisComp.height/2,-myZoom];
}
//レイヤにカメラがあるかチェックする
var hasCamera=false;
for(idx=1;idx<=thisComp.numLayers;idx++){
	if((thisComp.layer(idx) instanceof Camera)&&(thisComp.layer(idx).active)){hasCamera=true;break;}else{continue;}
}
//カメラレイヤがあればアクティブカメラを使う(アクティブカメラがない場合はエラー)
if(hasCamera){
	myZoom=thisComp.activeCamera.zoom;
	cameraPosition=thisComp.activeCamera.position;
}
//視点からレイヤまでの距離を出して比の逆数で計算
var baseDistance=length(cameraPosition,[thisComp.width/2,thisComp.height/2,0]);//カメラ位置から標準レイヤ位置まで距離
var anchorOffset=sub(this.anchorPoint,[this.width/2,this.height/2,0]);//アンカーポイントによるレイヤのオフセット量

//zoom動作とanchorオフセットを考慮した計算
(myZoom/baseDistance)*100*baseDistance/length(sub(sub(this.position,anchorOffset),cameraPosition));

まとめ

なんか単純にできるかと思ったら…全然単純なエクスプレッションじゃなくなった…

ははははは