flex中Away3D更复杂的例子(支持拖拽改变摄像头角度)

1,下面通过一个更复杂的样例,演示Away3D的使用

(1)舞台中央添加一个地板,地板上方放置一个方块。方块与地板间有一段距离。

(2)地板和方块使用不同的纹理皮肤。

(3)默认摄像头的角度是沿x轴倾斜15度。

(4)按住鼠标左键拖动视图可以改变摄像头的视角,鼠标滚轮可以改变摄像头远近距离。

(5)整个舞台随窗口大小改变,一直保持全屏。

(6)添加抗锯齿设置,使物体边缘更加平滑。 

 

2,效果图如下:

package{
    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.geom.Vector3D;
     
    import away3d.containers.View3D;
    import away3d.controllers.HoverController;
    import away3d.entities.Mesh;
    import away3d.materials.TextureMaterial;
    import away3d.primitives.CubeGeometry;
    import away3d.utils.Cast;
     
    [SWF(frameRate="60", backgroundColor="#FFFFFF")]
    public class S3 extends Sprite {
         
        private  var _view3D:View3D;
        private var cameraController:HoverController;//360全景展示相机控制器
         
        //物体 图片(用作方块 的纹理 )
        [Embed(source="assets/snow_diffuse.png")]
        private var blockClass:Class;
         
        //地板图片(用作地板的纹理 )
        [Embed(source="assets/road.jpg")]
        private var floorClass:Class;
         
        //物体材质
        private var blockMaterial:TextureMaterial;
         
        //地板材质
        private var floorMaterial:TextureMaterial;
         
        private var lastPanAngle:Number;
        private var lastTiltAngle:Number;
        private var lastMouseX:Number;
        private var lastMouseY:Number;
        private var move:Boolean;
         
        public function S3() {
            initEngine();
            initMaterials();
            initObjects();
            initListeners();
        }
         
        /**
         * 初始化引擎
         */
        private function initEngine():void
        {
            stage.scaleMode = StageScaleMode.NO_SCALE;
            stage.align = StageAlign.TOP_LEFT;
             
            // 创建一个视口
            _view3D = new View3D();
            _view3D.antiAlias = 4; //设置抗锯齿级别
             
            //初始化摄像头
            cameraController = new HoverController(_view3D.camera);
            /*cameraController.distance = 1000;
            cameraController.minTiltAngle = 0;
            cameraController.maxTiltAngle = 90;
            cameraController.panAngle = 45;*/
            cameraController.tiltAngle = 15;
             
            addChild(_view3D);
        }
         
        /**
         * 初始化材质
         */
        private function initMaterials():void
        {
            //地板的纹理
            floorMaterial = new TextureMaterial(Cast.bitmapTexture(floorClass));
            //方块 的纹理
            blockMaterial = new TextureMaterial(Cast.bitmapTexture(blockClass));
        }
         
        /**
         * 初始化物体
         */
        private function initObjects():void
        {
            // 在三维舞台中创建一个方块(地板 )
            var cube1:Mesh = new Mesh(new CubeGeometry(700, 20, 500), floorMaterial);
            _view3D.scene.addChild(cube1);
             
            // 在三维舞台中创建一个方块(地板上的 方块 )
            var cube2:Mesh = new Mesh(new CubeGeometry(200, 70, 200), blockMaterial);
            cube2.position = new Vector3D(0,100,0);
            _view3D.scene.addChild(cube2);
        }
         
        /**
         * 初始化监听
         */
        private function initListeners():void
        {
            addEventListener(Event.ENTER_FRAME, _onEnterFrame);
            //鼠标事件监听
            stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
            stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
            stage.addEventListener(MouseEvent.MOUSE_WHEEL,onWheel);
            stage.addEventListener(Event.RESIZE, onResize);
            onResize();
        }
         
        /**
         * 渲染视图
         */
        private function _onEnterFrame(e:Event):void
        {
             
            //移动视角
            if (move) {
                cameraController.panAngle = 0.3 * (stage.mouseX - lastMouseX) + lastPanAngle;
                cameraController.tiltAngle = 0.3 * (stage.mouseY - lastMouseY) + lastTiltAngle;
            }
            //渲染视图
            _view3D.render();
        }
         
        /**
         * 使用舞台大小一直全屏
         */
        private function onResize(event:Event = null):void
        {
            _view3D.width = stage.stageWidth;
            _view3D.height = stage.stageHeight;
        }
         
        /**
         * 鼠标滚轮事件
         */
        private function onWheel(e:MouseEvent):void
        {
            if(e.delta > 0){
                if(cameraController.distance < 1000)
                    cameraController.distance += 100;
            }else{
                if(cameraController.distance > 600)
                    cameraController.distance -= 100;
            }
        }
         
        /**
         * 鼠标按下事件
         */
        private function onMouseDown(event:MouseEvent):void
        {
            lastPanAngle = cameraController.panAngle;
            lastTiltAngle = cameraController.tiltAngle;
            lastMouseX = stage.mouseX;
            lastMouseY = stage.mouseY;
            move = true;
        }
         
        /**
         * 鼠标弹起事件
         */
        private function onMouseUp(event:MouseEvent):void
        {
            move = false;
        }
    }
}

