Flash 3D引擎(Sandy3D)应用指南 3a——摄像机调焦和调整屏幕尺寸。
2009-04-30 15:58
405 查看
原文地址: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属性以维持必要的焦距。下面是实例的代码:
代码下载:fov.zip
指南目标
在这个指南里我们有很多用代码渲染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
相关文章推荐
- Flash 3D引擎(Sandy3D)应用指南 3——使用摄像机。
- Flash 3D引擎(Sandy3D)应用指南 6 —— 导入外部3D模型 Part2
- Flash 3D引擎(Sandy3D)应用指南 4——在3D场景中移动物品。
- Flash 3D引擎(Sandy3D)应用指南 4a——使用灯光
- Flash 3D引擎(Sandy3D)应用指南 6 —— 导入外部3D模型 Part1
- Dragon-Studio 之 Flash Alternativa 3D引擎 专题讲座-1. 玩转摄像机
- 规则引擎—— 实例应用指南
- Android应用如何支持屏幕多尺寸多分辨率问题
- 自适应页面布局使得应用适应不同屏幕的尺寸变得更加容易
- 9款超级棒的FLASH 3D引擎
- 创建支持多种屏幕尺寸的Android应用
- Flash补间引擎应用:图片特效(2)
- VirtualBox屏幕尺寸调整和数据空间使用方法
- Delphi for iOS开发指南(10): 在iOS应用程序中使用Layout来调整窗体尺寸或排列方向
- Dragon-Studio 之 Flash Alternativa 3D引擎 基础教程-3.打造基类
- 虽然我们可能不想对元素应用3D变换,可我们一样可以开启3D引擎
- Dragon-Studio 之 Flash Alternativa 3D引擎 进阶教程-2.表面材质(1)
- WPF 3D 小小小小引擎 - ·WPF 3D变换应用
- Android平台根据分辨率计算屏幕尺寸,基于物理尺寸来验证手机和平板应用合并的可行性
- flash物理引擎应用:你的第一个Fisix应用程序