最近研究打算做个全景的Demo,发现Away3D本身的天空盒跟全景属于两种完全不同东西。最后只能基于HoverController来扩展(原因是HoverController能提供的距离控制,类似拉近拉远的效果)等不够好用。下面直接贴出扩展的代码,命名RotateController。

其实也就是在HoverController的基础上添加了对distance的距离判断,添加了对负值的显示控制..

  1. package away3d.controllers
  2. {
  3. import away3d.core.math.MathConsts;
  4. import away3d.core.render.PositionRenderer;
  5. import away3d.entities.Entity;
  6.  
  7. import flash.geom.Matrix3D;
  8. import flash.geom.Vector3D;
  9.  
  10. public class RotateController extends ControllerBase
  11. {
  12. private var _distance:Number = 100;
  13.  
  14. private var _panAngle:Number = 0;
  15.  
  16. private var _tiltAngle:Number = 0;
  17.  
  18. private var _currentTiltAngle:Number = 0;
  19.  
  20. private var _currentPanAngle:Number = 0;
  21.  
  22. public function RotateController(targetObject:Entity=null)
  23. {
  24. super(targetObject);
  25. }
  26.  
  27. override public function update(interpolate:Boolean=false):void
  28. {
  29. if (_invalid) {
  30. _invalid = false;
  31.  
  32. if (_panAngle < 0) {
  33. _currentPanAngle += _panAngle%360 + 360 - _panAngle;
  34. _panAngle = _panAngle%360 + 360;
  35. } else {
  36. _currentPanAngle += _panAngle%360 - _panAngle;
  37. _panAngle = _panAngle%360;
  38. }
  39.  
  40. while (_panAngle - _currentPanAngle < -180)
  41. _currentPanAngle -= 360;
  42.  
  43. while (_panAngle - _currentPanAngle > 180)
  44. _currentPanAngle += 360;
  45.  
  46. _currentPanAngle = _panAngle;
  47. _currentTiltAngle = _tiltAngle;
  48.  
  49. if(targetObject)
  50. {
  51. var tempMatrix3d:Matrix3D = targetObject.transform;
  52. tempMatrix3d.identity();
  53.  
  54. tempMatrix3d.appendRotation(_currentTiltAngle, Vector3D.X_AXIS);
  55. tempMatrix3d.appendRotation(_currentPanAngle, Vector3D.Y_AXIS);
  56.  
  57. var pos:Vector3D = new Vector3D;
  58. pos.x = distance*Math.sin(_currentPanAngle*MathConsts.DEGREES_TO_RADIANS)*Math.cos(_currentTiltAngle*MathConsts.DEGREES_TO_RADIANS);
  59. pos.z = distance*Math.cos(_currentPanAngle*MathConsts.DEGREES_TO_RADIANS)*Math.cos(_currentTiltAngle*MathConsts.DEGREES_TO_RADIANS);
  60. pos.y = distance*Math.sin(_currentTiltAngle*MathConsts.DEGREES_TO_RADIANS);
  61.  
  62. tempMatrix3d.appendTranslation(pos.x, -pos.y, pos.z);
  63.  
  64. targetObject.transform = tempMatrix3d;
  65.  
  66. }
  67. }
  68. }
  69.  
  70. public function get distance():Number
  71. {
  72. return _distance;
  73. }
  74.  
  75. public function set distance(value:Number):void
  76. {
  77. _distance = value;
  78. _invalid = true;
  79. notifyUpdate();
  80. }
  81.  
  82. public function get panAngle():Number
  83. {
  84. return _panAngle;
  85. }
  86.  
  87. public function set panAngle(value:Number):void
  88. {
  89. _panAngle = value;
  90. _invalid = true;
  91. notifyUpdate();
  92. }
  93.  
  94. public function get tiltAngle():Number
  95. {
  96. return _tiltAngle;
  97. }
  98.  
  99. public function set tiltAngle(value:Number):void
  100. {
  101. _tiltAngle = Math.max(-90, Math.min(90, value));
  102. _invalid = true;
  103. notifyUpdate();
  104. }
  105.  
  106. private var _invalid:Boolean = false;
  107. }
  108. }

