Pv3D4材质.docx

上传人:b****6 文档编号:6554153 上传时间:2023-01-07 格式:DOCX 页数:39 大小:243KB
下载 相关 举报
Pv3D4材质.docx_第1页
第1页 / 共39页
Pv3D4材质.docx_第2页
第2页 / 共39页
Pv3D4材质.docx_第3页
第3页 / 共39页
Pv3D4材质.docx_第4页
第4页 / 共39页
Pv3D4材质.docx_第5页
第5页 / 共39页
点击查看更多>>
下载资源
资源描述

Pv3D4材质.docx

《Pv3D4材质.docx》由会员分享,可在线阅读,更多相关《Pv3D4材质.docx(39页珍藏版)》请在冰豆网上搜索。

Pv3D4材质.docx

Pv3D4材质

4Materials材质

(让一个不懂英语的人来翻译这部好书,真费神啊,此书的作者英语写作功底何等了得,到处都是从句,ohmygod!

终于结束了)。

这一章中我们学习材质以及材质是怎么贴到3D物体上去的。

有大量的可用的材质类型。

从简单的图像到可以与鼠标交互的影片剪辑(MovieClip)和视频流都可以用做素材。

每个类型都有些“偏门”,所以都饱受褒贬。

所以多所有的材质深入了解才能让你选择材质时做出更好的选择。

这章主要论述以下主题:

●介绍材质

●相框材质和颜色材质(简单材质)

●装载位图作为材质的方法

●使用影片剪辑材质的方法

●视屏流材质

●混合材质

●物体和材质的交互性

●使用材质的注意点和技巧

●例子:

创建一个旋转木马效果

介绍材质

材质就是物体的纹理。

如果物体上不填上材质,在场景中就看不到这个物体。

给物体选择合适的材质可以让简单的物体看上去很真实和有趣。

纹理和材质的区别在于纹理是被用作材质的图像源。

材质可以修改属性从而影响纹理贴到物体上的效果,你也可以这样理解材质,就是扩充了的纹理。

在我们介绍每一种材质前,我们将先来检查下材质是如何产生效果的。

在PV3D中,材质有些争议。

,了解了他们的如何产生效果可以帮助我们解决对他们的争议。

基本属性:

所有的材质继承自一个特殊的基础材质类叫做MaterialObject3D。

这个基础类有一些所有子材质类通用的属性,但是某些属性只对某些特殊材质类型起作用。

比如可以控制材质平铺的属性就不能用于简单颜色材质,材质平铺是指用一副图在纵向或者横向重复放置的效果。

在介绍每一种材质前我们先来介绍对于所有材质都有用的三个属性:

●双面和单面贴图

●反面贴图

●光滑度

当我们设置材质对象的doubleSided属性为true时,我们将对构成物体的三角面两面都可见。

什么意思呢?

比如对于一个plane对象,就是正面和反面也能看到贴图材质;如果对于一个球体或者长方体就是里面和外面都能看到贴图材质,设置方法如下,用哪种无所谓。

material.doubleSided=true;

或者

material.oneSide=false;

默认的一个3D物体的面会被实现定义为前面和后面(正面和反面),而材质也默认贴在物体的前面(正面)。

但是有时候我们只需要贴在后面(反面),这怎么办呢?

比如对球体贴图,默认的是贴在外面,如果我们只要要在球体的内侧贴图呢?

贴两面肯定会多增加cpu负担,这时候我们就可以将opposite属性设置成true就ok了。

material.opposite=true;opposite:

相反

由于3D透视算法对材质的变形和缩放,材质会变得像素化。

改变材质的光滑度属性可以解决这个问题。

material.smooth=true;smooth:

光滑

遗憾的是,光滑处理会影响到性能。

所以在启用这个属性的时候请斟酌下。

再接下来的章节中我们会介绍到位图材质(BitmapMaterial)的光滑度属性。

