返回介绍

推拉变焦(又称“伸缩”变焦)

发布于 2021-06-19 18:03:22 字数 1750 浏览 983 评论 0 收藏 0

推拉变焦是一种广为人知的视觉效果,相机朝目标对象移动的同时进行缩放。使得该对象大致看起来还是相同大小,但场景中的所有其他对象都改变了视角。推拉变焦处理巧妙,可突出目标对象,因为该对象是图像场景中唯一没有改变位置的物体。变焦也可有意进行快速处理,造成定向障碍的效果。

如屏幕上看到的一样,刚好符合垂直内视椎体的对象将占据视图的整个高度。不论对象到相机的距离有多远,不论视野如何,都是如此。例如,可将相机移近对象,然后拓宽视角,使对象刚好符合内视椎体的高度。该特定对象在屏幕上将显示相同大小,但其他所有对象的大小将随着距离和视野的改变而改变。这是推拉变焦效果的实质。

在代码中创造这种效果可在变焦开始时于对象所在位置减少内视椎体的高度。然后随着相机的移动,找到新距离并调整视野,保持在对象位置的相同高度。下列代码可完成该效果:-

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);
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文