cameraController---相机控制器

这里针对Away3D里面封装的CameraController的区别和使用做些简单介绍。相机控制器的设计思路比较清晰,所以难点东西不多。使用方面附上源码以供参考

一、概念

    其实没什么概念好讲。相机控制器:是指通过一定规范、更直观的方法和属性标注,提供对相机的坐标、角度的控制。因此也就提出了一点,如果默认提供的下述几个CameraController不满足使用,那么自行扩展,添加限制属性,不会很复杂。

二、Away3D中的CameraController介绍

  继承自ControllerBase的具体实现的相机控制器有5个,实际使用最多的包括FirstPersonController, hoverController, FollowController等。其关系图如下:

三、分类介绍

1、FirstPersonController第一人称视角。

  特点:根据当前观察角度提供前后左右移动的控制,可以修改相机Pan(水平旋转角度),Tilt(俯仰角度)等。

  应用场景:CS游戏里面的那种控制方式(IT人生应该都了解)

提供属性:

    incrementWalk 来调整前后

    incrementStrafe调整左右

   fly  标记是否飞行。即修改竖直方向的偏移(y轴)

使用关键代码如下:

  1. var myCamera:Camera3D = new Camera3D();
    _view3D.camera = myCamera;
  2. _cameraController = new FirstPersonController(myCamera);
  3. _cameraController.minTiltAngle = 0;
  4. _cameraController.maxTiltAngle = 90;
  5. myCamera.lookAt(new Vector3D(0,-0,0))
  6. this.addEventListener(Event.ADDED_TO_STAGE, addedHandler);
  7.  
  8. ////使用键盘操纵移动,在这个过程中相机角度平行变化,另外tiltAngle设置角度为0的时候视角刚好平观察对象点
  9. this.stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler);
  10.  
  11. private function keyUpHandler(event:KeyboardEvent):void
  12. {
  13. if(event.keyCode == 38)
  14. {
  15. _cameraController.incrementWalk(10)
  16. }
  17. else if(event.keyCode == 40)
  18. {
  19. _cameraController.incrementWalk(-10);
  20. }
  21. else if(event.keyCode == 39)
  22. {
  23. _cameraController.incrementStrafe(10);
  24. }
  25. else if(event.keyCode == 37)
  26. {
  27. _cameraController.incrementStrafe(-10);
  28. }
  29.  
  30. }

2、HoverController 观察视角

  特点: 提供针对观察点,或者观察物体的全方位观察,限制相机距离不会透视过观察点(或观察物体)

  应用: 街景。设置当前中心的观察点,提供一个可以旋转俯仰去观察四周景色的场景控制

提供属性:

distance: 设置相机距离观察点(观察物)的距离,>0 则可以避免透过物体

lookAtPosition(LookAtObject): 观察点,场景观察中心点。

示例代码如下:

  1. _cameraController = new HoverController(myCamera);
  2. _cameraController.distance = 1000;
  3. _cameraController.minTiltAngle = 0;
  4. _cameraController.maxTiltAngle = 90;
  5. _cameraController.tiltAngle = 20;
  6. _cameraController.lookAtPosition = new Vector3D(200, 200, 0);
  7. private function addedHandler(event:Event):void
  8. {
  9. this.stage.addEventListener(MouseEvent.MOUSE_MOVE, moveHandler);
  10. this.addEventListener(MouseEvent.MOUSE_WHEEL, wheelHandler);
  11. }
  12. //工作鼠标移动修改相机观察角度
  13. private function moveHandler(event:MouseEvent): void
  14. {
  15. _cameraController.panAngle = (this.mouseX * 2/ 300) * 60;
  16. _cameraController.tiltAngle = (this.mouseY * 2/ this.height - 1) * 45 + 45;
  17. }
  18. //修改观察距离
  19. private function wheelHandler(event:MouseEvent):void
  20. {
  21. if(event.delta > 0 && _cameraController.distance > 120)
  22. {
  23. _cameraController.distance -= 100;
  24. }
  25. else
  26. {
  27. _cameraController.distance += 100;
  28. }
  29. }

3、FollowController   跟随视角

特点: 视角跟随观察物发生变化,可以控制观察距离,旋转角度通过绑定观察物来控制,观察物旋转发生变化则变化,确保观察位于对屏幕中心,角度竖直垂直于屏幕。

      直接修改相机的旋转角度会在下次物体变化时被覆盖。

应用: 大场景3D游戏,人物走动跑动是周边景色随之后退。 赛车类游戏场景刷新等

属性:

lookAtObject: 视角跟随物,即游戏场景中的人,赛车游戏中的车等

    distance: 控制观察距离,类似游戏场景中的远景和近景区别

其他的,坐标同步跟随物的坐标,角度同步LookAtObject的角度

