第四章
关于primitives里的一些基本类型的创建
参数都是Object类型
其实object里面的每一项都是该类型的属性
即 {z:200,radius:300} 等 z radius都是该类的属性 所以可以这样写 其他的一样
yUp 属性
yUp为true表示该对象的法线为 Y轴,为false表示该对象的法线为Z轴
bothsides属性
他是Mesh的属性 而primitives都是它的子类
plane.bothsides = true;表示双面显示
线框类型的3d对象
Away3d中只显示线框的基本模型类 就是在一般基本模型类前加上 Wire前缀
比如Plane的线框类就是:
WirePlane 用法和Plane一样
var plane : WirePlane = new WirePlane();
plane.yUp = false;
plane.x = -200;
plane.width = 200;
plane.height = 200;
plane.material = mat;
plane. pushback=true //是否使用距离camera最远的点(Z-sorting),目的是使材质始终在plane中不变化(即不进行culling) 为false的话材质显示的范围经常变化,因为进行了culling pushback为true时可以解决破面情况<应用例子—第四章tutorial : TV BOX 和屏幕Plane的应用就用到了该属性 假如不设为true 贴图就有可能跑到TVBox 的网格上面去该属性设为true就使贴图限制在plane中 >
_view.scene.addChild(plane);
var cube : WireCube = new WireCube();
cube.x = 200;
cube.width = 200;
cube.height = 200;
cube.depth = 200;
cube.material = mat;
_view.scene.addChild(cube);
Cube的创建的材质看帮助文档
var sphere : WireSphere = new WireSphere();
sphere.radius = 50;
sphere.segmentsW = 24;
sphere.segmentsH = 12;
sphere.material = mat;
_view.scene.addChild(sphere);
自定义多边面 类RegularPolygon
RegularPolygon用于创建指定边数的面
用法:
var polygon : RegularPolygon;
polygon = new RegularPolygon();
polygon.sides = 8;//边数
polygon.material = new ColorMaterial(0x336699);
polygon.x = 250
polygon.yUp = false;
polygon.bothsides = true;
_view.scene.addChild(polygon);
用该类创建的4条边即是Plane 但是该类创建的plane是绕法线旋转了45度的plane
外部模型的使用
加载的步骤:
1. Create a loader object.
2. Create a parser object.
3. Link the parser object to the loader object.
4. Set up event listeners on the loader object.
5. Define the file path of the object to be loaded and commence loading.
Flash的加载
var loader : Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, _onComplete);
loader.load(new URLRequest('image.jpg'))
addChild(loader);
在flash中不管image是否已经将加载完成 loader都被添加进显示列表中 away3d也是一样:
Away3d外部模型加载
//var loader : Loader3D = new Loader3D();
var loader : LoaderCube;= new LoaderCube; ();//LoaderCube是专门用来加载3d的
loader.addEventListener(Loader3DEvent.LOAD_SUCCESS, _onSuccess);
loader.loadGeometry("model.3ds", new Max3DS());//Max3DS是分析器,new Max3DS表示加载的3d模型是.3ds类型 它告诉引擎用MaxDS去解析模型
scene.addChild(loader);
LoaderCube还有一个好处就是当加载的文件不存在时会给出一个错误信息!!因此我们不需要侦听流错误
外部资源的优化
主要是由于外部资源太大需要将其转化为AS类 进行加载
用了一个转换类AS3Exporter该类在away3d.exporters包
var exporter:AS3Exporter = new AS3Exporter();
exporter.addEventListener(ExporterEvent.COMPLETE, _onComplete);
exporter.export(_loader.handle, 'MonkeyMesh', 'flash3dbook.common');//
//LoaderCube.handle表示LoaderCube中的3d模型 'MonkeyMesh'是类名flash3dbook.commo是包名
protected function _onComplete(ev : ExporterEvent) : void
{
trace('Export completed!');
System.setClipboard(ev.data)//as类复制到剪切板 在直接复制到记事本中即可
}
在实际项目中你可以动态加载该类,将该类转化为swf文件
注意所有的模型已经基本类型都是Mesh的子类 下面是加载含有模型的SWF
var loader : Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, _onComplete);
loader.load(new URLRequest('assets.swf'));
private function _onComplete(ev : Event):void
{
var MClass : Class;
MClass = getDefinitionByName('flash3dbook.common.MonkeyMesh') as Class;、、// getDefinitionByName为全局函数
var monkeyMesh : Mesh = new MClass();
_view.scene.addChild(monkeyMesh);
对3d对象使用位图滤镜
Away3d中使用滤镜和在flash使用一样:
var cube : Cube = new Cube();
cube.material = new ColorMaterial(0xcccccc);
cube.filters = [ new GlowFilter(0) ];
cube.ownCanvas = true;
_view.scene.addChild(cube);
ownCanvas属性说明:
cube.ownCanvas = true;//对cube进行独立的渲染 cube外部就像已经封装!一般在排序时用到,排序时是对每一个对象进行单独的渲染的 ownCanvas可以理解为pv3d里的层ViewportLayer
Sprite3d 的使用 Sprite3d在away3d.sprites包中
Sprite3d的创建
var sprite : Sprite3D = new Sprite3D(material);//创建Sprite3d material是Material类型
一般我们为了创建比较好看的效果比如烟雾!都需要对材质进行滤镜处理 :
//使用滤镜效果
var puff : Shape = new Shape();
var dia : Number = Math.random() * 40 + 30;
puff.graphics.beginFill(0xcccccc, Math.random());
puff.graphics.drawEllipse(-dia/2, -dia/2, dia, dia);
var bmp : BitmapData = new BitmapData(100, 100, true, 0);
bmp.draw(puff, new Matrix(1, 0, 0, 1, 50, 50));
var blur : BlurFilter = new BlurFilter(32, 32, 2);
bmp.applyFilter(bmp, bmp.rect, new Point, blur);
material = new BitmapMaterial (bmp);
MovieClipSprite的使用 也是在away3d.sprites包中
var mc:MovieClip= new Movie() as MovieClip
var movieSprite:MovieClipSprite= new MovieClipSprite(mc);
_view.scene.addSprite(movieSprite);
MovieClipSprite对象始终望着camera(away3d.sprites包里的对象都是始终望着camera的) MovieClipSprite相当于pv3d中的plane贴上MovieMaterial材质