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/