示例代码:  这里就不贴代码了,修改lookAtObject的x,y,z,rotateY,rotateX等

总结: 没什么好总结的,区别很明确,大家可以根据具体情况使用。附录中提供了firstController和FollowController的比较好的使用源码,供大家参考。  其中FollowDemo中的左右键控制属性和标准赛车游戏中的不同,因为赛车游戏是用左右控制方向的,本人用的是鼠标。思路告诉大家,自行修改了.

源码链接:http://files.cnblogs.com/xignzou/src.rar

Away3D引擎学习笔记(二)CameraController相机控制的应用的更多相关文章

  1. [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计

    源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...

  2. Away3D引擎学习笔记(三)模型拾取(翻译)

    原文详见http://away3d.com/tutorials/Introduction_to_Mouse_Picking.本文若有翻译不对的地方,敬请指出. 本教程详细介绍了Away3D 4.x中鼠 ...

  3. Away3D引擎学习笔记,持续更新

    (1). 准备工作,一些必须知道的东西 (创建时间:2014-06-05) A.必要的开发语言基础.至少要懂点ActionScript 3.0语法(ActionScript 3.0语法及API参考), ...

  4. Away3D引擎学习笔记(一)资源加载解析块

    前文:Away3D断断续续用了一段时间了,三维相关的很多算法,计算转换还是有点绕,整理些自己觉得还有点意思东西,希望大家有用. 三维开始,Away3D构架你场景那几行代码各处都有,这里就不copy了, ...

  5. python学习笔记二:流程控制

    一.if else: #!/usr/bin/python x = int(raw_input('please input:')) if x >= 90: if x >= 95: print ...

  6. [Firefly引擎][学习笔记一][已完结]带用户验证的聊天室

    原地址:http://bbs.9miao.com/thread-44571-1-1.html 前言:早在群里看到大鸡蛋分享他们团队的Firefly引擎,但一直没有时间去仔细看看,恰好最近需要开发一个棋 ...

  7. java之jvm学习笔记二(类装载器的体系结构)

    java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新 ...

  8. Java IO学习笔记二

    Java IO学习笔记二 流的概念 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成. 程序中的输入输 ...

  9. NumPy学习笔记 二

    NumPy学习笔记 二 <NumPy学习笔记>系列将记录学习NumPy过程中的动手笔记,前期的参考书是<Python数据分析基础教程 NumPy学习指南>第二版.<数学分 ...

随机推荐

  1. Wannafly挑战赛4 A解方程【二分/set/hash求解方程】

    https://www.nowcoder.com/acm/contest/35/A 题目描述 给出n个整数和x,请问这n个整数中是否存在三个数a,b,c使得ax2+bx+c=0,数字可以重复使用. 输 ...

  2. Python的并发并行[4] -> 并发[0] -> 利用线程池启动线程

    利用线程池启动线程 submit与map启动线程 利用两种方式分别启动线程,同时利用with上下文管理来对线程池进行控制 from concurrent.futures import ThreadPo ...

  3. apache和tomcat群集

    httpd.conf    httpd.conf中添加:    #与tomcat的插件    include "D:\clusterServer\apache\conf\mod_jk.con ...

  4. Ubuntu 16.04/CentOS 6.9安装Apache压力(并发)测试工具ab

    说明: ab工具已经在Apache中包含,如果不想安装Apache,那么可以使用下面方法单独安装. 安装: Ubuntu: sudo apt-get install apache2-utils Cen ...

  5. UBIFS - UBI File-System

    参考:http://www.linux-mtd.infradead.org/doc/ubifs.html#L_raw_vs_ftl UBIFS - UBI File-System Table of c ...

  6. sourceinsight----tabsiplus颜色配置文件

    参考: http://blog.csdn.net/orbit/article/details/7585607 下面是我的颜色配置 http://files.cnblogs.com/pengdongli ...

  7. Using xcodebuild To Export a .ipa From an Archive

    Xcode 6 changes how you export a .ipa from an archive for adhoc distribution. It used to be that you ...

  8. JS创建对象的方式有几种

    相信但凡作为一个前端工程师,都被面试到过这个面试题目,HR考察的就是对oop思想的理解. 作为一个从后端转过来的怂逼,oop一直是心中的永远的痛啊. 这几天一直在通读js高级程序设计,重复理解js创建 ...

  9. java.lang.NoSuchFieldError:INSTANCE

    Java.lang.NoSuchFieldError: INSTANCE异常,可能是包重复了. 我遇到的情况是maven里引入了一个JAR,而我又在lib里面引入了这个jar,并且版本还不相同,就出了 ...

  10. java 通过流的方式读取本地图片并显示在jsp 页面上(类型以jpg、png等结尾的图片)

    Java代码: File filePic = new File(path+"1-ab1.png"); if(filePic.exists()){ FileInputStream i ...