ドリーズームは良く知られた視覚エフェクトで,カメラがオブジェクトに向かうと同時にズームアウトするものです。この結果はオブジェクトがほとんど同じ大きさとなりますが,シーンの他の全てのオブジェクトのパースペクティブが変更されます。さりげなく行うことで,ドリー ズームは,イメージの中で唯一位置が移動しないものであるため,ターゲットオブジェクトをハイライトする効果があります。別の手段として,ズームを意図的に素早く行って方向感覚を失った印象を作り出すことが出来ます。
Frustumの中に縦方向にちょうどおさまるオブジェクトは画面でみたとおりにビューの高さ全体を占めます。これはオブジェクトのカメラからの距離がいくつであっても,Field of Viewが何であっても変わりません。例えば,カメラをオブジェクトに近づけて,Field of Viewを広げてオブジェクトがちょうどFrustumの高さにちょうどおさまるようにすることが出来ます。その特定のオブジェクトは画面上で同じ大きさで表示されますが,その他の全ては距離およびField of Viewの変更に伴ってサイズが変更されます。これはドリー ズーム効果の最重要点です。
コードでこのエフェクトを作成するには,ズーム開始時のオブジェクトの位置におけるFrustm の height を保存することになります。次に,カメラが移動するにつれ,新しい距離が見つかり,そしてオブジェクトの位置と同じ高さであるようにField fo Viewは保持されます。これは次のようなコードにより実現できます:-
var target: Transform;
private var initHeightAtDist: float;
private var dzEnabled: boolean;
// Calculate the frustum height at a given distance from the camera.
function FrustumHeightAtDistance(distance: float) {
return 2.0 * distance * Mathf.Tan(camera.fieldOfView * 0.5 * Mathf.Deg2Rad);
}
// Calculate the FOV needed to get a given frustum height at a given distance.
function FOVForHeightAndDistance(height: float, distance: float) {
return 2 * Mathf.Atan(height * 0.5 / distance) * Mathf.Rad2Deg;
}
// Start the dolly zoom effect.
function StartDZ() {
var distance = Vector3.Distance(transform.position, target.position);
initHeightAtDist = FrustumHeightAtDistance(distance);
dzEnabled = true;
}
// Turn dolly zoom off.
function StopDZ() {
dzEnabled = false;
}
function Start() {
StartDZ();
}
function Update () {
if (dzEnabled) {
// Measure the new distance and readjust the FOV accordingly.
var currDistance = Vector3.Distance(transform.position, target.position);
camera.fieldOfView = FOVForHeightAndDistance(initHeightAtDist, currDistance);
}
// Simple control to allow the camera to be moved in and out using the up/down arrows.
transform.Translate(Input.GetAxis("Vertical") * Vector3.forward * Time.deltaTime * 5);
}