第13章,我们来谈谈优化性能的技巧。

基础材质

有两种类型的基础材质:

●线框材质

●颜色材质

我们把他们归于基础材质是因为他们在实际项目中很少使用。

其他的材质提供了更多的功能,并且在做一些模拟现实世界的项目中更加有用。

讨论完了这两种材质我们就来介绍他们。

线框材质

到目前为止出现在例子中的物体我们用的都是线框材质,这是PV3D的默认材质。

它在3D物体的所有的三角面之间都画上线条,形成一个看上去由三角形网格连起来的物体。

在调试时期用的比较多因为它可以实时展示三角面是如何画出来的。

虽然听起来它像一个轻量级的材质,实际上渲染起来还是很吃力的。

因为它是用flash内置的画线方法来绘制的,而这个过程是比较费时的。

线框材质默认的被使用在PV3D内置3D模型上(如飞机球等)的创建过程中,然而,我们仍然可以手工创建线框材质。

让我们创建一个叫WireframeMaterialExample的项目,手工定义材质。

我们先导入相框材质类。

像大多数材质一样线框材质放在org.papervision3d.materials包中。

在类的顶部加入以下两行:

importorg.papervision3d.materials.WireframeMaterial;

importorg.papervision3d.objects.primitives.Cone;

在你的项目中,内嵌一个材质类型的局部变量来代替类属性可能会出一些问题,所以将它定义成类属性。

当一个材质被定义成内嵌的,你将它指向一个对象,那么以后再也不会用到它了(译者注:

因为指向这个材质的变量你无法访问,所以建议你将材质类型的变量申明成类属性,以提高材质的复用性)。

如果定义成了类属性,你以后还想想调用这个材质,你就可以使用对象的material属性,并且转变成材质类型。

比如:

varmaterial:

WireframeMaterial=do3D.materialasWireframeMaterial;

创建一个相框材质对象时,可以使用三个参数:

参数

数据类型

默认值

Description

1

Color颜色

Number

0xFF00FF

一个24位的颜色值,画线框时线条的颜色

2

Alpha透明度

Number

1

透明度值(0-1),线条的

3

Thickness粗细

Number

0

0-255.0表示极细线,也是默认值

Flash使用24位和32位两种颜色值,24位包括红绿蓝(RGB)三个颜色通道每个通道可以表示256种颜色。

256x256x256=224种颜色。

所以叫做24位色。

而32位色其实就是增加了个透明度通道为A,32位色就是RGBA,透明度也分成了256个值。

0表示完全透明,256(0xFF)表示完全不透明。

32位色和24位色都可以用16进制表示。

24位色:

0x00FF00,00-红色值FF-绿色值00-蓝色值

32位色:

0x00FF00FF,00-红色值FF-绿色值00-蓝色值FF-透明度。

大多数情况我们使用24位色,另外在提供一个透明度参数来。

但是在某些场合,你得使用32位色来替代24位色。

线框材质使用24位颜色值和另外提供一个透明度值。

如果没有使用参数,就都会采用默认值。

下面我们创建一个圆柱体使用50%的透明度的相框填充,线条粗细设为2.

privatefunctioninit():

void

{

varmaterial:

WireframeMaterial=newWireframeMaterial(0x000000,0.5,2);

varcone:

Cone=newCone(material,500,500);

scene.addChild(cone);

}

源文件见:

WireframeMaterialExample.

现在我们知道如何创建一个相框材质,接下来介绍如何使用颜色材质。

颜色材质

第二个基础材质是颜色材质。

一看名字就知道它是将颜色作为材质,使用起来就像线框材质那样简单,在前面的介绍内建模型的章节中,我们已经学洗了如何在一个立方体上使用材质。

ColorMaterial实例化时有以下参数可供使用:

Parameter

Datatype

Defaultvalue

Description

1

Color颜色

Number

0xFF00FF(品红色)

24位的填充色

2

