纳金网

标题: Away3d材质实战——旋转的地球 [打印本页]

作者: yeu1233    时间: 2012-9-4 16:02
标题: Away3d材质实战——旋转的地球
使用现有的flash player API能够实现三维旋转的地球,但是比较麻烦,主要使用的是flash player10新增加的绘图API drawTriangles,这里我使用Away3d来实现旋转的地球。
Away3d能使用多种材质,都在Away3d.materials.*包里面,这个包里面有不下20种材质,它能够使用位图、视频、外部swf文件以及线框等等来作为材质。而且在使用swf作为材质时,还能够保有其交互性,可以说是只有你想不到,没有你做不到。但是不同的材质对系统需求不同,毫无疑问,视频文件以及swf文件作为材质消耗系统资源要比位图、线框材质多一些,废话少说下面看代码(地球的贴图文件我会传上来,大家可以试试):







    package   
    {  
        import away3d.cameras.HoverCamera3D;  
        import away3d.containers.View3D;  
        import away3d.core.utils.Cast;  
        import away3d.materials.BitmapMaterial;  
        import away3d.primitives.Sphere;  
         
        import flash.display.Sprite;  
        import flash.events.Event;  
         
        /**  
         * ...  
         * @author aisajiajiao  
         * 旋转的地球  
         */  
        public class MaterialDemo extends Sprite  
        {  
            //这是我机器上的文件路径,在自己实验的时候一定要确保路径正确  
            [Embed(source="../assets/map.jpg")]  
            private var Earth:Class;  
              
            private var _view:View3D;  
            private var _camera:HoverCamera3D;  
            private var _sphere:Sphere;  
            private var _material:BitmapMaterial;  
              
            public function MaterialDemo()   
            {  
                //配置摄像机  
                _camera = new HoverCamera3D();  
                //Camera的仰角,单位度而非弧度,默认为0  
                _camera.tiltAngle = 10;  
                //Camera在y轴上的旋转角度,默认为0单位也是度  
                _camera.panAngle = 180;  
                //摄像头与指定目标之间的距离,默认是800  
                _camera.distance = 1000;  
                  
                _view = new View3D();  
                _view.x = stage.stageWidth / 2;  
                _view.y = stage.stageHeight / 2;  
                _view.camera = _camera;  
                addChild(_view);  
                  
                //使用Cast类将位图数据转化为BitmapData数据,Cast类是工具类,使用很方便实现各种数据之间的转化  
                //当然你可以使用原生的Bitmap类来获得BitmapData数据.  
                _material = new BitmapMaterial(Cast.bitmap(Earth));  
                  
                _sphere = new Sphere();  
                _sphere.radius = 200;  
                //设置分段数  
                _sphere.segmentsH = 20;  
                _sphere.segmentsW = 20;  
                //设置材质,将地球贴图复制给球体  
                _sphere.material = _material;  
                //添加至舞台  
                _view.scene.addChild(_sphere);  
                  
                addEventListener(Event.ENTER_FRAME, onEnterFrame);  
            }  
              
            private function onEnterFrame(e:Event):void  
            {  
                //下面一句被注释掉了,它确保的是地球自身在旋转(自西向东转)  
                //_sphere.rotationY--;  
                //hover()函数在每一帧上刷新显示,使之产生动画,如果将其注释,则不会产生动画,大家可以试试  
                _camera.hover();  
                //根据鼠标的位置旋转地球  
                _camera.panAngle += (stage.mouseX - stage.stageWidth / 2)/60;  
                _view.render();  
            }  
              
        }  
      
    }  
















欢迎光临 纳金网 (http://c-www.narkii.com/club/) Powered by Discuz! X2.5