1.1 建模与模型(完整版)

来自Infinitipedia
跳到导航 跳到搜索
下一页

Infinity Artwork Design Document, 30 September 2007

Infinity美工设计文案,2007年9月30日


总纲

几何

a) 文件保存格式

目前转码工具ASEToBin(用来将模型导入游戏的工具)只支持ASE文件。很多CAD软件可以生成ASE文件,但文件格式有微小变化。只有3DS MAX可以准确导出ASE文件。

另外,一般需要对完成的模型作一些调整,比如将其缩放到合适的尺寸、将其旋转一定角度对齐方向,等等。这些操作也要在3DS MAX中完成。因此,提交的文件必须采用3DS MAX 可以打开的格式。 也可以使用Maya, Lightwave, Sketchup, Blender, Milkshape等CAD工具,但完成的作品必须用以下文件格式提交:

  • 以.3DS格式为标准格式。注意,位图文件名会转换成8位主名加3位扩展名形式,所以重新导入到3DsMax中时要手动修正。
  • 如果使用Blender,请直接提交.blend文件。
  • 如果生成的.3DS文件不完整或损坏,请使用.OBJ格式导出。这样可能对动画或平滑效果造成一定影响,但基本的模型结构和UV贴图会完好保留。
  • 实在不行就用.WRL(vrml)导出。

Workflow.png

图1:操作流程

b) 单个CAD文件中的对象/网格(Objects / meshes)

  • 模型可由不同的逻辑对象(网格( meshes ))构成
  • 将模型中所有运动的部分拆分成独立的对象
  • 将模型中所有可脱落部件设定为独立的对象,如舰船的翼。
  • 将模型中所有模块化的部分设定为独立对象(见“模块”章节)。一艘舰艇上的所有模块都应包括在同一个CAD文件中,只有当有些模块为不同舰船模型共享时,才需要将相应对象存为单个文件。
  • 将模型中尺寸过大的部分(按真实世界的标准)设定为独立对象。此举有助于3D引擎对对象的层次视锥剔除运算。一般地,每250米分一个对象(即,如果一舰船模型长2千米,将其分为8个对象)。不要单纯根据模型结构分割对象。每个对象三角数不要超过1万。
  • 将尺寸很小或结构简单的多个对象整合成一个对象,构成一个“刚性体”(rigid body)(构成刚性体的所有三角形在动画中均同步运动)。
  • 一般,如战机等尺寸小于50米的小型模型,使用的对象数不要超过5个。如航母、战舰等大型单位的对象数控制在3-25个。

c) 网格质量(Mesh quality)

网格数量的常见错误:

  • 多边形密度(Quality of tesselation ( density of polygons ):):不要在曲面上浪费过多的多边形数,尤其不必把小物体做得过细。相反,在较大的弯曲面上要应用较高的多边形密度。例如,一个在不显眼位置的或者很小的圆柱型就不必分割成40段。
  • 自交叉对象(Self-penetrating objects):指交叉角度很小的三角面组或对象在交汇处的失真。由于靠近交叉处的三角接近平行,容易导致Z缓冲冲突(Z-fighting artifacts)(见以下相关部分)。如果三角面交角较大(如接近九十度)则不会出现这种现象。
  • 隐面剔除(Backface culling):隐面剔除是在实时表现三维图像时,把背向取景器的三角面隐去的一个过程。例如,从外部观察一个立方体,与一般没有什么区别。但当取景器在立方体内部,由于这时立方体的各个面是背向取景器的,所以不可见。

所有模型必须应用隐面剔除。

也就是说,模型网格必须构成一个连贯的立体,不可有漏洞。而且网格上三角面的缠绕方向也应当是一致的,必须全部依顺时针或逆时针方向。如果有些用顺时针,有些逆时针,隐面剔除就会发生错误,实时检测模型时就会看见网格上有随机出现的漏洞。要修复此问题,通常需要反转所有没有正确应用剔除的面的法线方向。

  • 顶点合并(Welding vertices):确保去除无谓重复的顶点。更新完对象的法线方向或平滑组后,不要再合并顶点,这样会导致平滑组错误。
  • 法线/平滑组(Normals / smoothing groups):多数情况下应用30°自动平滑就足够了。但有时必须手动修改某些区域,比如曲面的平滑。法线/平滑组在照明中要用到,错误的法线方向会导致照明错误,或在表面上出现“暗的”三角面。
  • Z缓冲冲突(Z-fighting):当几个三角面接近共面时(也就是近似平行,且彼此间距离很小),就会发生Z缓冲冲突。这些面之间的景深无法用Z缓冲实时表现出来,会造成图像闪烁。必须尽一切可能避免共面三角导致的缓冲冲突。如果建模过程中复制了一个三角面或者一个对象的一部分,事后又忘记把复制的部分移除,就会造成Z缓冲冲突。
  • 丁字节点(T-junctions):这是有关网格的一个小问题,几乎是看不出来的,但最好还是避免。当三角面的一个顶点落在另一个三角面一边的中间时,就会产生丁字节点。实时表现时,节点处会有一个1像素大小的缺口。这在细节水平生成阶段可能会造成麻烦。见下图:

