Pv3D-8外部模型.doc_第1页
Pv3D-8外部模型.doc_第2页
Pv3D-8外部模型.doc_第3页
Pv3D-8外部模型.doc_第4页
Pv3D-8外部模型.doc_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第八章 外部模型我们不可能手工的通过创建每一个三角形的方法来创建这个茶壶,所以,pv3d允许我们使用其它3d软件生成的模型,这就给我们的创作工作带来了巨大的活力,让你能在pv3d中使用一些不能用基本几何形状拼接的复杂的模型.Pv3d允许导入几种在外部程序中创建的3d模型,某些类型可以支持动画,许多外部软件都支持pv3d模型的输出,我们在这里简单的给读者介绍3种:3D MAX 一种使用最广泛的3d软件,运行环境为windowsSketchup Google发布的免费3d软件运行环境为苹果macos以及windowsBlender 一款开源的跨平台的3d软件本章重点讲解怎样将外部模性导入pv3d,关于怎么在外部软件中创建模型不在本书的讲解范围内,因此我们只用基本模型进行讲解,实际上在复杂模型上的操作是相同的。本章包括以下几点:l 为pv3d创建模型l 模型导入前的准备工作l 用3DMAX建模l 导入3DMAX中创建的动画l 用Sketchup建模l 用Blender建模l 材质调整让我们开始吧!为PV3D建模由于每一种建模软件都有其不同的方法,因此在本节中我们不讨论模型建立的细节问题。在本节里我们要讨论为PV3D建模的几种方法.基于PV3D是一种大众化的网络平台项目,因此在为PV3D建模的理念是不同于3D动画、电影、游戏以及展示场景制作的,前者中大部分的技术都致力于提高其性能表现。小提示:Papervision3D PreviewerPapervision3D Previewer是一个针对PV3D模型非常好用的小工具,它可以帮助你更好的测试你的模型。Papervision3D Previewer允许开发者在PV3D环境下渲染外部模性,并且显示外部模型的运行参数。当笔者写下这篇文章的时候,Papervision3D Previewer还不能与PV3D2.1更好的兼容,当导入模型时会出现某些错误。你可以在下面的链接中下在到这个软件:/p/mrdoob/wiki/pv3dpreviewer尽量减少模型的多边形PV3D是一种非常新潮的FLASH 3D技术,它以相对不可思议的性能运行在FLASHPLAYER上面。然而PV3D只是利用了整个电脑硬件资源的一小部分,但即使拥有全部的硬件资源,程序也存在着一个多边形数目计算限制的问题,因此我们不得不在细节上做出让步以提高性能,这一点对于PV3D的用户来说尤为重要,所以请尽可能的减少模型的多边形数量。PV3D的用户常常迷惑于FLASHPLAYER究竟能控制多少三角形,这个问题是没有具体答案的,因为具体的性能取决于很多的因素而不是具体的三角形数量,一般来说三角行数量不要超过3000,也就是1500个多边形(一个多边形由两个三角形组成)。注意:不像其他的3d软件PV3D是以三角行为计算单位的,而不是多边形增加面使模型更加自然(消除伪影,就是因为模型中面不正确而产生的黑色部分)看起来这一节的宗旨好像和上一节是冲突的,有时候你需要通过增加面的方式来消除纹理扭曲以及伪影问题,伪影常常发生在物体面交汇的地方,细分这些区域的面可以让z-sorting(应该是z法线吧)更加的精确。伪影经常发生在物体的面交叉或者非常接近的地方 ,细分这里的多边形可以使得z-sorting更加的精确从而去除伪影。通常这需要在相交的三角形区域创建一个同样大小的多边形。这里有几种方法防止伪影的产生,下一节里我们将详细的讨论这些方法。根据你所使用的模型的不同,调整出最优数量和位置的面所作的工作是非常耗时的,你要尽可能的添加最少的面来消除伪影。你需要不停的在3d软件和pv3d中切换,以找出你能使用的最优化的模型。优化你的材质材质可以连同模型一起被导出,并且 pv3d可以自动识别并加载这些材质,然而,pv3d对所加载的材质不会进行任何的处理,举个例子:你使用一张大小为1024X1024像素的图像做为一辆汽车的轮子的贴图,而在pv3d中这个轮子绘制在屏幕上的大小只有50X50像素,那么就会产生很多的问题:l 占用过多的带宽,浪费加载时间。l 占用过多的系统资源,pv3d需要重置图像的大小,比如上个例子pv3d必须将图像大小从1024x1024 转换为 50x50像素。因此,切记一定不要选择过大的图像,贴图大小和程序显示大小一致即可,这将带来两方面的好处,一方面下载速度更快,一方面运行更加的流畅。使用flash认识的材质类型很多3d软件可以导入一些特殊类型的图像,比如Adobe PSD,而flash在运行的时候只能使用jpg、gif以及png图像,因此在使用中一定要把图像转换为这些类型以免造成不必要的麻烦。使用uvmap贴图如果你的模型只有少数的物体和贴图,使用uvmap是个不错的选择,他的使用方法就是把模型解包(unwrapping)并且把所有的材质定义到一张图像上(译者注:学过3d的人肯定都知道的,比如人脸的贴图)。这个方法有个优点就是加载1张图片的速度肯定要比加载几十张图片要快的多。Uvmap还可以应用于类似瓷砖,瓦片等重复的部分,在这些部分中更多的使用uvmap就能更好的节省带宽。一定要保持你的uvmap贴图尽可能的小,如果你有很多的物体共享一张uv贴图的话,那么你需要一个很大的图像尺寸,因此你要知道 flash player 9最大支持的图像尺寸为2880x2880像素,好消息是两张材质的话图片最大可以达到2048x2048像素。烘焙纹理烘焙纹理就是将高光、阴影、折射、反射以及整个3d场景整合为一张图片的过程。几乎所有的3d软件都支持烘焙纹理。烘焙的纹理虽然是一次成型,但是可以增加真实度,就像阴影材质一样,但是不会像阴影材质那样需要实时计算而丢失很多性能.物体和材质的命名给你的材质和物体建立一个好的命名规范,同样的为你代码中的类、方法以及属性也采取一定的命名规范。为程序中使用的物体重命名的时候一定要三思而行,你的代码中也许正在使用这个物体,比如让它显示为可点击的物体。如果你作为一个团队工作中的一员,这样做的后果很可能让你的整个程序崩溃掉。模型的大小和位置为了便于维护模型的大小,最好使用原始的实例文件,这是一种好的习惯。这样不管你怎样的调整物体的缩放比例,在pv3d里要与建模软件中达成一致都非常的方便。【记住,在pv3d里面并没有确定的度量单位如米、像素等,他只是有单位而已】另一个好的习惯是在3d建模软件中一定要把物体放在默认的位置,特别是当你要导出单个的物体的时候,放在整个坐标的0点位置上更便于你找到他。你可以对比在flash中放置mv的情形,如果这个动画剪辑不在他的坐标点上,你很难找到他。在性能和显示质量之间找到平衡在每一个项目中你都要在一个精简的模型和完美的细节上找到一个平衡点。因为每一个项目在其规模、客户要求以及细节需要上各不相同,因此这一点上不可能固定的条例去遵循。所以一定要谨记上面所说的要点,灵活的去运用他们,如果你发现了你自己的好的优化模型的方法,那么一定不要犹豫,利用它吧!目前为止我们已经大概明白怎么创建并且导出模型到pv3d,下面我们将创建一个简单的代码示例。创建一个装载模型的模板类为了展示pv3d使用外部模型,我们将创建一个基本的代码去实现。还记得第6章的示例吗,我们通过移动鼠标来控制摄像机围绕网格飞机进行旋转。我们将使用相同的代码,只不过这次使用的模型是外部导入的。基于上面的示例,我们创建了下面的类。每次我们要导入新的模型的话我们只需要更改一下init()方法,下面我们来看一下具体的代码:package import flash.events.Event;import org.papervision3d.materials.WireframeMaterial;import org.papervision3d.materials.utils.MaterialsList;import org.papervision3d.objects.DisplayObject3D;import org.papervision3d.objects.primitives.Cube;import org.papervision3d.view.BasicView;public class ExternalModelsExample extends BasicViewprivate var model:DisplayObject3D;private var rotX:Number = 0.1;private var rotY:Number = 0.1;private var camPitch:Number = 90;private var camYaw:Number = 270;private var easeOut:Number = 0.1;public function ExternalModelsExample()stage.frameRate = 40;init();startRendering();private function init():voidmodel = new Plane();scene.addChild(model);private function modelLoaded(e:FileLoadEvent):void/To be addedoverride protected function onRenderTick(e:Event=null):voidvar xDist:Number = mouseX - stage.stageWidth * 0.5;var yDist:Number = mouseY - stage.stageHeight * 0.5;camPitch += (yDist * rotX) - camPitch + 90)* easeOut;camYaw += (xDist * rotY) - camYaw + 270) * easeOut;camera.orbit(camPitch, camYaw);super.onRenderTick();我们创建了一个新的网格飞机,它属于DisplayObject3D下属的model类,实际上任何的外部导入的模型都是do3D类的成员,因此不管我们从外部导入什么样的模型,他们都是model类的下属成员,他们都继承与DisplayObject3D类。现在我们已经建立好了代码,下一步的工作就是进入3dmax,创建并导出一个模型,然后在pv3d中导入它。在3dmax中创建并导出模型3dmax是一个应用非常广泛的建模和动画生成软件,对初学者来说非常容易上手,并且他可以导出两个pv3d可以使用的格式。后缀为dae的格式,这是一种先进的开源格式,一开始便被pv3d所支持,支持动画,实际上它是一种简单的xml文件。后缀为3ds的格式,这个就不用说了,Autodesk的标准文件,基本是3d业界的工业标准。3dmax9内建了基于COLLADA标准的插件(面向交互式3D 应用程序的基于XML 的数字资产交换方案),然而读者还不能使用它,截止本章截稿的时候,用它导出的文件还不能被pv3d所使用。安装COLLADA Max有一个for 3dmax的可用的插件叫COLLADA Max,这是一个完全免费且开源的软件,可以用于3dmax7或者更高的版本。安装它非常的容易,根据下面的步骤即可。1、 确定你安装了max7或者更高的版本2、 去这里下载/projects/colladamaya/.3、 点击View all files并且选择最新的版本4、 下载并且安装5、 打开max看看导出对话框里面有没有COLLADA或者COLLADA NextGen文件格式如果导出里面只有Autodesk Collada格式,那么肯定是在安装过程中出现了什么错误Autodesk Collada格式是不能被pv3d使用的。好了,现在我们已经安装好了插件,下面就让我们来创建一个基本的物体和材质并且为pv3d导出它。创建一个茶壶,并且导出到pv3d如果你用过3dmax那么这一步太ez了,我们所要做的就是建立一个茶壶,给他加个uvmap修改器,给他加上材质,并且导出为COLLADA格式,如果你是max的新手,也不要紧,跟随我们的步骤来就可以了 。1、 首先我们启动max并且建立一个新的场景,新的场景在打开max时已经默认建立了。2、 从右边的工具栏里面物体(object)选项卡选择teapot,如下图3、 从右边的属性面板里面填入半径(Radius)以及段数(segments)如下图所示4、 选择茶壶,在屏幕的最下端找到 x y z坐标属性,输入如下的值,将茶壶定位在(x:0,y:0,z:-175)的位置5、 再加上贴图之前,首先给茶壶加一个uvmap修改器(在max里面这个被称作uvwmap修改器)6、 保持茶壶在被选择的状态,进入右边的修改器(modify)面板,选择uvwmapping修改器,点选Shrink Wrap题图方式,选择围绕z轴进行贴图7、 用快捷键m打开材质编辑器,在这里我们给物体修改材质。8、 选择01 Default材质,给他改一个名字,比如teapotMaterial9、 点击漫反射(diffuse)颜色旁边的小方块,选择一副位图可以设置材质的漫反射贴图。10、 这时候会打开一个材质位图选择器,双击位图(bitmap),在打开的对话框里面选择你想要加载的位图,在本章里面我们选择teapotMaterial.jpg。11、 点击确定以后,恭喜你,你就会看到材质球已经起了变化,显示出我们所选择的图像的材质,这个时候吧材质球拖动到茶壶上就可以了。12、 下面我们就可以把茶壶物体导出了,记住导出的格式一定要选择COLLADA或者COLLADA NextGen文件格式,而不是Autodesk Collada,后者是不能在pv3d中工作的。13、 选择导出的名字,比如teapot,单击导出按钮14、 这时候会显示导出选项窗口,保持默认值不变,点击ok保存文件再次这个模型存为默认的.max文件,保存在你的电脑上,以便以后我们讲解导出其他文件时使用。下面让我们看一下怎样才能把导出的模型导入到pv3d中。导入模型到pv3d中要导入这个模型,我们要用到本章前面所建立的外部模型导入代码,找到你的文档类所在的文件夹,建立一个名字叫做assets的文件夹,并且把导出的模型以及模型所使用的材质图片拷贝到里面。用来导入外部文件的类叫做DAE,所以在开头我们要引入这个类:import org.papervision3d.objects.parsers.DAE;这个类是一个外部文件的分析器。【如果你仔细看看pv3d的源文件以及他的模型分析器,你就会找到Collada类,在这里你可能会觉得有点混乱,为什么我们用DAE分析器而不是Collada分析器来解析Collada文件呢,其实我们可以任选其一的,但是在本书中我们只使用DAE解析器,因为他是最新的类可以支持如动画等更多的特性,而Collada分析器便没有这么多的特性,并且它不被Collada分析器所支持】用以下的代码替换init()方法中的代码,model = new DAE();model.addEventListener(FileLoadEvent.LOAD_COMPLETE,modelLoaded);DAE(model).load(assets/teapot.DAE);因为模型在pv3d中被定于为DisplayObject3D类,因此我们需要把它转换为DAE格式才能使用它的某些方法,比如load()方法。我们在这里还定义了一个事件侦听器,以侦听模型被装载完成事件。一旦模型被装载完成,modelLoaded()方法便被触发,好的习惯便是,当模型装载完成后再把它加入到场景中。下面是modelLoaded()方法的代码:scene.addChild(model);茶壶示例运行这个示例你就会看到如下的茶壶模型了在实际应用中一个好的习惯就是把模型和材质图像分别放在两个不同的文件夹里,你最好将类似的文件分别放在以下的两个文件夹里模型: /assets/models/材质图片: /assets/textures/系统会默认的在模型文件夹里寻找材质,或者在存放Collada模型文件的被明确规定的文件夹中进行搜索,如果你想把上面的材质文件夹包含到搜索路径中,可以使用以下的代码将它在系统中进行定义。daeModel.addFileSearchPath(assets/textures);你可以多次使用这条代码,以便于加入多个查询路径给系统,一般的情况下我们都是利用一个循环,把一个特定的路径数组加入到系统中。Pv3d中怎样导入3ds格式的文件现在我们来学习一下怎样使用另外一种max和pv3d都支持的3ds格式,这种格式被称为3dstudio格式,是一种被大多数3d软件所支持的公认的3d文件格式。导出这种文件的方法和上面我们导出dae格式非常相似1、 打开上次我们存储的max文件2、 选择导出,导出为3ds文件3、 出现是否同步输出max材质,选择ok4、 如果你的材质图片文件的名字超过8个字符,他就会出现一个警告如图你可以关闭它,但是你一定要明白他所说的意思:如果你的文件名不是8个字符文件名+3个字符的后缀名这一dos时代的标准文件名,那么系统就会进行强制重命名。5、 因为导出模型的时候,系统只是改变了与文件相关联的材质名称信息,而没有实际的改变材质文件的名字,因此我们需要手工创建这种关联。在这个例子里面,我们只需要把材质文件改名为teapotMa.jpg并且把它拷贝到与3ds文件相同的文件夹里即可。到这里你会发现,其实导出模型给pv3d是一件非常简单的事情,实际上整个项目你大部分的精力都花费在建模上,导入和导出模型都是非常容易的事情。首先拷贝3ds文件还有改名过的文件到assets文件夹,以方便在后面的文档类中调用它,然后我们要引用pv3d中3ds文件的调用类Max3DS类。import org.papervision3d.objects.parsers.Max3DS;在init()方法中你需要把调用COLLADA模型文件的部分注释掉,或者直接用下面的代码把它替换掉model = new Max3DS();model.addEventListener(FileLoadEvent.LOAD_COMPLETE,modelLoaded);Max3DS(model).load(assets/teapot.3ds, null, ./assets/);在这里load()函数有两个方法,第一个是要调用的文件的路径,第二个参数定义的是一个材质文件的列表,在这个案例中我们略过不填,第三个参数定义的是材质存放的目录,这个目录是相对与发布swf文件目录的。一定要注意的是这里和DAE文件的解析少有不同,前者是从addFileSearchPath()方法加载的外挂文件路径中寻找材质文件的。好了,如果你完成了上述步骤,那么久发布swf吧,你会看到和上一节的例子一样的茶壶,但是这次使用的可是3ds文件。导入带有动画的模型文件上一节中我们导入的模型都是静态模型,pv3d中我们是可以导入带有一个或者多个动画的模型的,并且,导出动画不需要额外的步骤。你可以使用max当然也可以使用其他支持COLLADA的工具来生成它。为了讲解起来更简单,我们这里使用了一个现成的动画模型文件,这个模型包含两个子动画,我们要把它用COLLADA文件格式导出,然后在pv3d中导入他们。1、 首先打开animatedMill.max文件,在本书提供的下载链接中你可以找到他们。2、 你可以通过点击max最下部动画控制条中的play按钮来很直观的观看动画,从0-180帧你会看到风车片从左往右移动,180-360帧风车片从右往左移动。3、 下面我们就可以直接导出了,不用对这个文件作任何的修改,这里我们使用COLLADA文件格式进行导出。4、 当COLLADA文件导出设定对话框闪出来的时候,记得要勾选Sample animation选项,并且确保star和end填入动画的开始帧和结束帧,在这里是0和360. 5、 完成这些设置后,单击ok就可以,下面我们来看看pv3d怎样导入。首先你要把生成好的COLLADA文件以及Blades.jpg, House.jpg, and Stand.jpg三个材质文件一起拷贝到项目的assets文件夹中。我们将再次使用DAE类来导入动画文件,只要稍微修改一下参数我们就能让动画循环起来。model = new DAE(true,null,true);model.addEventListener(FileLoadEvent.LOAD_COMPLETE,modelLoaded);DAE(model).load(assets/animatedMill.dae);下面实这个类各个参数的使用方法 参数数据类型默认值描述1autoPlayBooleantrue如果模型中内置动画,那么pv3d会自动的播放2nameStringnull随意的名字,让你可以更便捷的使用模型3loopBooleanfalse定义动画是否循环播放,默认只播放一次发布swf你会看到下面的东西动画裁剪发布了项目之后,你会发现存在两个动画,风车向右转以及向左转,这是因为我们没有将动画定义成为两个分离的动画片段,因此我们只能播放完整的动画。如果我们想选择风车旋转的方向,那么我们就要定义一个动画裁剪,原理其实很简单,我们只要从时间线里面裁切一部分就可以了。AnimationClip3D类为我们提供了这个方法。参数数据类型默认值描述1NameString-动画剪辑名,制定动画片段的唯一名称2starTim

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论