时间: 2024-09-15 05:51:35

flex中Away3D更复杂的例子(支持拖拽改变摄像头角度)的相关文章

java-实现文件上传,可批量上传,支持拖拽上传

问题描述 实现文件上传,可批量上传,支持拖拽上传 5C 做一个web展示一下,文件上传,如果支持断点传续更好,希望上传的文件保存到数据库....要不就保存到指定目录 解决方案 http://www.ablanxue.com/prone_20698_1.html 解决方案二: 文件上传,支持批量上传

c#-谁能用C#帮我实现一个支持拖拽的列表框/列表视图

问题描述 谁能用C#帮我实现一个支持拖拽的列表框/列表视图 需要一个示例代码 我没学过C# 我现在需要一份用C#实现的代码 和我用MFC实现的代码来比较两者的效率 希望各位大哥大姐帮帮忙 谢谢了 解决方案 C# 两个listView内部和相互拖拽,任意位置拖拽,不重复,自动排序

求助:echarts柱状图可以支持拖拽某个柱,例如当前柱子为10,拖拽到20

问题描述 求助:echarts柱状图可以支持拖拽某个柱,例如当前柱子为10,拖拽到20 如题,就是将柱子拖拽,改变柱子的值,能实现这个功能吗?求助(没分了,只有心里感恩大神的帮助啦)

html中去掉textarea右侧滚动条和右下角拖拽

我们经常会把去掉html页面的滚动条了,通常如下 掉左右滚动条,保留上下滚动条:<body style="overflow-x:hidden;overflow-y:auto;"> 如果页面头部有:<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 需要去掉该代码,或者改为

WPF中Slider实时记录播放进度并且拖拽滑动Thumb实现播放进度的控制

问题描述 这个问题很多人都应该考虑过不过我来说说我的解决方法吧!就用MediaPlayer控件来举例:前面的问题比较容易解决,就是用一个Timer利用Tick事件去不停的获取正在播放的多媒体文件的当前播放位置.贴上代码:然后后面的问题解决方案可能很多人会想到用Slider的ValueChanged事件去写,可是这个拖拽并不是唯一一个触发ValueChanged事件的,在播放过程中Slider的Value属性一直在变化,很多人就看到了冲突.这个问题我是这样解决的,其实也是很简单的,我们可以用Mou

flex中Away3D计算两点间的距离、两点间的中点例子

在Away3D开发中,有时需要计算两个点(Vector3D )之间的距离或者中点.假设有如下v1.v2两个坐标点. 1,两点间的距离(线段长度) var v1:Vector3D = new Vector3D(0,0,0); var v2:Vector3D = new Vector3D(200,200,200); var lenght:Number =  v1.subtract(v2).length;  //346.41016151377545 2,两点间的中点(线段中点) var v1:Vect

flex中Away3D 鼠标到Mesh物体上,物体显示边框、高亮显示

有时需要给Mesh元件添加鼠标交互效果,比如鼠标移到上面显示些信息,鼠标移出信息消失.在鼠标移入移出的时候,如果能同时改变下Mesh的样式会起到更好的显示效果.   1,鼠标移入时显示边框 实现方式是监听鼠标的移入移出事件,动态地设置 Mesh 的 showBounds 属性.效果图如下: package{     import flash.display.Sprite;     import flash.display.StageAlign;     import flash.display.

谁能用C#帮我实现一个支持拖拽的列表框/列表视图

问题描述 需要一个示例代码我没学过C#我现在需要一份用C#实现的代码和我用MFC实现的代码来比较两者的效率希望各位大哥大姐帮帮忙谢谢了 解决方案

javascript支持firefox,ie7页面布局拖拽效果代码_javascript技巧

javascript 拖拽JavaScript Google IG Drag Demo,非常棒的拖动,准备用于F2Blog新Theme的后台模块设置,之间的拖 动 拖拽效果的页面效果演示地址:http://img.jb51.net/online/tuozhuai/google_drag.htm加强版效果演示地址:http://img.jb51.net/online/tuozhuai/google_drag2.htm拖拽原理: 关于拖拽的基础,可以参考这篇文章,讲得非常不错. 其实原理很简单,就是