Dragon-Studio 之 Flash Alternativa 3D引擎 进阶教程-1.内置模型


Dragon-Studio 之 Flash Alternativa 3D引擎 进阶教程-1.内置模型
2010年12月30日
  原文:http://www.bcia-bag.com/article/ZMTE5MzY=.html
  *申明:教程中用到的3D引擎Alternativa均以非盈利教学为目的,不得用于任何商业用途。如要购买正版请访问官网网站: http://alternativaplatform.com/en/ 以往教程:http://www.zcool.com.cn/u/337114/zcooler_article.x html
  一周时间过得真快啊,现在是履行诺言的时间了~让我们进入进阶教程的学习吧。在学习之前,我还是提醒大家,上一周的教程是基础,在学这章前一定要看一下以前的教程啊。
  一.示例程序
  这个程序我们要完成对A3D中所有内置三维模型的测试。程序的思路是这样的:在舞台上有6个按钮,点击相应的按钮舞台上出现对应的三维模型。另外应用鼠标和键盘控制摄像机方位,以便观察。
  1. 利用Flash绘图API建立鼠标
  以后,我们一般会采用Flash 绘图API和文档类结合方法来完成示例。当然,我们也可以用纯AS3代码完成,但是这样就会有一些多余的代码,解释起来还要另外花时间,所以我们以后就利 用Flash的绘图API绘制一些按钮之类的控制元件,这样更方便,也更适于A3D的教程。
  在Flash中打开刚才建立的.fla主文件,然后利用Flash绘图工具建立如下所示的6个按钮和相应的文字:
  
  
  (最左图为文档类的绑定,中间为建立的文字和按钮,按钮式黄色的方形,右图为每个按钮的属性图)        我们每一个在Flash中设置好他的实例名称,从上到下依次命名为"bt_1"~"bt_6",一共六个按钮,对应六个内置模型。这样在文档类的AS文件 中就可以直接引用这些实例了。
  2. 编写文档类
  我们现在首先建立一个.fla文件,命名为AllPrimitives.fla 同时建立同名的文档类(关于文档类的介绍请看基础教程的第四章Bonjour Alt )。文档类如下:
  package 
  {
  //导入所需类包
  import lib.*;
  import alternativa.engine3d.primitives.*;
  import alternativa.utils.FPS;
  import alternativa.engine3d.materials.FillMaterial;
  import alternativa.types.Point3D; //为了设置摄像机的观察点的初始值,所以需要Point3D这个类
  import flash.display.StageAlign;
  import flash.display.StageScaleMode;
  import flash.display.StageQuality;
  import flash.events.Event;
  import flash.events.MouseEvent;
  import flash.display.BlendMode;
  [SWF(backgroundColor = "#000000",frameRate = "100",width = 800,height = 600)]
  public class AllPrimitives extends AltBasse
  {
  private var primitives:Object; //用于存放各种内置模型的Object对象
  private var currentP:String; //用来说明当前显示的是那个模型,所以建立一个字符串对象
  public function AllPrimitives() //构造函数
  {
  super();
  stage.scaleMode = StageScaleMode.NO_SCALE;
  stage.align = StageAlign.TOP_LEFT;
  stage.quality = StageQuality.HIGH;
  this.addEventListener(Event.ADDED_TO_STAGE, init);
  }
  //初始化函数
  private function init(e:Event):void
  {
  removeEventListener(Event.ADDED_TO_STAGE, init);
  cameraController.controlsEnabled = true; //打开摄像机控制器以便控制摄像机
  FPS.init(stage);  //添加Alternativa的显示面板
  //设置摄像机属性,摄像机一章后面将会深入讲解
  camera.x = 150;
  camera.y = -250;
  camera.z = 150;
  //设置摄像机的观察点为scene.root坐标,即当前全局坐标(global)的原点
  cameraController.lookAt(new Point3D(0,0,0));
  primitives = new Object(); //建立Object实例
  //为每一个键值(Key),对应的对象分别建立Alternativa中的6个内置模型
  primitives['bt_1'] = new Plane(200,200,3,3); //平面模型
  primitives['bt_2'] = new Box(150,150,150,3,3,3); //立方体模型
  primitives['bt_3'] = new Cone(150,150,20); //椎体模型
  primitives['bt_4'] = new Sphere(100); //球体模型
  primitives['bt_5'] = new GeoPlane(200,200,3,3); //三角平面
  primitives['bt_6'] = new GeoSphere(100); //三角球
  //建立一个FillMaterial的材质对象,材质一章也将在后面讲解
  var material:FillMaterial = new FillMaterial(0x000088,1,BlendMode.NORMAL,2,0xFFFFF F);
  //建立一个循环,为每个模型对象应用上面建立的材质,并且为Flash场景中建立好的电影剪辑注册鼠标点击事件监听器
  for (var i:int =0; i复制给currentP对象,这样接着就可以添加当前的模型到场景中了
  currentP = e.currentTarget.name;
  scene.root.addChild(primitives[currentP]);
  }
  //实时渲染场景
  private function OnEnterFrame(e:Event):void
  {
  cameraController.processInput(); //开启鼠标控制器的输入模式
  scene.calculate(); //实时进行场景的渲染计算
  }
  }
  }
  查看效果,请见关联作品:http://www.zcool.com.cn/work/ZMzA0Mzg0.html
  二. 内置模型类详细解析
  
  1. 构造函数及继承关系
  A3D为我们设置的内置模型有六个,每个模型都对应A3D中的一个类。下面就以Box类为例讲解每个类继承关系和其构造函数。
  Box 立方体
  
  其打包位置是alternativa.engine3d.primitives,所以要用这个模型,就要首先在文档类中导入类包或直接这个类 (import alternativa.engine3d.primitives.*  或    import alternativa.engine3d.primitives.Bo)x。我们还可以看到,Box类是继承自Mesh这个类,而Mesh这个类有继承 自Object3D这个类。所以Box类在A3D中的的基类就是Object3D这个各类,也就是说Box类继承了Object3D的所有非私有属性和方 法。其实,所有A3D中的内置模型都是继承自Object3D这个类的,他们的继承关系完全相同。
  
  上图是Box类的完整构造函数,前面三个值我们之前已经见过了,就算是立方体的长宽高以及三个方向的网格数。其余参数:
  reverse:表示是否透视内部,如果刚才的程序中,我们把建立的box的reverse属性设置成true,那么box就变成这个样子了:
  
  我们看见的盒子的内部。
  triangulate :表示是否采用显示建模三角形。如果这个参数设置成true,则显示如下:
  
  总结来说,A3D中的内置模型类的构造函数参数分为三个类型:
  确定形状
  划分网格
  特殊效果
  其余的模型类都是一样的,这里就不一一讲解了。下面直接给出各个模型类的 继承关系和构造函数:
  Cone 圆椎体
  
  
  GeoPlane 三角平面
  
  
  GeoSphere 三角球
  
  
  Plane 平面
  
  
  参数说明:
  twoSided:表示是否显示双面,如果是false,那么我们旋转这个平面时,转到他的背面就看不见他了。
  Sphere 球体
  
  
  以上就是所有内置模型的构造函数了。
  2. 公有属性及方法
  光知道这些内置模型类的构造函数,还远远不够。我们还是要了解一下他们的公有属性的方法。既然前面说到了,这些内置模型类都继承自Object3D这个基 类,那么他们自然继承了Object3D类的所有非私有属性和方法。下面就看一下Object3D类的构造吧。
  类的继承关系
  
  公有属性
  
  
  我们可以看到Object3D这个类继承自flash.events.IEventDispatcher这个Flash的类,而在Flash中,所有显示 对象(包括DisplayObject类)也是继承于这个类的,所以我们可以发现,Object3D这个类的许多属性,都和Flash中的 DisplayObject类似,所以这里我就不详细讲解了。不过有几个地方还是需要注意的,在Object3D类中的关于位置与旋转角度的属性所对应的 坐标系是与Flash中不同的,详细的内容请参见基础教程第二章Alternativa 3D机理:
  http://www.zcool.com.cn/article/ZMTEwMzY=.html
  只读属性scene:表示该三维对象Object3D所在的场景对象Scene3D。
  属性coords:表示其坐标点,对应一个三维点Point3D(x,y,z)对象
  mouseEnabled:表示是否接受鼠标消息
  transformation:是一个alternativa.types.Matrix3D对象,是一个4*4的矩阵,用于坐标转换,旋转变换 的。在Flash CS4 以后的AS3中,也带有了同样一个Matrix3D对象:flash.geom.Matrix3D。也是用于完成Flash CS4的3D转换造作的(在 Flash CS4 中也带有了简单3D)可见这个矩阵的重要性,不过对于初学者而言,其实也没什么太大用途。 *属性mobility:选择性了解 (这个设计A3D的基础建模原理,也许会在后面的高级教程中介绍,这里先大概说明一下);表示在BSP树中的其活动级别,A3D中所有的显 示对象都是基于BSP树建立的,mobility的值越高,他在BSP树种的深度就越深,在每次刷新而重建显示对象时,就越晚重建。所以高的 mobility属性一般用于大的三维模型中,这样可以提高效率。 共有方法
  
  
  同样的,Object3D的共有方法也和Flash中的DisplayObject类大都相似。
  特殊的clone()用于完成复制Object3D对象。
  另外其中localToGlobal与globalToLocal方法与FlashCS4中的local3DToGlobal与 globalToLocal3D类似,只是在Flash中所指的Global是舞台的二位坐标系,二A3D中的Global是Scene3D的三维坐标 系。
  关于Object3D,还有一些保护类型的方法,这里就不介绍类,到高级教程的应用在详解。以上就是Object3D类的详细结构了,这也是本章的重点,A3D中所有的内置模型都具有这些属性和方法。
  还要说明的是,前面提到所有的内置模型首先继承自Mesh类,Mesh类又继承自Object3D类。所以Mesh类中的共有属性和方法也被 Object3D继承了。Mesh类中的内容就不再详细介绍了,在高级篇再细解。中不过其中有两个共有方法还是很有用的,下面拎出来讲解一下:
  
  用来将指定的Material材质应用于所有表面,这也是在一开始的例子中我们用到的方法,他不是来自于Object3D本身,而是来自Mesh类的,这就看出继承的好处了吧~
  
  这个方法是将指定的材质应用于指定的表面而不是所有表面,在一些特殊应用中,我们就会用到。
  三. 小结
  不知不觉就写了这么多了~也该休息一下了。这一章重点讲了A3D中的所有内置模型,虽然内容比较多,但是这些都是为了应用这些内置模型而打好基础,而应用 这些内置模型又是利用A3D绘制三维模型的基础。所以大家要认真理解,多多实践,才能融汇贯通。同时,这一章还重点讲述了Object3D类,这也为创建 A3D自建模型打下了基础。
  看到这里也许大家头都大了~那就休息一下,喝杯茶,给我发发评论,赞一下,收藏分享一下,呵呵。更重要的是,休息好了,赶快自己练习练习~

猜你喜欢

转载自qwp57qwp.iteye.com/blog/1361887
今日推荐