基于Away3D实现全景的相机控制器。
最近研究打算做个全景的Demo,发现Away3D本身的天空盒跟全景属于两种完全不同东西。最后只能基于HoverController来扩展(原因是HoverController能提供的距离控制,类似拉近拉远的效果)等不够好用。下面直接贴出扩展的代码,命名RotateController。
其实也就是在HoverController的基础上添加了对distance的距离判断,添加了对负值的显示控制..
package away3d.controllers
{
import away3d.core.math.MathConsts;
import away3d.core.render.PositionRenderer;
import away3d.entities.Entity; import flash.geom.Matrix3D;
import flash.geom.Vector3D; public class RotateController extends ControllerBase
{
private var _distance:Number = 100; private var _panAngle:Number = 0; private var _tiltAngle:Number = 0; private var _currentTiltAngle:Number = 0; private var _currentPanAngle:Number = 0; public function RotateController(targetObject:Entity=null)
{
super(targetObject);
} override public function update(interpolate:Boolean=false):void
{
if (_invalid) {
_invalid = false; if (_panAngle < 0) {
_currentPanAngle += _panAngle%360 + 360 - _panAngle;
_panAngle = _panAngle%360 + 360;
} else {
_currentPanAngle += _panAngle%360 - _panAngle;
_panAngle = _panAngle%360;
} while (_panAngle - _currentPanAngle < -180)
_currentPanAngle -= 360; while (_panAngle - _currentPanAngle > 180)
_currentPanAngle += 360; _currentPanAngle = _panAngle;
_currentTiltAngle = _tiltAngle; if(targetObject)
{
var tempMatrix3d:Matrix3D = targetObject.transform;
tempMatrix3d.identity(); tempMatrix3d.appendRotation(_currentTiltAngle, Vector3D.X_AXIS);
tempMatrix3d.appendRotation(_currentPanAngle, Vector3D.Y_AXIS); var pos:Vector3D = new Vector3D;
pos.x = distance*Math.sin(_currentPanAngle*MathConsts.DEGREES_TO_RADIANS)*Math.cos(_currentTiltAngle*MathConsts.DEGREES_TO_RADIANS);
pos.z = distance*Math.cos(_currentPanAngle*MathConsts.DEGREES_TO_RADIANS)*Math.cos(_currentTiltAngle*MathConsts.DEGREES_TO_RADIANS);
pos.y = distance*Math.sin(_currentTiltAngle*MathConsts.DEGREES_TO_RADIANS); tempMatrix3d.appendTranslation(pos.x, -pos.y, pos.z); targetObject.transform = tempMatrix3d; }
}
} public function get distance():Number
{
return _distance;
} public function set distance(value:Number):void
{
_distance = value;
_invalid = true;
notifyUpdate();
} public function get panAngle():Number
{
return _panAngle;
} public function set panAngle(value:Number):void
{
_panAngle = value;
_invalid = true;
notifyUpdate();
} public function get tiltAngle():Number
{
return _tiltAngle;
} public function set tiltAngle(value:Number):void
{
_tiltAngle = Math.max(-90, Math.min(90, value));
_invalid = true;
notifyUpdate();
} private var _invalid:Boolean = false;
}
}
基于Away3D实现全景的相机控制器。的更多相关文章
- 基于VR三维全景的虚拟展馆展览实现
VR三维全景虚拟现实技术的应用,能够通过全方位互动式来还原真实场景,令人产生一种身临其境的感觉,由于三维全景虚拟现实技术具有一定应用优势,其在企业与院校展示.建筑规划展示.酒店宾馆展示等方面都逐步得到 ...
- 基于MIG IP核的DDR3控制器(一)
最近学习了DDR3控制器的使用,也用着DDR完成了一些简单工作,想着以后一段可能只用封装过后的IP核,可能会忘记DDR3控制器的一些内容,想着把这个DDR控制器的编写过程记录下来,便于我自己以后查看吧 ...
- 基于USB3.0的双目相机测试小结之CC1605配合CS5642 双目 500w摄像头
基于USB3.0的双目相机测试小结之CC1605配合CS5642 双目 500w摄像头 CC1605双目相机评估板可以配合使用柴草电子绝大多数摄像头应用 如:OV5640.OV5642.MT9P03 ...
- 基于MIG IP核的DDR3控制器(二)
上一节中,记录到了ddr控制器的整体架构,在本节中,准备把ddr控制器的各个模块完善一下. 可以看到上一节中介绍了DDR控制器的整体架构,因为这几周事情多,又要课设什么的麻烦,今天抽点时间把这个记录完 ...
- 图像处理之全景拼接---基于sift的全景图像拼接
http://blog.csdn.net/masibuaa/article/details/9246493#comments
- 基于fpga的256m的SDRAM控制器
2018/7/26 受教于邓堪文老师,开始真真学习控制sdram 由于自己买的sdram模块是256的,原来老师的是128,所以边学边改,不知道最后好不好使,但是我有信心 一.sdram的初始化 sd ...
- Away3D引擎学习笔记(二)CameraController相机控制的应用
cameraController---相机控制器 这里针对Away3D里面封装的CameraController的区别和使用做些简单介绍.相机控制器的设计思路比较清晰,所以难点东西不多.使用方面附上源 ...
- 相机标定:PNP基于单应面解决多点透视问题
利用二维视野内的图像,求出三维图像在场景中的位姿,这是一个三维透视投影的反向求解问题.常用方法是PNP方法,需要已知三维点集的原始模型. 本文做了大量修改,如有不适,请移步原文: ...
- 2014.04.28基于CPLD的LCOS场序彩色视频控制器设计
基于CPLD的LCOS场序彩色视频控制器设计 作者:宋丹娜,代永平,刘艳艳,商广辉 发表刊物:液晶与显示,2009 学习时间:2014.04.28 文章讲述了-- (和上一篇论文有些相似之处) 1. ...
随机推荐
- HTTP隧道工具HTTPTunnel
HTTP隧道工具HTTPTunnel 在很多服务器上,防火墙会限制主机的出站流量,只允许80之类的端口.如果要使用其他端口,只能通过HTTP隧道方式实现.Kali Linux提供一款HTTP隧道工 ...
- Oracle 后台进程
一.基本后台进程 1.数据库写入进程(DBWn): 数据库写入程序讲数据库告诉缓存区中的修改块写入数据文件.对于多数系统来说,一个数据库写入程序(DBW0)就已经足够,但是对于 ...
- Longest Absolute File Path -- LeetCode
Suppose we abstract our file system by a string in the following manner: The string "dir\n\tsub ...
- [BZOJ3816][清华集训2014]矩阵变换(稳定婚姻问题)
3816: 矩阵变换 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 803 Solved: 578[Submit][Status][Discuss] ...
- Scala实战高手****第10课:Scala继承彻底实战和Spark源码鉴赏
isInstanceOf 和 asInstanceOf is用于判断 as用于转换,把父类类型转换成子类类型 getClass 具体找出类型
- 线程协作-Semaphore并发限制
Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源.
- PHP反射(ReflectionClass、ReflectionMethod)在ThinkPHP框架的控制器调度模块中的应用
ThinkPHP框架的控制器模块是如何实现 前控制器.后控制器,及如何执行带参数的方法? PHP系统自带的 ReflectionClass.ReflectionMethod 类,可以反射用户自定义类的 ...
- javascript快速入门5--数组与对象
数组 数组,实际上就是将一大堆相似的数据有秩序的放在格子箱中,十分像药房里的那些柜子. 数据1 数据2 数据3 数据4 数据5 数据6 用代码创建数组 var arr = new Array();// ...
- struts2设置文件上传大小
利用struts2想要设置或者限制上传文件的大小,可以在struts.xml配置文件里面进行如下配置: <constant name="struts.multipart.maxSize ...
- Python数据整合与数据准备-BigGorilla实例应用
参考文档:http://www.biggorilla.org/walkt/ 一.BigGorilla应用主要步骤 如下图: 二.实例应用 1.数据获取 urllib是非常受欢迎的用于在网络上读取数据的 ...