• 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中的左右键控制属性和标准赛车游戏中的不同,因为赛车游戏是用左右控制方向的,本人用的是鼠标。思路告诉大家,自行修改了.

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

  • 相关阅读:
    scp免密码登陆进行远程文件同步
    MAD(Median absolute deviation, 中位数绝对偏差)
    机器学习之评价准则RoC与PR
    最新HGVS基因突变命名规则速览
    Somatic vs Germline Mutations
    c/c++ 获取文件夹或目录下的文件
    诊断实验评估指标-灵敏度(sensitivity)特异度(specificity)准确度(accuracy)
    互斥量与条件变量(三步走战略)结合使用原理
    linux常用的时间获取函数(time,gettimeofday,clock_gettime,_ftime,localtime,strftime )
    dup和dup2应用实例(dup跟APUE有出入,close+dup=dup2?)
  • 原文地址:https://www.cnblogs.com/xignzou/p/3164180.html
Copyright © 2020-2023  润新知