Away3D引擎学习笔记(二)CameraController相机控制的应用
cameraController---相机控制器
这里针对Away3D里面封装的CameraController的区别和使用做些简单介绍。相机控制器的设计思路比较清晰,所以难点东西不多。使用方面附上源码以供参考
一、概念
其实没什么概念好讲。相机控制器:是指通过一定规范、更直观的方法和属性标注,提供对相机的坐标、角度的控制。因此也就提出了一点,如果默认提供的下述几个CameraController不满足使用,那么自行扩展,添加限制属性,不会很复杂。
二、Away3D中的CameraController介绍
继承自ControllerBase的具体实现的相机控制器有5个,实际使用最多的包括FirstPersonController, hoverController, FollowController等。其关系图如下:

三、分类介绍
1、FirstPersonController第一人称视角。
特点:根据当前观察角度提供前后左右移动的控制,可以修改相机Pan(水平旋转角度),Tilt(俯仰角度)等。
应用场景:CS游戏里面的那种控制方式(IT人生应该都了解)
提供属性:
incrementWalk 来调整前后
incrementStrafe调整左右
fly 标记是否飞行。即修改竖直方向的偏移(y轴)
使用关键代码如下:
var myCamera:Camera3D = new Camera3D();
_view3D.camera = myCamera;
_cameraController = new FirstPersonController(myCamera);
_cameraController.minTiltAngle = 0;
_cameraController.maxTiltAngle = 90;
myCamera.lookAt(new Vector3D(0,-0,0))
this.addEventListener(Event.ADDED_TO_STAGE, addedHandler); ////使用键盘操纵移动,在这个过程中相机角度平行变化,另外tiltAngle设置角度为0的时候视角刚好平观察对象点
this.stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler); private function keyUpHandler(event:KeyboardEvent):void
{
if(event.keyCode == 38)
{
_cameraController.incrementWalk(10)
}
else if(event.keyCode == 40)
{
_cameraController.incrementWalk(-10);
}
else if(event.keyCode == 39)
{
_cameraController.incrementStrafe(10);
}
else if(event.keyCode == 37)
{
_cameraController.incrementStrafe(-10);
} }
2、HoverController 观察视角
特点: 提供针对观察点,或者观察物体的全方位观察,限制相机距离不会透视过观察点(或观察物体)
应用: 街景。设置当前中心的观察点,提供一个可以旋转俯仰去观察四周景色的场景控制
提供属性:
distance: 设置相机距离观察点(观察物)的距离,>0 则可以避免透过物体
lookAtPosition(LookAtObject): 观察点,场景观察中心点。
示例代码如下:
_cameraController = new HoverController(myCamera);
_cameraController.distance = 1000;
_cameraController.minTiltAngle = 0;
_cameraController.maxTiltAngle = 90;
_cameraController.tiltAngle = 20;
_cameraController.lookAtPosition = new Vector3D(200, 200, 0);
private function addedHandler(event:Event):void
{
this.stage.addEventListener(MouseEvent.MOUSE_MOVE, moveHandler);
this.addEventListener(MouseEvent.MOUSE_WHEEL, wheelHandler);
}
//工作鼠标移动修改相机观察角度
private function moveHandler(event:MouseEvent): void
{
_cameraController.panAngle = (this.mouseX * 2/ 300) * 60;
_cameraController.tiltAngle = (this.mouseY * 2/ this.height - 1) * 45 + 45;
}
//修改观察距离
private function wheelHandler(event:MouseEvent):void
{
if(event.delta > 0 && _cameraController.distance > 120)
{
_cameraController.distance -= 100;
}
else
{
_cameraController.distance += 100;
}
}
3、FollowController 跟随视角
特点: 视角跟随观察物发生变化,可以控制观察距离,旋转角度通过绑定观察物来控制,观察物旋转发生变化则变化,确保观察位于对屏幕中心,角度竖直垂直于屏幕。
直接修改相机的旋转角度会在下次物体变化时被覆盖。
应用: 大场景3D游戏,人物走动跑动是周边景色随之后退。 赛车类游戏场景刷新等
属性:
lookAtObject: 视角跟随物,即游戏场景中的人,赛车游戏中的车等
distance: 控制观察距离,类似游戏场景中的远景和近景区别
其他的,坐标同步跟随物的坐标,角度同步LookAtObject的角度
示例代码: 这里就不贴代码了,修改lookAtObject的x,y,z,rotateY,rotateX等
总结: 没什么好总结的,区别很明确,大家可以根据具体情况使用。附录中提供了firstController和FollowController的比较好的使用源码,供大家参考。 其中FollowDemo中的左右键控制属性和标准赛车游戏中的不同,因为赛车游戏是用左右控制方向的,本人用的是鼠标。思路告诉大家,自行修改了.
Away3D引擎学习笔记(二)CameraController相机控制的应用的更多相关文章
- [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计
源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...
- Away3D引擎学习笔记(三)模型拾取(翻译)
原文详见http://away3d.com/tutorials/Introduction_to_Mouse_Picking.本文若有翻译不对的地方,敬请指出. 本教程详细介绍了Away3D 4.x中鼠 ...
- Away3D引擎学习笔记,持续更新
(1). 准备工作,一些必须知道的东西 (创建时间:2014-06-05) A.必要的开发语言基础.至少要懂点ActionScript 3.0语法(ActionScript 3.0语法及API参考), ...
- Away3D引擎学习笔记(一)资源加载解析块
前文:Away3D断断续续用了一段时间了,三维相关的很多算法,计算转换还是有点绕,整理些自己觉得还有点意思东西,希望大家有用. 三维开始,Away3D构架你场景那几行代码各处都有,这里就不copy了, ...
- python学习笔记二:流程控制
一.if else: #!/usr/bin/python x = int(raw_input('please input:')) if x >= 90: if x >= 95: print ...
- [Firefly引擎][学习笔记一][已完结]带用户验证的聊天室
原地址:http://bbs.9miao.com/thread-44571-1-1.html 前言:早在群里看到大鸡蛋分享他们团队的Firefly引擎,但一直没有时间去仔细看看,恰好最近需要开发一个棋 ...
- java之jvm学习笔记二(类装载器的体系结构)
java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新 ...
- Java IO学习笔记二
Java IO学习笔记二 流的概念 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成. 程序中的输入输 ...
- NumPy学习笔记 二
NumPy学习笔记 二 <NumPy学习笔记>系列将记录学习NumPy过程中的动手笔记,前期的参考书是<Python数据分析基础教程 NumPy学习指南>第二版.<数学分 ...
随机推荐
- ACM入门指南
本文已经转移到了:http://harryguo.me/2015/11/03/ACM-%E5%85%A5%E9%97%A8%E6%8C%87%E5%8D%97/ 什么是ACM? 想必打开这篇博客的人已 ...
- [COCI2015]TRAKTOR
题目大意: 一个$X\times Y(X,Y\leq10^5)$的格子中,每秒钟依次$n(n\leq10^6)$个蘑菇, 告诉你每个蘑菇出现的时间和位置,问何时第一次出现$k(2\leq k\leq ...
- php升级版本
Centos下Yum安装PHP5.5,5.6,7.0 默认的版本太低了,手动安装有一些麻烦,想采用Yum安装的可以使用下面的方案: 1.检查当前安装的PHP包 yum list installed | ...
- [BZOJ1179][APIO2009][强连通分量Tarjan+spfa]ATM
[BZOJ1179][APIO2009]ATM Input 第一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i ...
- Linux下安装PHP的GD支持库
Linux下安装PHP的GD支持库 1.安装 zlib wget ftp://ftp.sunfreeware.com/pub/freeware/SOURCES/zlib-1.2.3.tar.gz ...
- 新建一个兼容eclipse和myeclipse、IDEA都兼容的项目结构(maven)
以下观点为个人理解,没实践过,后续再实现. 思路: 1.eclipse和myeclipse.IDEA这些开发工具新建的各自的项目时,都有自己的一套思路,项目结构都有各自的特点. 2.如果是这些开发工具 ...
- 异常如果一直被throws抛出的话就会被jvm异常处理器处理了
异常如果一直被throws抛出的话就会被jvm异常处理器处理了,这时jvm会跳出正常运行状态. 异常如果一直被throws抛出的话就会被jvm异常处理器处理了,这时jvm会跳出正常运行状态. 异常如果 ...
- [置顶]
kubernetes创建资源yaml文件例子--rc
apiVersion: v1 #指定api版本,此值必须在kubectl apiversion中 kind: ReplicationController #指定创建资源的角色/类型 metadata: ...
- setInterval/setTimeout传参方法
网上文章说有3种方法,对于我来说一种方法就够了: <script> var user_name='离间计' //定时器 异步运行 function hello(name){ alert(n ...
- IP分类:A,B,C,D,E五类
IP地址分为五类: IP地址分为五类:A类保留给政府机构,B类分配给中等规模的公司,C类分配给任何需要的人,D类用于组播,E类用于实验. 常用的三类IP地址 IP = 网路地址(网络号)+主机地址(主 ...