鉴于本网已有部分Away3D教程,仔细看看真不错,笔者心愿从更加系统的的方面对AWAY进行摸索,是另一个版本尝试,读者可以选择其中有用的,进行去粗取精的吸收并同化为自己知识,不管是哪个版本的教程,我们的共同点是明确的,都是让更多人享受技术的完美,达到沟通与交流的目的, 1.最最基础的代码 当接触到Away3D一段时间之后,你会注意到,其实flash3D技术的开发流程对于大多数程序来讲都是相同的,例如基本对象的建立,3D视图,类的调用等。这和flash软件中的时间线在本质上是一样的。Flash中使用的全是图形,Away3D则需要对图像进行渲染,其图像来自于具有层次的三维物体,与Flash中层次的含义不一样,Away中的渲染过程必须通过触发器来激活,也就是通过调用3D视图类来呈现,下面就Away3D的基本的但是几乎所有项目都必须用到的代码和相关技术进行说明,希望达到共享的目的。上代码: package { import away3d.containers.View3D; import flash.display.Sprite; import flash.events.Event; public class MyFirstApp extends Sprite { private var view : View3D; public function MyFirstApp() { view = new View3D(); view.x = 275; view.y = 200; addChild(_view); addEventListener(Event.ENTER_FRAME, onEnterFrame); } private function onEnterFrame(ev : Event) : void { view.render(); } } } 上述代码的中间部分定义了一个3D视图类,定位,并加到舞台中,其中View3D类继承了Sprite类,可以被添加到任何flash mc的可显示容器中,从而其内容被渲染出来,视图中(x,y)坐标代表消失点,也就是我们通常所说的透视图用平面的方式沿着一组平行直线在远处某点汇集的地方。未来是3D图像看其正常,一般会将坐标定位与mc的中央。而后我们定义了一个侦听器,用于在每帧渲染视图,而真正的渲染函数是上述代码中的view.render(). 2.将3D物体加到场景 场景是3D物体的根容器,通过Scene3D类来实现,当创建了1中的基础程序,那么一个空的场景就被默认创建了,可以通过实例来访问,例如要创建一个cube,并让起先是到舞台中,我们可以在上述代码中加如下代码: var cube : Cube = new Cube(); _view.scene.addChild(cube); 这里的cube是3D基本几何体,需要import away3d.primitives.cube包。成功编译后便会在场景中看到cube了,这个时候只能看到cube的正面,以及随机的颜色,而且轮廓是黑色的。与许多3D 引擎一样,Away3D中的对象的面是用一块块三角形组成的,随机产生的颜色是默认的材质,因此要改变物体的材质还得做进一步的编程,下面先给出代码: var bmp : BitmapData = new BitmapData(200,200); bmp.perlinNoise(200, 200, 2, Math.random(), true, true); var mat : BitmapMaterial = new BitmapMaterial(bmp); var cube : Cube= new Cube({ material: mat }); _view.scene.addChild(cube); 同样的需要导入相关类,如下 import away3d.materials.BitmapMaterial; import flash.display.BitmapData; 成功编译后,可以看到此时的cube已经被赋予了一张彩色材质,它其实就是一个包含了多种颜色的噪点。
以上内容我省略到对构造器、变量、初始化对象等方面的说明,相信有一定程序基础的人都会理解这个过程,下面说说如何给场景打灯光,为了便于说明我通过同样的方式创建了一些3D 球体,代码: var sphere : Sphere = new Sphere(); sphere.segmentsW = 32; sphere.segmentsH = 32; sphere.material = new BitmapMaterial(bmp); sphere.x = 200; _view.scene.addChild(sphere); 在这里切勿忘记要导入相应的类away3d.primitives.Sphere;代码中球体的位置在cube右边200个单元格处,同时被赋予了与cube一样的材质,一般来说材质决定了在光照条件下物体的阴影,使用BitmapMaterial的简单类仅仅是定义了一个材质容器,但光照效果不能显示,因此要产生好的光线效果我使用了WhiteShadingBitmapMaterial类,在上述代码中修改成下面一句,同时导入WhiteShadingBitmapMaterial: 将sphere.material = new BitmapMaterial(bmp);改为 sphere.material = new WhiteShadingBitmapMaterial(bmp); 再编译会发现这并不是我们要的效果,此时场景的物体丢失了颜色变成了一个黑洞,原因很简单,因为周围没有光源,所以场景中任何物体都没有反光,我们还需做如下修改,加上一句: var light : PointLight3D = new PointLight3D(); light.y = 500; _view.scene.addLight(light); 编译,ok,效果如图所示
|