- 2008年08月04日 (月)

- Tweet
Papervision3D 2.0で被写界深度表現(2)
前回の記事ではPapervison3Dで被写界深度表現ができるプロパティを発見したことを紹介しました。今回はその応用で焦点距離を計算するロジックを実装してみます。
螺旋状の3Dサンプルで二重のネスト構造にしており、sceneX,Y,Zプロパティが今回の計算でも活躍してくれます。
カメラからの距離を算出
焦点距離を計算するにあたってカメラとオブジェクトの3次元空間上での2点間距離を算出する必要があります。XYZに対して距離の差分を求め、二乗して平方根をとれば距離が算出できます。これは今後もよく使いそうなので汎用メソッド化しておきます。
/**
* カメラからの距離を算出します
* @param obj 計測したいオブジェクト
* @return カメラからの距離(3D空間内のpx値)
*/
private function calcPointDistanceFromCamera(obj:DisplayObject3D):Number
{
var vecX:Number = obj.sceneX - camera.x;
var vecY:Number = obj.sceneY - camera.y;
var vecZ:Number = obj.sceneZ - camera.z;
return Math.sqrt(
(vecX * vecX)
+ (vecY * vecY)
+ (vecZ * vecZ));
}
被写界深度表現の適用量
この関数は次のようにして利用します。カメラとの距離からピントが合う距離(FOCUS_POS)の差分が、被写界深度表現の適用量(deg)になります。
// 距離の算出
var deg:Number = Math.abs(calcPointDistanceFromCamera(displayObject3D) – FOCUS_POS);
被写界深度表現 – ぼけ
上記で求めたdegを使って、まずは「ぼかし」を処理します。
// ぼかしの適用値
var blurVal:int = Math.min(64, deg * .02 << 1 ); //適宜適用量は調整
var blurFilter:BlurFilter = new BlurFilter(blurVal, blurVal, 1);
被写界深度表現 – 明度
前回は「ぼけ」だけの表現でしたが、味をだすために「明度」もコントロールの対象にします。ColorMatrixFilteを使った単純な明度コントロール。
// 明度の適用値
var blightness:Number = deg / 6; //適宜適用量は調整
var blightnessArr:Array =
[
1, 0, 0, 0, blightness,
0, 1, 0, 0, blightness,
0, 0, 1, 0, blightness,
0, 0, 0, 1, 0
];
var blightnessFilter:ColorMatrixFilter = new ColorMatrixFilter(blightnessArr);
これで前回の記事よりも忠実な再現ができてきました。本来はカメラとの距離で被写界深度及び過焦点距離計算のように詳細に計算するとよいのでしょうが、今は単純なロジックで。なお今回のサンプルはtrick7さんのエントリーを参考にさせて頂きました。ありがとうございます。















投稿者 : 池田 泰延
BookMark
ブックマークはこちらからどうぞ。