Alpha透明度

Number

1(不透明)

透明度:

0到1。

3

Interactive交互性

Boolean

False(不支持)

设置材质是否支持交互:

如鼠标单击

除了Interactive参数,其余参数跟线框材质的参数是一样的。

(对原书省略两节,无关紧要)

privatefunctioninit():

void

{

varmaterial:

ColorMaterial=newColorMaterial(0x00FF00,0.5);

varcone:

Cone=newCone(material,500,500);

scene.addChild(cone);

}

别忘了导入org.papervision3d.materials.ColorMaterial类。

源文件见:

ColorMaterialExample。

以上可见,这两种材质使用起来比较简单。

三种使用位图材质的方法

虽然定义相框材质和颜色材质比较简单但是效果不好。

大多数程序都想使用位图材质来增添真实感,如果能灵巧的使用位图材质,即使简单的3D物体看上去也会逼真不少。

(这段内容的原文比较难理解,我把我的理解整理如下:

创建位图纹理这类事情可以交给photoshop和paintshoppor等软件。

这是它们的强项。

让物体不丢失性能且能增加一些额外的细节的技巧叫做烘焙纹理。

在大多数的3D软件中都支持实时的给物体亮化或者暗化,再或者映射周围的环境。

PV3D也支持这些。

但是这些操作很费系统资源(比如CPU计算)。

所以我们可以将某些实时效果用图像处理软件预先做在位图中,再导入到PV3D中,这样就省略了实时处理所需要的系统资源。

使用位图材质就像定义线框和颜色材质一样的简单。

根据你的需要你可以使用规则的Bitmap对象、外部的位图或者库元件作为材质。

BitmapMaterial位图材质

可能你已经猜到,位图材质就是由位图做成的材质类型。

位图对象可以通过代码绘制出来,或者调入外部图像文件,或者库中的一个图像元件。

对于要使用外部图像和图像元件作为材质,我们可以将它们申明成BitmapMaterial类型的子类型。

举个例子,我们可以用代码画个圆用作位图材质。

我们来了解下如何手动的加载一个外部的文件。

实例化一个BitmapMaterial对象有以下两个参数:

参数

数据类型

默认值

描述

1

asset

元件

BitmapData

位图数据

null

TheobjectthatholdsBitmapData.持有BitmapData的对象

2

precise

精细度

Boolean

false

当设置为true时,就会动态的创建额外的三角面用更精细的方式来绘制材质

接下来两个例子演示了如何使用位图材质。

Usingabitmapshapeasmaterialthatisgeneratedbycode

用代码生成的位图形状作为材质

BitmapMaterialShapeExample是我们介绍的第一个例子。

我们将用flash图像接口直接绘制一个圆,然后转换成BitmapData类型。

然后用在一个三维的平面上。

首先我们要导入到要使用的类:

importflash.display.BitmapData;

importflash.display.Shape;

importorg.papervision3d.materials.BitmapMaterial;

importorg.papervision3d.objects.primitives.Plane;

在init()方法中我们定义了一个Shape类型的对象,在这个Shape对象上画个圆。

在(100,100)位置绘制一个半径200的圆。

privatefunctioninit():

void

{

varcircle:

Shape=newShape();

circle.graphics.beginFill(0xFF0000);

circle.graphics.drawCircle(100,100,100);

创建一个位图材质(BitmapMaterial)的实例,位图材质的第一个参数是BitmapData类型的,所以我们需要将我们创建的Shape对象做转换。

(不要和Bitmap对象混淆我们要的是一个BitmapData对象),让我们了解下如何创建一个BitmapData对象,前面的两个参数定义了宽和高,第三个参数为透明度。

最后一个参数是原始填充色(BitmapData可以理解为一个画板,上面的每一个点都记录着当前位置的颜色信息)。

为了能在Shape对象上看到一个圆,我们将最后一个参数设为0x0,。

在创建好了BitmapData对象后,我们在BitmapData对象(画板)上画上圆。

(这里解释一下为什么我们不直接在画板上画圆,因为BitmapData并没有这个API,也就是不支持drawCircle()方法,当然方法还是有的,具体可以看Adobe官方帮助文档的BitmapData类的说明)。

varbmp:

BitmapData=newBitmapData(200,200,true,0x0);

bmp.draw(circle);

然后我们创建一个位图材质对象,用bitmapData作为参数。

varmaterial:

BitmapMaterial=newBitmapMaterial(bmp);

然后以这个位图材质对象为参数,在场景中添加一个平面。

varplane:

Plane=newPlane(material);

scene.addChild(plane);

}

编译发布后你回返现这个平面上的圆边上有毛刺现象(不圆整)。

这时候我们就要用到前面提到的材质的三个公共属性中的Smooth属性(光滑度)。

只要在创建material变量的下面添加一行代码就可以解决这个毛刺现象了,注意这也是会消耗一点CPU资源的。

material.smooth=true;

源文件看:

BitmapMaterialShapeExample

Manuallyloadingandassigninganexternalbitmapasmaterial

手动装在外部位图文件作为材质。

先看下面的代码

package{

importflash.display.Bitmap;

importflash.display.Loader;

importflash.events.Event;

import.URLRequest;

importorg.papervision3d.materials.BitmapMaterial;

importorg.papervision3d.objects.primitives.Plane;

importorg.papervision3d.view.BasicView;

publicclassBitmapMaterialImageExampleextendsBasicView

{

publicfunctionBitmapMaterialImageExample()

{

stage.frameRate=40;

init();

startRendering();

}

privatefunctioninit():

void

{

//Startloadingtheimageanddefineanoncompleteeventlistener

varimgLoader:

Loader=newLoader();

imgLoader.contentLoaderInfo.addEventListener(Event.COMPLETE,loadComplete);

imgLoader.load(newURLRequest("assets/mill.jpg"));

}

privatefunctionloadComplete(e:

Event):

void

{

//Loadingcomplete.CasttargetcontentasaBitmap

//anduseitsbitmapDataforcreatingaBitmapMaterial

varbitmap:

Bitmap=e.target.contentasBitmap;

varmaterial:

BitmapMaterial=newBitmapMaterial(bitmap.bitmapData);

varplane:

Plane=newPlane(material);

scene.addChild(plane);

}

overrideprotectedfunctiononRenderTick(e:

Event=null):

void

{

super.onRenderTick();

}

}

}

请注意转载的图片文件的目录。

这个图片在在下载的代码文件中有,当然你也可以用其他图片文件来代替它。

这些代码执行效果是在屏幕显示一幅图片,我们如何让这幅图片旋转呢?

注意创建一个旋转地平面在当前的例子中会有一些问题。

上面的类中plane对象我们没有申明位类属性,所以我们不能在render方法中控制它,因此也不能改变他的旋转度。

另外注意我们在plane创建之前就开始渲染了。

在下一节中我们会掩饰如何在平面被初始化后才开始材质的渲染。

改变上面的例子,沿着轴旋转这个平面。

确保你创建的平面有足够多的片段。

并且设置成双面。

你会看到类似下面的结果

BitmapFileMaterial位图文件材质

我们已经知道如何创建一个位图材质,并且应用到一个平面上,我们也可以加载一个外部文件并且用文件中包含位图数据来创建一个位图材质。

但是有一种更为方便的方法从外部加载图片作为材质。

这就是BitmapFileMatreial类。

它继承自BitmapMaterial类。

并且帮你把装在过程中的麻烦都代劳了。

创建一个BitmapFileMaterial对象很简单,它有两个参数。

参数

数据类型

默认值

描述

1

url路径

String

""

指向外部文件的路径

2

Precise精度

Boolean

false

定义是否使用材质的精度

第一个参数是必要的。

第二个参数可以省略,默认值为false。

当材质还未加载好之前纹理将显示为黑色。

让我们来看看在上一个例子上我们如何来加载一幅图。

源代码如下:

package{

importorg.papervision3d.materials.BitmapFileMaterial;

importorg.papervision3d.objects.primitives.Plane;

importorg.papervision3d.view.BasicView;

publicclassBitmapMaterialImageExampleextendsBasicView

{

publicfunctionBitmapMaterialImageExample()

{

stage.frameRate=40;

init();

startRendering();

}

privatefunctioninit():

void

{

varmaterial:

BitmapFileMaterial=newBitmapFileMaterial("assets/mill.jpg");

varplane:

Plane=newPlane(material,500,375,2,2);

scene.addChild(plane);

}

}

}

代码精简了不少了吧。

当使用BitmapFileMaterial时,请设置Plane对象的宽和高。

当将一个平面对象和文件材质结合时。

你应该总是设置好宽和高。

否则程序会自动的将位图的大小设置为平面的大小。

在图片加载好之前,程序是不知道图片的大小的,这样在你在看到平面之前它的大小会被先设为0x0。

当你编译发布时,一开始平面呈现一会的黑色,然后才显示图片纹理,若要防止这种事情,就必须在纹理加载好后在开始渲染工作。

但是我们怎么知道纹理文件加载好了呢?

我们并不知道BitmapFileMaterial类中有关加载图片文件的Loader对象。

幸好PV3D为我们想到了。

在文件加载好时,BitmapFileMaterial对象会发出一个FileLoadEvent.LOAD_COMPLETE事件。

FileLoadEvent事件对象时PV3D定义的事件类型。

还有另外一些类也使用这个事件。

与BitmapFileMaterial对象有关的有四种类型的事件:

●FileLoadEvent.LOAD_COMPLETE:

外部位图加载完成时,发出该事件。

●FileLoadEvent.LOAD_PROGRESS:

外部位图加载过程中,发出该事件。

●FileLoadEvent.LOAD_ERROR:

外部位图找不到时,发出该事件。

●FileLoadEvent.SECURITY_LOAD_ERROR:

安全错误发生时,发出该事件。

要使用这个事件,必须先导入该类:

importorg.papervision3d.events.FileLoadEvent;

我们可以直接在创建的BitmapFileMaterial对象添加一个时间侦听器,监听它发出的LOAD_COMPLETE事件:

material.addEventListener(FileLoadEvent.LOAD_COMPLETE,loadComplete);

接着我们还要定义一个方法。

下免得代码比较有用,他可以让多个BitmapFileMaterial对象在加载完文件后调用。

privatefunctionloadComplete(e:

FileLoadEvent):

void

{

trace("Completedloadingfile:

"+e.file);

startRendering();

}

在这个方法中我们才开始渲染。

Whenyoupublishthiscode,youshouldseethefollowingoutput:

Completedloadingfile:

assets/mill.jpg

BitmapAssetMaterial位图元件材质

位图元件材质也是继承自bitmapMaterial,是另一个很方便的定义位图位材质的类。

BitmapAssetMaterial把图形元件中的位图数据(BitmapData)取出用作材质,因为FlexBulidler和flashBuilder都没有像flash那样的库,所以这个是给FlashIDE专用的。

这个类有两个参数:

参数

数据类型

默认值

描述

1

linkageID

String

""

Flash库文件的中元件的连接标示符

2

Precise精度

Boolean

false

定义是否使用材质的精度

让我们看看如何在Flash中定义一个库元件,以便我们能将它和BitmapAssetMaterial结合起来使用。

1.先导入一个图想到你的库中。

(不是舞台)

2.在库中右击图像选择“属性property”

3.一个名叫“BitmapProperty”的窗口弹了出来

4.如果高级面板未打开则打开它

5

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 成人教育 > 专升本

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1