基于Away3D实现全景的相机控制器。的更多相关文章

  1. 基于VR三维全景的虚拟展馆展览实现

    VR三维全景虚拟现实技术的应用,能够通过全方位互动式来还原真实场景,令人产生一种身临其境的感觉,由于三维全景虚拟现实技术具有一定应用优势,其在企业与院校展示.建筑规划展示.酒店宾馆展示等方面都逐步得到 ...

  2. 基于MIG IP核的DDR3控制器(一)

    最近学习了DDR3控制器的使用,也用着DDR完成了一些简单工作,想着以后一段可能只用封装过后的IP核,可能会忘记DDR3控制器的一些内容,想着把这个DDR控制器的编写过程记录下来,便于我自己以后查看吧 ...

  3. 基于USB3.0的双目相机测试小结之CC1605配合CS5642 双目 500w摄像头

    基于USB3.0的双目相机测试小结之CC1605配合CS5642  双目 500w摄像头 CC1605双目相机评估板可以配合使用柴草电子绝大多数摄像头应用 如:OV5640.OV5642.MT9P03 ...

  4. 基于MIG IP核的DDR3控制器(二)

    上一节中,记录到了ddr控制器的整体架构,在本节中,准备把ddr控制器的各个模块完善一下. 可以看到上一节中介绍了DDR控制器的整体架构,因为这几周事情多,又要课设什么的麻烦,今天抽点时间把这个记录完 ...

  5. 图像处理之全景拼接---基于sift的全景图像拼接

    http://blog.csdn.net/masibuaa/article/details/9246493#comments

  6. 基于fpga的256m的SDRAM控制器

    2018/7/26 受教于邓堪文老师,开始真真学习控制sdram 由于自己买的sdram模块是256的,原来老师的是128,所以边学边改,不知道最后好不好使,但是我有信心 一.sdram的初始化 sd ...

  7. Away3D引擎学习笔记(二)CameraController相机控制的应用

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

  8. 相机标定:PNP基于单应面解决多点透视问题

              利用二维视野内的图像,求出三维图像在场景中的位姿,这是一个三维透视投影的反向求解问题.常用方法是PNP方法,需要已知三维点集的原始模型. 本文做了大量修改,如有不适,请移步原文:  ...

  9. 2014.04.28基于CPLD的LCOS场序彩色视频控制器设计

    基于CPLD的LCOS场序彩色视频控制器设计 作者:宋丹娜,代永平,刘艳艳,商广辉 发表刊物:液晶与显示,2009 学习时间:2014.04.28 文章讲述了-- (和上一篇论文有些相似之处) 1. ...

随机推荐

  1. HDOJ 4812 D Tree

    Discription There is a skyscraping tree standing on the playground of Nanjing University of Science ...

  2. 【数论】【欧拉函数】bzoj2190 [SDOI2008]仪仗队

    由图可知,一个人无法被看到时,当且仅当有 人与原点 的斜率与他相同,且在他之前. ∴一个人可以被看到,设其斜率为y/x,当且仅当y/x不可再约分,即gcd(x,y)=1. 考虑将图按对角线划分开,两部 ...

  3. Java高级架构师(一)第11节:Mybatis的分页实现

  4. Androids中数据库的使用SQLite

    (一) 知识点: SQLite3支持的数据类型:NULL,INTEGER,REAL(浮点数字),TEXT(字符串文本),BLOB(二进制对象),虽然他支持的类型只有五种,但实际上sqlite3也接受v ...

  5. 从cmd连接mysql数据库控制台

    在cmd中进入mysql安装目录的bin目录然后执行命令 mysql -uuser -ppassword database比如用户名为root,密码为mysql,数据库为test命令如下mysql - ...

  6. Linux下Shell脚本替换换行符(转)

    说明:过滤换行符确实有点吭,不是那么好弄.处理文本时需要将换行符替换为空格,若使用sed命令会比较麻烦,而使用tr命令非常方便. 输入文本(country.txt) China America Fra ...

  7. 谁说 JavaScript 很简单了?

    转载请注明出处,保留原文链接以及作者信息 本文介绍了 JavaScript 初学者应该知道的一些技巧和陷阱.如果你是老司机,就当做回顾了,哪里有写的不好的地方欢迎指出. 1. 你是否尝试过对一个数字数 ...

  8. linux如何启动/停止/重启MySQL

    如何启动/停止/重启MySQL 一.启动方式 1.使用 service 启动:service mysqld start2.使用 mysqld 脚本启动:/etc/inint.d/mysqld star ...

  9. jquery如何判断元素是否被点击、属性操作、class操作

    1.通过点击事件发生后,改变标志位的值,记录点击状态 function(){ var isClick = false; $('#test').click(function(){isClick = tr ...

  10. ubuntu16.04_install_saltstack_更新版本

    一.ubuntu16.04版本,安装saltstack 参考官方文档: https://repo.saltstack.com/#ubuntu 二.安装方法 Installs the latest re ...