Away3d基础 3 -相机

20 篇文章 1 订阅
9 篇文章 0 订阅

原英文地址:http://www.flashmagazine.com/Tutorials/detail/away3d_basics_the_cameras/

相机camera类是观察3D世界必须借助的工具.其作用与现实世界里的相机一样,3D世界里的照相机应用通视原理将3D物进行缩放、聚焦、定位等。在本教程中你将会学到away3d里的三种类型的“相机”

无论你想在Away3D里做什么,有几个"物件"是不可或缺的.在本基础指南里会解释场景Scene, 视口View, Camera照相机, Primitives基本3D元素, Textures纹理和其它一些会用到的概念.指南里的每个例子都是基于as3脚本的.所以都可以在flashflex运行.  

如果你是3D菜鸟,你可能想要看我们关于三维核心概念的介绍。这篇教程中也含有其中6 Away3D项目实例。运行实例文件前,你首先需要在您的计算机上置Away3D开发环境当设置好Away3D开发环境后,你只要把这些实例下载到你的项目文件夹上就可以打开、探索和调试这些实例。但由于采用高集成代码,这些例子都要用一个文件Cover.as。请先下载该文件到您的项目目录保证所有能够运行实例。

Away3D 里的相机

Away3D提供了三种类型的相机:Camera3D, TargetCamera3D HoverCamera3D.每种照相机都可以进行zoom(缩放)focus(焦距)depth of field(景深)pany轴旋转)、tiltx轴旋转)、position(机位)的设置。三类相机都可以直接在构造函数里对这些特性进行设置,就象这样:

 1 var cam:Camera3D = new Camera3D({zoom:5,focus:200});

当然也可以这样设置属性:

1 var cam:Camera3D = new Camera3D({zoom:5,focus:200});

2 cam.zoom = 5;

3 cam.focus = 200;

看下面这个简单的照相机例子,你就可以大致上理解照相机的zoom机理.focus属性决定着照相机的视角广度.测试下面例子:

 

movie: Camera.as

从这个例子里我们可以体会到focuszoom的共同作用对所看到的场景的影响.focus属性值越小就相当于把渲染面移近相机.反之移远.tartiflop写了一个非常好的关于zoom与focus设置(papervision)的教程.其原理与away3d里的一样,假如你想对些了解更多请浏览相关文章.

1 cam.pan = 45;cam.tilt = -10;

PanTilt 方法的功能就如同其字面意思一样。它们可以让相机水平与铅垂方向旋转。这个属性的值可以正数也可以是负数。前面我们也提及景深这个属性,当与二维sprite混在一块的时候,这个属性可以设置3d物的深度效果,本指南会在后面章节中作进一步的论述。

视口渲染时所有这些属性都会被综合考虑,这个统计出所有可见面(译者注:3d物体由多个三角形面组成)的过程我们把它称为“过滤”,这个过程要占用相当cpu,"过滤"可确保只有那些可见的参于渲染.

三种类型的相机有些不同,下面逐个进行讲解.

Camera3D(自由相机)

Camera3D 是最基本的,没有固定形态,你可以自由地移动与定位.

 

movie: Basic04Camera3D.as

使用ADWS及上下箭头键操控上例。在这个例子里我们用了一套常规的能让away3d 物运动的方法。

1.camera.moveUp(10);camera.moveDown(10);camera.moveLeft(10);camera.moveRight(10); 2.camera.moveForward(10);camera.moveBackward(10);

这些方法名充分说明了其用途。注意相机位置在(000)这个中央点,如果这时在场景上添加一个Sphere你根本看不到,因为此时camerasphere里头,而默认情况下只有球体外侧才能看到。为了能看到这个sphere你可以用“sphere.invertFaces()"也可以改变相机的z属性将照相机移出球体,如下所示:

1.camera.z = -1000;

  这里我们把相机向我们自已移近1000个单位。设置相机的x/y/z属性值会移动相机在三维空间里的位置,但是记住相机必须面向某一位置(三维点)。默认情况下相机面向的点是三维场景坐标的中央,如果要让相机面向其他点我们要用到: 

1.camera.lookAt( new Number3D(x,y,z) );
 

这句代码告诉相机面向三维坐标的(x,y,z)点。你也可以使用PanTilt和沿三轴旋转让相机面向指定点。

这里要注意,在你让相机面向某点时先要确定要相机位。假如你先指定相机朝向后在更换相机位置,相机朝向仍是

当初的那个方向。为此我们在改变相机朝向之前要指定好相机位或者使用另一类更加容易设定朝向的相机。

TargetCamera3D(目标相机)

目标相机拥有所有自由相机的属性,并且它还具有指向其它3D物或三维位置的能力。

 

 

movie: Basic05TargetCamera3D.as

使用导航键(ADWS)操作上面使用目标相机的示例影片,无论相机位置如何改变,相机总是指向同一目标,这样使用camera.moveLeft

让相机向左移实质却是相机绕着目标旋转。

这类相机默认朝向坐标中心,但我们可以通过改变相机目标改变其朝向:

1.camera.target = sphere;
 

点击例子里的任何一个三维物,感受它的工作机理。

 

HoverCamera3D(旋转相机)

 

旋转相机拥有目标相机的所用功能,另外它还增加了一个功能,这个功能在我们通过设置pantilt属性让相机绕3D

 

物转动时会非常有用。同样会转动相机,因此用它会转动的更为平滑。它任由你想象的那样自由旋转相机,它是所

 

相机里最能干的一个。

 

movie: Basic06HoverCamera3D.as

这里我们使用旋转相机的二个属性:

1.camera.targetpanangle = 0;camera.targettiltangle = 0;

这些用于pantilt的角范围在0~360之间,这些什大小是相对于当前值而言的。

1.camera.panangle = 0;camera.tiltangle = 0;

上面设置的是旋转的初始位置,当我们创建新相机时也要将这些值重新置0。旋转过程快慢还要由事先定好的

“stepS”来确定 

1.camera.steps = 16;

“steps(步数)”由默认的8变为16,转动会更为缓慢与平滑。你也可以减小这个值至到0。这样会瞬间转到新

的位置。为了让旋转相机真的转动起来还得来个逐帧执行下边方法:

1.camera.hover();view.render();

只有调用camera.hover() 相机才能转动。女士们先生们,准备好了吗?现在我们把上面所学的东东都亮出来,看看

这些属性、方法是如何工作的。

实例:用鼠标转动场景

展示3D场景最为经典的办法莫过于让用户使用鼠标来控制场景,就象下面例子那样:

 

movie: Triaxe2.as

这里我解释本例代码。我们先定义一些后边会用到的参数。

  1.private var View:View3D;  private var swfStage:Stage;   private var cover:Cover;

2.// HoverCam controls     private  var camera:HoverCamera3D; 
3.private var lastMouseX:Number;     private var lastMouseY:Number; 
4.private var lastPanAngle:Number;   private var lastTiltAngle:Number; 
5.private var move:Boolean = false;

我们增加一个旋转相机并且将它交付与视口使用,这比使用视口的默认相机根子的多。

1.camera = new HoverCamera3D({zoom:2, focus:100, distance:250}); 
2.View = new View3D({camera:camera,x:250, y:200});

 然后设置下pantilt的值让它们初始值与默认的不一样,这样可以让相机初始时就有一个角度。

1.camera.targetpanangle = camera.panangle = 45; 
2.camera.targettiltangle = camera.tiltangle = 20;camera.mintiltangle = -90;

注意我们要同进设置初始角与未角,否则相机一开始就会转到未角位置。同时还要注意我们将 'mintiltangle' 设为

-90。这让我们可旋转至场景下方,默认情况是不允许的。接下来,我们在场景中加些3D物体并让场景逐帧渲染。

