パーセント表示 - [[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]));
反省して修正
なんだか試験してたら色々不都合が…この辺がダメ
- アンカーポイントを動かすと値が変(考えて無かった)
- カメラを動かすと値が変(考慮してなかった)
- zoom操作すると値が変(もうすっかり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だけで操作してもいけそうな気がした。
できる絵は当然三次元的ではなくトリミングである。
できたかな
でもって、グタグタだった計算式を変更かつ
- アンカーポイントのオフセットを考慮する
- カメラのzoom動作を取り込む
- デフォルトカメラの場合もエラーにしない 以上3点を修正して正式版かな?
このエクスプレッションで得られる値は、レイヤ本体のスケールを考慮していません。 カメラから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));
まとめ
なんか単純にできるかと思ったら…全然単純なエクスプレッションじゃなくなった…ははははは
Powered by YukiWiki 2.1.2a / Modified by Nekomataya.