I2.png

图2:丁字节点是魔鬼

d) 共面多边形

共面多边形/共面表面是非常麻烦的,有时候也作为网格上的错误处理(共面多边形即非常接近且近似平行的多个多边形)。问题的原因是Z缓冲。显卡的Z缓冲是只显示重叠的多个像素点中离取景器最近的一个,去除后面看不见的像素。Z缓冲会记录每个点到取景器的距离。当一个新的点出现时,它会检测这个点是比较近还是比较远。如果新出现的像素点比较靠后,就去除掉。共面多边形之所以会造成显示问题是由于显存中的Z缓冲是24位编码。由于计算机中浮点数编码的特殊性,Z缓冲中所用的距离是非线性的。离取景器较近的点的距离数值就比景深较大的点的数值要来的精确。

那么这与共面多边形所导致的问题有什么联系呢?这是因为在实时表现时,如果共面表面上间的距离很近(通常称为厚度),那么这些面上的两个重叠像素点的Z值就会是一样的。Z值相同的重叠点在屏幕上会随机闪烁。这个问题的严重程度取决于表面的面积大小,景深,以及厚度。由于上面说过的Z缓冲中距离数据的非线性,景深越大,显卡就越难分辨两个相邻共面表面的Z值。同时,厚度越小,闪烁越严重。最坏的情况就是从远距离观察厚度很小的对象。

I3t.png

图3:共面多边形

小型舰船从远距离看不过是些小点,所以它们受上述问题的影响不大。但对以公里计尺寸的大型舰船来说,用小厚度的共面表面来构造模型细节就会产生问题。

注意1:即使不是完全共面/平行的表面,要是小角度相交,也可能产生类似问题。

注意2:只有在共面表面或近距离平行表面的法线方向不同时,才可以在模型中使用。因为隐面剔除使得两个面只有一个会显示出来,这样Z缓冲就不会出现冲突了。如果您还没有透彻地理解这个过程的内部机理,就不要使用这种方法。

修正这个问题的方法是将这些表面整合为一个(在船体和模型细部之间放置一些顶点),然后去除船体下那些从模型外部看不见的部分。然而这一操作将大大增加模型的多边形数,务必谨慎。但是这是避免Z缓冲冲突的较好方法,也有助于细节算法的实现。

厚度很大时,允许使用交叉的对象或模型细节,以降低多边形数。总的来说,就是除非共面多边形之间的厚度很大,不要使用交叉的对象或模型细节。参考上面的例子,注意在所有3种情况下,从远离模型的地方观察,都会看到同样的闪烁轮廓,只有在正确的做法下,才可以避免Z缓冲冲突。

e) 定稿

  • 中轴(Pivots):除非有充分理由将中轴设置在其他位置,必须在模型的中央设置中轴。我看到很多模型的中轴设置错误。
  • 单位(Units):显示单位请使用公制长度单位(米),系统单位使用英寸(Inches)
  • 尺寸(Scale):请确保模型大小符合相应模型分类的尺寸要求。在3DS MAX中有用来测量两点间距离的工具。
  • 原点(Origin):确保整个模型(即,包括所有对象)的中心落在场景的原点(0,0,0)上。
  • 朝向(Orientation):确保整个模型朝向Y轴正方向(即前向轴)。Z轴正方向作为上方。
  • 多边形数(Polycount):确保模型的多边形数接近要求的数值(参见各种模型的多边形数参照表)。多边形数按三角面数量计,不要按四边形数计。
  • 各位设计者需要注意的几个关键问题

http://www.infinity-game.com/bbs/viewthread.php?tid=963

下一页