1、4 Materials 材质(让一个不懂英语的人来翻译这部好书,真费神啊,此书的作者英语写作功底何等了得,到处都是从句,oh my god!终于结束了) 。这一章中我们学习材质以及材质是怎么贴到 3D 物体上去的。有大量的可用的材质类型。从简单的图像到可以与鼠标交互的影片剪辑(MovieClip)和视频流都可以用做素材。每个类型都有些“偏门” ,所以都饱受褒贬。所以多所有的材质深入了解才能让你选择材质时做出更好的选择。这章主要论述以下主题: 介绍材质 相框材质和颜色材质(简单材质) 装载位图作为材质的方法 使用影片剪辑材质的方法 视屏流材质 混合材质 物体和材质的交互性 使用材质的注意点和技巧
2、 例子:创建一个旋转木马效果介绍材质材质就是物体的纹理。如果物体上不填上材质,在场景中就看不到这个物体。给物体选择合适的材质可以让简单的物体看上去很真实和有趣。纹理和材质的区别在于纹理是被用作材质的图像源。材质可以修改属性从而影响纹理贴到物体上的效果,你也可以这样理解材质,就是扩充了的纹理。在我们介绍每一种材质前,我们将先来检查下材质是如何产生效果的。在 PV3D 中,材质有些争议。 ,了解了他们的如何产生效果可以帮助我们解决对他们的争议。基本属性:所有的材质继承自一个特殊的基础材质类叫做 MaterialObject3D。这个基础类有一些所有子材质类通用的属性,但是某些属性只对某些特殊材质类
3、型起作用。比如可以控制材质平铺的属性就不能用于简单颜色材质,材质平铺是指用一副图在纵向或者横向重复放置的效果。在介绍每一种材质前我们先来介绍对于所有材质都有用的三个属性: 双面和单面贴图 反面贴图 光滑度当我们设置材质对象的 doubleSided 属性为 true 时,我们将对构成物体的三角面两面都可见。什么意思呢?比如对于一个 plane 对象,就是正面和反面也能看到贴图材质;如果对于一个球体或者长方体就是里面和外面都能看到贴图材质,设置方法如下,用哪种无所谓。material.doubleSided = true;或者material.oneSide = false;默认的一个 3D 物
4、体的面会被实现定义为前面和后面(正面和反面) ,而材质也默认贴在物体的前面(正面) 。但是有时候我们只需要贴在后面(反面) ,这怎么办呢?比如对球体贴图,默认的是贴在外面,如果我们只要要在球体的内侧贴图呢?贴两面肯定会多增加 cpu负担,这时候我们就可以将 opposite 属性设置成 true 就 ok 了。material.opposite = true; opposite:相反由于 3D 透视算法对材质的变形和缩放,材质会变得像素化。改变材质的光滑度属性可以解决这个问题。material.smooth = true; smooth:光滑遗憾的是,光滑处理会影响到性能。所以在启用这个属性的
5、时候请斟酌下。再接下来的章节中我们会介绍到位图材质(BitmapMaterial)的光滑度属性。第 13 章,我们来谈谈优化性能的技巧。基础材质有两种类型的基础材质: 线框材质 颜色材质我们把他们归于基础材质是因为他们在实际项目中很少使用。其他的材质提供了更多的功能,并且在做一些模拟现实世界的项目中更加有用。讨论完了这两种材质我们就来介绍他们。线框材质到目前为止出现在例子中的物体我们用的都是线框材质,这是 PV3D 的默认材质。它在 3D物体的所有的三角面之间都画上线条,形成一个看上去由三角形网格连起来的物体。在调试时期用的比较多因为它可以实时展示三角面是如何画出来的。虽然听起来它像一个轻量级
6、的材质,实际上渲染起来还是很吃力的。因为它是用 flash 内置的画线方法来绘制的,而这个过程是比较费时的。线框材质默认的被使用在 PV3D 内置 3D 模型上(如飞机 球等)的创建过程中,然而,我们仍然可以手工创建线框材质。让我们创建一个叫 WireframeMaterialExample 的项目,手工定义材质。我们先导入相框材质类。像大多数材质一样线框材质放在 org.papervision3d.materials 包中。在类的顶部加入以下两行:import org.papervision3d.materials.WireframeMaterial;import org.papervisi
7、on3d.objects.primitives.Cone;在你的项目中,内嵌一个材质类型的局部变量来代替类属性可能会出一些问题,所以将它定义成类属性。当一个材质被定义成内嵌的,你将它指向一个对象,那么以后再也不会用到它了(译者注:因为指向这个材质的变量你无法访问,所以建议你将材质类型的变量申明成类属性,以提高材质的复用性) 。如果定义成了类属性,你以后还想想调用这个材质,你就可以使用对象的 material 属性,并且转变成材质类型。比如:var material:WireframeMaterial = do3D.material as WireframeMaterial;创建一个相框材质对象
8、时,可以使用三个参数:参数 数据类型 默认值 Description1 Color 颜色 Number 0xFF00FF 一个24位的颜色值,画线框时线条的颜色2 Alpha 透明度 Number 1 透明度值(0-1),线条的3 Thickness 粗细 Number 0 0-2550 表示极细线,也是默认值Flash 使用 24 位和 32 位两种颜色值,24 位包括红绿蓝(RGB)三个颜色通道每个通道可以表示256 种颜色。256x256x256=2 24 种颜色。所以叫做 24 位色。而 32 位色其实就是增加了个透明度通道为 A,32 位色就是 RGBA, 透明度也分成了 256 个
9、值。0 表示完全透明,256(0xFF )表示完全不透明。32 位色和 24 位色都可以用 16 进制表示。24 位色:0x00FF00, 00-红色值 FF-绿色值 00-蓝色值32 位色:0x00FF00FF,00- 红色值 FF-绿色值 00-蓝色值 FF-透明度。大多数情况我们使用 24 位色,另外在提供一个透明度参数来。但是在某些场合,你得使用 32 位色来替代 24 位色。线框材质使用 24 位颜色值和另外提供一个透明度值。如果没有使用参数,就都会采用默认值。下面我们创建一个圆柱体使用 50%的透明度的相框填充,线条粗细设为 2.private function init():vo
10、id var material:WireframeMaterial = new WireframeMaterial(0x000000,0.5,2); var cone:Cone = new Cone(material,500,500); scene.addChild(cone);源文件见:WireframeMaterialExample.现在我们知道如何创建一个相框材质,接下来介绍如何使用颜色材质。颜色材质第二个基础材质是颜色材质。一看名字就知道它是将颜色作为材质,使用起来就像线框材质那样简单,在前面的介绍内建模型的章节中,我们已经学洗了如何在一个立方体上使用材质。ColorMaterial
11、实例化时有以下参数可供使用:Parameter Data type Default value Description1 Color颜色 Number 0xFF00FF(品红色) 24位的填充色2 Alpha透明度 Number 1 (不透明) 透明度:0到1。3 Interactive交互性 Boolean False(不支持) 设置材质是否支持交互:如鼠标单击除了 Interactive 参数,其余参数跟线框材质的参数是一样的。 (对原书省略两节,无关紧要)private function init():void var material:ColorMaterial = new Color
12、Material(0x00FF00,0.5); var cone:Cone = new Cone(material,500,500); scene.addChild(cone);别忘了导入 org.papervision3d.materials.ColorMaterial 类。源文件见:ColorMaterialExample。以上可见,这两种材质使用起来比较简单。三种使用位图材质的方法虽然定义相框材质和颜色材质比较简单但是效果不好。大多数程序都想使用位图材质来增添真实感,如果能灵巧的使用位图材质,即使简单的 3D 物体看上去也会逼真不少。(这段内容的原文比较难理解,我把我的理解整理如下: )
13、创建位图纹理这类事情可以交给 photoshop 和 paintshop por 等软件。这是它们的强项。让物体不丢失性能且能增加一些额外的细节的技巧叫做烘焙纹理。在大多数的 3D 软件中都支持实时的给物体亮化或者暗化,再或者映射周围的环境。PV3D 也支持这些。但是这些操作很费系统资源(比如 CPU 计算) 。所以我们可以将某些实时效果用图像处理软件预先做在位图中,再导入到 PV3D 中,这样就省略了实时处理所需要的系统资源。使用位图材质就像定义线框和颜色材质一样的简单。根据你的需要你可以使用规则的Bitmap 对象、外部的位图或者库元件作为材质。BitmapMaterial 位图材质可能你
14、已经猜到,位图材质就是由位图做成的材质类型。位图对象可以通过代码绘制出来,或者调入外部图像文件,或者库中的一个图像元件。对于要使用外部图像和图像元件作为材质,我们可以将它们申明成 BitmapMaterial 类型的子类型。举个例子,我们可以用代码画个圆用作位图材质。我们来了解下如何手动的加载一个外部的文件。实例化一个 BitmapMaterial 对象有以下两个参数:参数 数据类型 默认值 描述1 asset元件BitmapData位图数据null The object that holds BitmapData. 持有BitmapData 的对象2 precise精细度Boolean fa
15、lse 当设置为true时,就会动态的创建额外的三角面用更精细的方式来绘制材质接下来两个例子演示了如何使用位图材质。Using a bitmap shape as material that is generated by code用代码生成的位图形状作为材质BitmapMaterialShapeExample 是我们介绍的第一个例子。我们将用 flash 图像接口直接绘制一个圆,然后转换成 BitmapData 类型。然后用在一个三维的平面上。首先我们要导入到要使用的类:import flash.display.BitmapData;import flash.display.Shape;im
16、port org.papervision3d.materials.BitmapMaterial;import org.papervision3d.objects.primitives.Plane;在 init()方法中我们定义了一个 Shape 类型的对象,在这个 Shape 对象上画个圆。在(100,100) 位置绘制一个半径 200 的圆。private function init():void var circle:Shape = new Shape(); circle.graphics.beginFill(0xFF0000); circle.graphics.drawCircle(10
17、0,100,100);创建一个位图材质(BitmapMaterial)的实例,位图材质的第一个参数是 BitmapData 类型的,所以我们需要将我们创建的 Shape 对象做转换。 (不要和 Bitmap 对象混淆我们要的是一个 BitmapData 对象),让我们了解下如何创建一个 BitmapData 对象,前面的两个参数定义了宽和高,第三个参数为透明度。最后一个参数是原始填充色(BitmapData 可以理解为一个画板,上面的每一个点都记录着当前位置的颜色信息) 。为了能在 Shape 对象上看到一个圆,我们将最后一个参数设为 0x0, 。在创建好了BitmapData 对象后,我们在
18、 BitmapData 对象(画板)上画上圆。 (这里解释一下 为什么我们不直接在画板上画圆,因为 BitmapData 并没有这个 API,也就是不支持 drawCircle()方法,当然方法还是有的,具体可以看 Adobe 官方帮助文档的 BitmapData 类的说明) 。var bmp:BitmapData = new BitmapData(200,200,true,0x0); bmp.draw(circle);然后我们创建一个位图材质对象,用 bitmapData 作为参数。var material:BitmapMaterial = new BitmapMaterial(bmp);然
19、后以这个位图材质对象为参数,在场景中添加一个平面。var plane:Plane = new Plane(material); scene.addChild(plane);编译发布后你回返现这个平面上的圆边上有毛刺现象(不圆整) 。这时候我们就要用到前面提到的材质的三个公共属性中的 Smooth 属性( 光滑度)。只要在创建 material 变量的下面添加一行代码就可以解决这个毛刺现象了,注意这也是会消耗一点 CPU 资源的。material.smooth = true;源文件看:BitmapMaterialShapeExampleManually loading and assigning
20、 an external bitmap as material手动装在外部位图文件作为材质。先看下面的代码package import flash.display.Bitmap; import flash.display.Loader; import flash.events.Event; import .URLRequest; import org.papervision3d.materials.BitmapMaterial; import org.papervision3d.objects.primitives.Plane; import org.papervision3d.view.Ba
21、sicView; public class BitmapMaterialImageExample extends BasicView public function BitmapMaterialImageExample() stage.frameRate = 40; init(); startRendering(); private function init():void /Start loading the image and define an on complete event listener var imgLoader:Loader = new Loader(); imgLoade
22、r.contentLoaderInfo.addEventListener (Event.COMPLETE,loadComplete); imgLoader.load(new URLRequest(“assets/mill.jpg“); private function loadComplete(e:Event):void /Loading complete. Cast target content as a Bitmap /and use its bitmapData for creating a BitmapMaterial var bitmap:Bitmap = e.target.cont
23、ent as Bitmap; var material:BitmapMaterial = new BitmapMaterial(bitmap.bitmapData); var plane:Plane = new Plane(material); scene.addChild(plane); override protected function onRenderTick(e:Event=null):void super.onRenderTick(); 请注意转载的图片文件的目录。这个图片在在下载的代码文件中有,当然你也可以用其他图片文件来代替它。这些代码执行效果是在屏幕显示一幅图片,我们如何让
24、这幅图片旋转呢?注意 创建一个旋转地平面在当前的例子中会有一些问题。上面的类中 plane 对象我们没有申明位类属性,所以我们不能在 render 方法中控制它,因此也不能改变他的旋转度。另外注意我们在 plane 创建之前就开始渲染了。在下一节中我们会掩饰如何在平面被初始化后才开始材质的渲染。改变上面的例子,沿着轴旋转这个平面。确保你创建的平面有足够多的片段。并且设置成双面。你会看到类似下面的结果BitmapFileMaterial 位图文件材质我们已经知道如何创建一个位图材质,并且应用到一个平面上,我们也可以加载一个外部文件并且用文件中包含位图数据来创建一个位图材质。但是有一种更为方便的方
25、法从外部加载图片作为材质。这就是 BitmapFileMatreial 类。它继承自 BitmapMaterial 类。并且帮你把装在过程中的麻烦都代劳了。创建一个 BitmapFileMaterial 对象很简单,它有两个参数。参数 数据类型 默认值 描述1 url路径 String “ 指向外部文件的路径2 Precise精度 Boolean false 定义是否使用材质的精度第一个参数是必要的。第二个参数可以省略,默认值为 false。当材质还未加载好之前纹理将显示为黑色。让我们来看看在上一个例子上我们如何来加载一幅图。源代码如下:package import org.papervisi
26、on3d.materials.BitmapFileMaterial;import org.papervision3d.objects.primitives.Plane;import org.papervision3d.view.BasicView;public class BitmapMaterialImageExample extends BasicViewpublic function BitmapMaterialImageExample()stage.frameRate = 40;init();startRendering();private function init():voidva
27、r material:BitmapFileMaterial = new BitmapFileMaterial(“assets/mill.jpg“);var plane:Plane = new Plane(material ,500,375,2,2);scene.addChild(plane);代码精简了不少了吧。当你编译发布时,一开始平面呈现一会的黑色,然后才显示图片纹理,若要防止这种事情,就必须在纹理加载好后在开始渲染工作。但是我们怎么知道纹理文件加载好了呢?我们并不知道 BitmapFileMaterial 类中有关加载图片文件的 Loader 对象。幸好 PV3D 为我们想到了。在文件加
28、载好时,BitmapFileMaterial 对象会发出一个FileLoadEvent.LOAD_COMPLETE 事件。FileLoadEvent 事件对象时 PV3D 定义的事件类型。还有另外一些类也使用这个事件。与 BitmapFileMaterial 对象有关的有四种类型的事件: FileLoadEvent.LOAD_COMPLETE: 外部位图加载完成时,发出该事件。 FileLoadEvent.LOAD_PROGRESS: 外部位图加载过程中,发出该事件。 FileLoadEvent.LOAD_ERROR: 外部位图找不到时,发出该事件。 FileLoadEvent.SECURIT
29、Y_LOAD_ERROR: 安全错误发生时,发出该事件。要使用这个事件,必须先导入该类:import org.papervision3d.events.FileLoadEvent;我们可以直接在创建的 BitmapFileMaterial 对象添加一个时间侦听器,监听它发出的LOAD_COMPLETE 事件:material.addEventListener(FileLoadEvent.LOAD_COMPLETE,loadComplete);接着我们还要定义一个方法。下免得代码比较有用,他可以让多个 BitmapFileMaterial 对象在加载完文件后调用。private function
30、 loadComplete(e:FileLoadEvent):void trace(“Completed loading file: “ + e.file); startRendering();在这个方法中我们才开始渲染。When you publish this code, you should see the following output:Completed loading file: assets/mill.jpgBitmapAssetMaterial 位图元件材质位图元件材质也是继承自 bitmapMaterial,是另一个很方便的定义位图位材质的类。BitmapAssetMate
31、rial 把图形元件中的位图数据(BitmapData)取出用作材质,因为FlexBulidler 和 flashBuilder 都没有像 flash 那样的库,所以这个是给 Flash IDE 专用的。这个类有两个参数:当使用BitmapFileMaterial时,请设置Plane对象的宽和高。当将一个平面对象和文件材质结合时。你应该总是设置好宽和高。否则程序会自动的将位图的大小设置为平面的大小。在图片加载好之前,程序是不知道图片的大小的,这样在你在看到平面之前它的大小会被先设为0x0。参数 数据类型 默认值 描述1 linkageID String “ Flash库文件的中元件的连接标示符
32、2 Precise精度 Boolean false 定义是否使用材质的精度让我们看看如何在 Flash 中定义一个库元件,以便我们能将它和 BitmapAssetMaterial 结合起来使用。1. 先导入一个图想到你的库中。 (不是舞台)2. 在库中右击图像选择“属性 property”3. 一个名叫“Bitmap Property”的窗口弹了出来4. 如果高级面板未打开则打开它5. 勾选为 ActionScript 导出复选框6. 勾选在第一帧导出复选框7. 类和基类在上面的勾选后自动填充,你也可以自定义命名。但是请别改基类名。并且记住类名,一会我们要将这个名作为参数来创建 BitmapA
33、ssetMaterial 对象8. 单击 OK 这样我们就设置好了一个库元件了。下面我们来使用它。先导入这两个类文件:import org.papervision3d.materials.BitmapAssetMaterial;import org.papervision3d.objects.primitives.Plane;接着我们创建一个 BitmapAssetMaterial对象。将元件的类名作为第一个参数。 private function init():void var material:BitmapAssetMaterial = new BitmapAssetMaterial(“m
34、ill“);var plane:Plane = new Plane(material,500,375,2,2); scene.addChild(plane);可以查看 BitmapAssetMaterialExample 源代码。现在我们已经知道如何使用位图材质了,接下来我们介绍另一类材质-MovieClips 。Two ways of using a movie clip as material两种使用影片剪辑作为材质的方法在很多场合中使用位图材质已经相当不错了。这类材质很想其他 3D 建模软件。但是我们用的不是 3D 建模软件,而是 Flash。Flashplayer 如此盛行的理由是因为
35、它能创作出色的,轻量级的动画。并且到了如今,Flash 已经发展成了开发 RIA(客户端应用)最有力的工具了。我们在创建 PV3D 场景时能使用 Flash 的优势将是多么好呢。换句话说就是能将动画作为材质,或者将 RIA 作为材质。你可以使用 MovieClip 来创建 MovieMaterial 对象作为材质类型了。本质上这个是跟bitmapMaterial 是类似的,然而影片材质仅有两种类型。 MovieMaterial MovieAssetMaterial也许你期待这与 BitmapFileMaterial 材质有些相似点,但是要令你失望了。接下来学习两种影片材质的使用方法。Movie
36、Material 影片材质A movie clip-based material works with every type of object that inherits from a DisplayObject. This is usually a sprite or a movie clip. The MovieMaterial class works with any display object that is accessible by code. Instantiation of a MovieMaterial takes a few new parameters. Lets h
37、ave a look at each in the following table:一个基于影片剪辑的材质对继承自 DisplayObject(Flash 的任何可视对象的基类 )的对象都有效。可能是一个 Sprite 对象,亦或者是 MovieClip 对象,只要是 DisplayObject 类型的对象都是可以的。创建 MovieMaterial 对象时有如下几个参数:在Flex Builder and Flash Builder中使用元件是将元件转换成BitmapAsset对象 ,然后用BitmapAsset的bitmapData属性然创建一个常规的BitmapMaterial.对象。嵌
38、入也可以实现。使用元数据标签Embed:如下面的代码所示:Embed (source=“assets/mill.jpg“) public var mill:Class;我们将mill.jpg文件导入为元件。命名为mill类,下面这行代码将创建mill对象并将它转换成BitmapAsset格式。var millAsset:BitmapAsset = new mill() as BitmapAsset; 然后创建位图材质,就像我们前面的做法一样。var material:BitmapMaterial = new BitmapMaterial(millAsset.bitmapData);注意 这种方
39、法只能在 flex Builder 和 Flash Builder 中使用。并且没有用到 BitmapAssetMaterial 类。参数 数据类型 默认值 描述1 movieAsset DisplayObject null DisplayObject对象的引用2 transparent Boolean false 材质是否支持透明度3 animated Boolean false 如果设置为True ,将对影片元件的每一帧都建立快照然后绘制在材质上。这时相当耗费CPU资源的。默认没有开启4 precise Boolean false 精度5 rect Rectangle null 一个可选参
40、数定义了材质的边界如果你的影片剪辑在play 过程,大小会变,那么这个参数是不错的如果没有定义就将影片元件的当前帧的大小设为材质的边界值为了解释这种材质是如何使用的,我们创建一个 Sprite 对象,在上面画一个矩形,添加上文本字段。然后用这个 Sprite 来创建一个影片材质。然后应用到一个旋转平面上。源代码如下:package import flash.display.Sprite;import flash.events.Event;import flash.geom.Rectangle;import flash.text.TextField;import flash.text.TextF
41、ieldAutoSize;import flash.text.TextFormat;import org.papervision3d.materials.MovieMaterial;import org.papervision3d.objects.primitives.Plane;import org.papervision3d.view.BasicView;public class MovieMaterialExample extends BasicViewprivate var plane:Plane;public function MovieMaterialExample()stage.
42、frameRate = 40;init();startRendering();private function init():voidvar materialSprite:Sprite = new Sprite();materialSprite.graphics.beginFill(0x333333);materialSprite.graphics.drawRect(0,0,200,200);var textfield:TextField = new TextField();textfield.text = “Hello 3D world!“;textfield.autoSize = Text
43、FieldAutoSize.LEFT; textfield.setTextFormat(new TextFormat(“Arial“,25);textfield.x = (materialSprite.width - textfield.width) / 2;textfield.y = (materialSprite.height - textfield.height) / 2;materialSprite.addChild(textfield);addChild(materialSprite);/关键看这里var material:MovieMaterial = new MovieMater
44、ial(materialSprite);material.smooth = true;material.doubleSided = true;plane = new Plane(material);scene.addChild(plane);override protected function onRenderTick(e:Event=null):voidplane.localRotationY+;super.onRenderTick();MovieAssetMaterial 影片元件材质这个类的作用类似于 BitmapAssetMaterial 类。也仅仅能在 flash IDE 中使用。
45、创建 MovieAssetMaterial 对象时有如下参数:参数 数据类型 默认值 描述1 linkageID String “ 库中影片剪辑的连接标示符2 transparent Boolean false 透明3 animated Boolean false 见上个表格4 createUnique Boolean false 是否创建一个副本5 precise Boolean false 精度将影片作为材质就赋予了材质表现动画的能力。可以用代码结合 MovieMaterial 类来实现。或者基于时间轴结合 MovieAssetMaterial 类来实现。让我们先在 Flash 里实现。创
46、建一个MovieClip 影片剪辑,做一些动画效果在里面,为了理解影片元件如何材质化,我们在影片元件中加入一些补间。在下载的例子中,我们在影片剪辑中添加了一个背景图形,两个移动的的文本字段,一条粗线从左至右。在编译发布后,这条线将会提示我们在普通情况下会出现的一系列问题。在你创建好你的动画后,你需要给你的原件定义好连接标示符属性。这个上面我们设置位图元件的连接标示符很相似。1. 在元件上右击,选择“属性”2. 一个名为“Symbol Property”的窗口弹出来了3. 如果高级面板未打开则打开它4. 选择为 ActionScript 导出。5. 勾选在第一帧导出6. 定义一个类名。类名用于创
47、建 MoiveAssetMaterial 对象时作为参数(连接标示符)来传递7. 基类不用修改仍然为 flash.display.MovieClip8. 点击 OK 完成当元件定义好后,你就为创建 MovieAssetMaterial 对象做好了准备。这里我们让平面转动起来以暴露出某些问题,然后我们讨论如何解决这些问题。导入需要用到的类:import flash.events.Event;import org.papervision3d.materials.MovieAssetMaterial;import org.papervision3d.objects.primitives.Plane;
48、import org.papervision3d.view.BasicView;将 plane 对象定义为类属性:private var plane:Plane;在 init()方法中。我们创建一个 MovieAssetMaterial 对象,第一个参数是字符串“material” ,它是我们前面在 Flash 库中为影片剪辑定义的连接标示符。第二个透明度参数设为 false,第三个动画参数设为 true,剩下的参数我们忽略。private function init():void var material:MovieAssetMaterial = new MovieAssetMaterial
49、(“material“,false,true); material.doubleSided = true; plane = new Plane(material,500,500); scene.addChild(plane);编译发布后你会立刻注意到有些异样,如下图所示:下表罗列了出现的问题和问题的成因:问题 原因纹理漂移 Caused by the movie that changes size during animation文本闪烁和像素化 Caused by skewed bitmaps纹理弯曲了 Caused by using a low number of segments纹理从左至右漂移时因为他影片剪辑在 play 的时候尺寸在改变。能看到黑色背景是因为设置了透明属性为 true,所以要设为 false。漂移也有一种简单的办法。你必须为纹理定义一个矩形对象,在讲解 MovieMaterial 类时,构造函数的第五个参数就是一个矩形对象。MovieAssetMaterial 类略微有些不同。它将这个参数内化为一个属性,MovieMaterial 类也有这个属性。所以只要加入以下