photo by mikael altemark
804 :名無しさん@編集中:2009/09/10(木) 14:36:32 ID:wzL7wbcd
3Dレイヤーとカメラとの距離を計算したいのですが、
カメラに親のヌルがあると、
カメラのpositionは親との相対的な値になってしまいます。
親とカメラのxyz座標を計算して、割り出すしかないでしょうか?
しかし、この場合、親にさらに親がある(カメラが孫)と、結果が違ってしまいます。
親が無い場合はエラーになるし・・・
絶対位置を割り出すうまいやり方はありますでしょうか?
toWorldというメソッドを使用してみましたが、うまく行きませんでした。
親が無い場合エラーになってしまうのは、hasParentを使うことで回避できました。
レスありがとうございます。
親があるカメラに対して、
camPosition = toWorld(thisComp.layer("カメラ 1").position)
とした時、親を動かしても、camPositionに入る値が変化しません・・・
何が間違っているのでしょうか?
これからトライしてみます。
まあアレはヘルプの書き方が悪い。というか知ってて意地悪したw
リファレンスを見てもらえばわかると思うけど、このメソッドはレイヤーオブジェクトの配下。
関数のあらましは「レイヤー座標系の指定された点をワールド座標に変換する」なんで
その指定の仕方だと「エクスプレッションを書いたレイヤーの座標系からカメラのローカル座標を
引っ張ってオフセットした点の座標」という誰も欲しがらない点になってるわけよ。
カメラレイヤーのワールド座標が欲しいなら
thisComp.activeCamera.toWorld([0,0,0],time)
が正解。
たしかにリファレンスからは読み取りづらいですね。
例文ありがとうございます。これで解決できそうです。
try{
cam = thisComp.activeCamera;
}catch(err){
cam = thisComp.layer("カメラ 1")
}
cam.toWorld([0,0,0],time)
とすると保守性がアップする。
compItem.hasActiveCameraが無いのがイラっとくるが仕方が無い。
adobeの例文ではカメラが無い場合、
catch(err){ // No camera, so assume 50mm.
w = thisComp.width * thisComp.pixelAspect;
z = (w/2)/Math.tan(degreesToRadians(19.799));
cam = [0,0,-z];
}
という感じの処理で、仮想の50mmカメラを設定してるっぽいですが、
そもそもカメラありきのエクスプレッションなので、
あまり有効に感じなかったのでシカトしてました。
教えていただいたエラー回避のほうが、使い勝手がよさそうですね。
導入検討してみます。ありがとうございます。