zoukankan      html  css  js  c++  java
  • 基于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;
        }
    }
  • 相关阅读:
    北风设计模式课程---22、责任链模式
    bootstarp modal自己主动调整宽度的JS代码
    谷歌技术面试要点(Google面试)(14年5月20日交大专场)
    ASCII与Unicode编码消息写文件浅析
    程序编写中的细节问题
    Oracle使用并行建索引须要注意的问题
    PHP读取Excel里的文件
    Oracle db中 CONNECT role的含义
    集团信息化之路—电子採购软件与现有库存及財务软件数据对接的探讨
    NTP方式保证以时间戳同步可靠性
  • 原文地址:https://www.cnblogs.com/xignzou/p/3603544.html
Copyright © 2011-2022 走看看