Away3D基础教程(一):创建可鼠标交互的基本几何对象

转动的平面,鼠标点击后反方向转动
 
 

重点:

View3D(视口): 这是整个3D世界的入口,犹如透过一个窗口看世界,Away3D中View3D类就是这个窗口,你可以在Flash中同时添加多个View3D实例,就好像在一面墙上砸出多个窗户一样,每个View3D实例可以指向同一个Scene3D,也可以指向不同的Scene3D,但请记住,即使所有的View3D都指向同一个Scene3D实例,也会造成性能的下降,所以通常情况下,我们只使用一个View3D实例。

Scene3D(场景): Scene3D就是窗户外的风景,每一个View3D(视口)都有一个默认的Scene3D(场景),它在Flash的作用类似于Stage,所有的3D对象都需通过它来addChild,才能被显示出来,你也同样可以同时实例化多个Scene3D实例,但每个View3D每次只能被分配一个Scene3D。

Geometry(几何形状): 在Away3D中,Geometry类其实就是一个数据对象,它被用来保存3D物体的基础数据,如顶点(vertices),法线(normals),UV数据,我们从外部加载进来的模型文件会被解析成一个Geometry实例并被保存在内存中。

Mesh(网格): Mesh是一个容器,如果我们为它设置形状数据和贴图后,我们就可以在场景中看到它,它可以是一个方块,一个圆球,也可以是一个如汽车或楼房这样的复杂模型,当然,它也可以仅仅只是一个点,一根线条,或是一个平面,一切取决于它所包含的Geometry数据内容。

Material(材质): 我们也可以将它称之为贴图,基本的贴图分三种,颜色贴图,照片贴图和线框贴图(线框贴图仅针对于线框类型对象使用),我们还能为贴图设置透明度和灯光反射强度,以此来达到一些特殊效果。

Camera3D(镜头): Camera3D就相当于你的眼睛,睛,如果移动Camera3D的坐标就相当于你的眼睛在移动,但....如果移动Scene3D里的物体坐标呢?.....那就说明那个物体在移动......= =!

Mesh(网格): Mesh是一个容器,如果我们为它设置形状数据和贴图后,我们就可以在场景中看到它,它可以是一个方块,一个圆球,也可以是一个如汽车或楼房这样的复杂模型,当然,它也可以仅仅只是一个点,一根线条,或是一个平面,一切取决于它所包含的Geometry数据内容

package  
{
    import away3d.containers.View3D;
    import away3d.entities.Mesh;
    import away3d.events.MouseEvent3D;
    import away3d.materials.TextureMaterial;
    import away3d.primitives.PlaneGeometry;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.geom.Vector3D;
    import flash.display.*;
    import away3d.utils.Cast;
    
    /**
     * ...
     * @author yl
     */
    [SWF(width='800',height='600',frameRate="60", backgroundColor="0x000000")]
    public class MyAway3d_1 extends Sprite 
    {
        //floor的贴图图片
        [Embed(source = "../embeds/myAway3d_1.jpg")]
        private static var FloorMaterial:Class;
        //创建视口
        private var _view:View3D;
        //创建平面几何对象
        private var _planeGeometry:PlaneGeometry;
        //创建平面几何对象的容器
        private var _planeMesh:Mesh;
        //控制旋转方向的变量
        private var _direction:Boolean;
        
        public function MyAway3d_1() 
        {
            //侦听舞台初始化完毕
            if (stage) {
                init();
            }else {
                this.addEventListener(Event.ADDED_TO_STAGE, init);
            }
        }
                
        private function init(e:Event=null):void {
            //trace("舞台初始化完成!");
            //设置舞台缩放模式和对齐方式
            stage.scaleMode = StageScaleMode.NO_SCALE;
            stage.align = StageAlign.TOP_LEFT;
            this.removeEventListener(Event.ADDED_TO_STAGE, init);
            
            //实例化视口
            _view = new View3D();
            addChild(_view);
            //设置抗锯齿参数
            _view.antiAlias = 2;
            
            //实例化一个长宽都是300的平面对象
            _planeGeometry = new PlaneGeometry(300, 300);
            //实例化平面几何对象的容器,第一个参数是平面几何对象,第二个参数是贴图数据
            _planeMesh = new Mesh(_planeGeometry, new TextureMaterial(Cast.bitmapTexture(FloorMaterial)));
            //设置容器可交互
            _planeMesh.mouseEnabled = true;
            //容器侦听鼠标点击事件
            _planeMesh.addEventListener(MouseEvent3D.CLICK, clickHandler);
            
            //将容器添加到视口的场景中
            _view.scene.addChild(_planeMesh);
            
            //设置摄像机的位置
            _view.camera.z = -400;
            _view.camera.y = 260;    //可以把这个值改成1试试看,这样可以有更加直观的感受
            //_view.camera.x = 90;
            //设置摄像机始终指向平面
            _view.camera.lookAt(_planeMesh.position);
            //_view.camera.lookAt(new Vector3D());
            
            this.addEventListener(Event.ENTER_FRAME, onEnterFrame);
            stage.addEventListener(Event.RESIZE, onResize);
            onResize();
        }
        
        private function clickHandler(e:MouseEvent3D):void {
            //鼠标点击变换运动方向
            _direction = !_direction;
        }
        
        private function onResize(e:Event = null):void {
            //调整视口尺寸以适应新的窗口大小
            _view.width = stage.stageWidth;
            _view.height = stage.stageHeight;
        }
        
        private function onEnterFrame(e:Event):void {
            //判断方向旋转
            if (!_direction) {
                _planeMesh.rotationY += 1;
            }else {
                _planeMesh.rotationY -= 1;
            }
            //渲染3D世界
            _view.render();
        }
        
    }

}

Away3D开发包下载地质:http://away3d.com/download/

posted @ 2013-01-31 14:11  leo_as南京  阅读(1727)  评论(0编辑  收藏  举报