1.addEventListener(Event.ENTER_FRAME, onEnterFrame);

下面加二个侦听器,侦听mouse达到交互目的。

1.this.stage.addEventListener(MouseEvent.MOUSE_DOWN, MouseDown); 
2.this.stage.addEventListener(MouseEvent.MOUSE_UP, MouseUp);

当按下mouse,我们将当前pantilt的值设位mouse位置。我们用它来计算相机移动速度。

1.private function MouseDown(event:MouseEvent):void{ 
2. lastPanAngle = camera.targetpanangle; lastTiltAngle = camera.targettiltangle; 
3. lastMouseX = stage.mouseX; lastMouseY = stage.mouseY; move = true;}

注意这里我没还同时设置了move值(布尔值),这个参数指示mouse按下与弹起状态。弹起后我们要对它重新设置

1.private function MouseUp(event:MouseEvent):void{ move = false;}

最近我们还要一把魔法钥匙“--逐帧处理函数:

  1.private function onEnterFrame(e:Event):void{ // 渲染视口

  2. var cameraSpeed:Number = 0.3; // mouse速度大约一致.

3. if (move) { 
4. camera.targetpanangle = cameraSpeed*(stage.mouseX - lastMouseX) + lastPanAngle; 
5. camera.targettiltangle = cameraSpeed*(stage.mouseY - lastMouseY) + lastTiltAngle; 
6. } camera.hover(); View.render();}

这个函数计算出一个pantilt的目标值。在MouseDown处理函数里我们将mouse先前位置存在

lastMouseX/lastMouseY。减去现在mouse位置值就得到mouse的移动量,乘以一个速度常量(cameraSpeed

后再加上当前pan/tilt(lastPanAngle/lastTiltAngle). 最后调用hover()render()更新视口。如果你想反转

这过程你只要把参数倒过来一下:

 1.camera.targetpanangle = lastPanAngle - cameraSpeed*(stage.mouseX - lastMouseX);

2.camera.targettiltangle = lastTiltAngle - cameraSpeed*(stage.mouseY - lastMouseY);

只是相机绕3D物旋转众多方案里的一种,你可以作一个改进。增加一个滑动条来控制缩放(camera.zoom)如何?在本指南的后边还会回过头来探讨相机旋转问题,因此继续阅读让自已掌握的更多.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 内容概要 《计算机试卷1》是一份综合性的计算机基础和应用测试卷,涵盖了计算机硬件、软件、操作系统、网络、多媒体技术等多个领域的知识点。试卷包括单选题和操作应用两大类,单选题部分测试学生对计算机基础知识的掌握,操作应用部分则评估学生对计算机应用软件的实际操作能力。 ### 适用人群 本试卷适用于: - 计算机专业或信息技术相关专业的学生,用于课程学习或考试复习。 - 准备计算机等级考试或职业资格认证的人士,作为实战演练材料。 - 对计算机操作有兴趣的自学者,用于提升个人计算机应用技能。 - 计算机基础教育工作者,作为教学资源或出题参考。 ### 使用场景及目标 1. **学习评估**:作为学校或教育机构对学生计算机基础知识和应用技能的评估工具。 2. **自学测试**:供个人自学者检验自己对计算机知识的掌握程度和操作熟练度。 3. **职业发展**:帮助职场人士通过实际操作练习,提升计算机应用能力,增强工作竞争力。 4. **教学资源**:教师可以用于课堂教学,作为教学内容的补充或学生的课后练习。 5. **竞赛准备**:适合准备计算机相关竞赛的学生,作为强化训练和技能检测的材料。 试卷的目标是通过系统性的题目设计,帮助学生全面复习和巩固计算机基础知识,同时通过实际操作题目,提高学生解决实际问题的能力。通过本试卷的学习与练习,学生将能够更加深入地理解计算机的工作原理,掌握常用软件的使用方法,为未来的学术或职业生涯打下坚实的基础

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值