Flash 3D引擎(Sandy3D)应用指南 3a——摄像机调焦和调整屏幕尺寸。

 原文地址:http://www.flashsandy.org/tutorials/3.0/sandy_cs3_tut03a

 

指南目标

在这个指南里我们有很多用代码渲染3D物品的实际尺寸的需求。我们想我们的摄像机可以为此提供一些帮助...但显然它没有。

 

前期准备

我们最少要完成了最简单的例子( simplest tutorial. )

 

视图域,可视点的高度和集距(Field of view, viewport height and focal length)

在Sandy中camera 有表示视图角度的垂直域(vertical field of view angle) 的fov 属性。fov和可视点的高度的关系的图解如下:

在这里我们很容易就可以计算出集距:

var fl:Numer = (viewport.height / 2) / Math.tan (camera.fov / 2 * (Math.PI / 180));

这个平台后面的所有东西看上去都会比“实际”小,而平面前面的东西会显得比实际大。

 

调整屏幕尺寸

如上文所述,我们怎么在改变屏幕大小时维持对象为1:1的关系呢? 诀窍是捕获Event.RESIZE事件和重置camera的fov属性以维持必要的焦距。下面是实例的代码:

 

import flash.display.*;
import flash.events.*;
 
import sandy.core.Scene3D;
import sandy.core.scenegraph.*;
import sandy.primitive.*;
import sandy.materials.*;
 
// make texture, assuming class Texture extends BitmapData
var tex:BitmapData = new Texture (0, 0);
 
// set stage to no-scale mode
stage.scaleMode = StageScaleMode.NO_SCALE; stage.align = StageAlign.TOP_LEFT;
 
// some standard Sandy stuff
var scene:Scene3D = new Scene3D ("myScene", this, new Camera3D (100, 100), new Group ("myRoot"));
var plane:Plane3D = new Plane3D ("myPlane", tex.height, tex.width);
plane.appearance = new Appearance (new BitmapMaterial (tex));
 
// add plane to scene and render it to fill its view matrix
scene.root.addChild (plane); scene.render ();
 
// finally, make resize handler
function onResize (e:Event):void
{
	// get new stage dimensions
	var w:Number = stage.stageWidth;
	var h:Number = stage.stageHeight;
	// update the viewport
	scene.camera.viewport.width = w;
	scene.camera.viewport.height = h;
	// get plane distance to camera
	var d:Number = plane.getPosition ("camera").getNorm ();
	// focus camera on wz = d for 1:1 scale
	scene.camera.fov = 2 * Math.atan2 (h / 2, d) * (180 / Math.PI);
	// re-render the scene
	scene.render();
}
 
stage.addEventListener (Event.RESIZE, onResize); onResize (null);

 

 

 

 

 

代码下载:fov.zip

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值