7.1、建模工具和格式
用文本编辑器或是用代码来创建顶点属性数据是困难的,容易出错的,并且是枯燥乏味的。存在很多创建3D数据的建模工具,从顶点属性效果到动画效果、物理效果、灯光效果等。建模(modeling)是3D内容创建者用来描述3D数据模型开发过程的术语。表7-1对比了流行的建模工具。

表7-1列出了可用工具的一个很小的子集。未列出的工具可能是用于特殊需求的。维基百科上有一个更全面的对比,网址为: http://en.wikipedia.org/wiki/Comparison of_3D_computer_graphics_software
本书的模型是用SketchUp或者Blender制作的,有时是两个工具的结合。因为本书的例子需要面向尽可能多的读者;而SketchUp和Blender都是免费的,并且都支持Mac OS X。
所有的3D建模工具都会用不同的并且常常是专有的文件格式来保存创建的模型数据。大部分工具可以从其他工具导人或者导出模型数据。有时,第三方插件会实现模型的导人与导出。几十年来,一直迫切需要一个用于工具间数据交换的能够可靠记录3D数据的文件格式。Wavefront 公司的.OBJ格式曾经是数据交换的主流格式,因为它容易解析,但是它非常局限。这种格式不能保存现代应用所产生的关键信息。使用.OBJ
格式在工具间交换模型会带来无意中丟失有用信息的危险。
今天的解决方案是KhronosGroup所控制的COLLADA格式,OpenGL标准也是由这个组织控制的。COLLADA使用可扩展标记语言(XML)来保存模型数据,换句话说,就是以普通的文本文件来保存。它是免费使用的,没有特许权使用费或者其他 费用,详细说明参见网址: https://www.khronos.org/collada。 几乎所有的现代建模工具都使用COLLADA格式来导出模型,导入格式也是这样。
COLLADA会保存几何体、材质、纹理、灯光、动画等到文件中,使用的是.dae
扩展名。顶点数据通常是以一个紧凑的实例化的表示形式来组织的,这意味着相同的顶点数据可能会用在多个模型或者网格中。第6章介绍过网格,本章会详细说明这个概念。
COLLADA实现了建模工具和3D应用之间的信息交换。通常,这个格式是无损传输数据的。但是COLLADA并不适用于保存iOs应用直接加载的数据。实现工具间的互通所需要的复杂性让这个格式难以解析。最好的做法是首先使用一个离线工具来读取 COLLADA文件,然后用这个工具输出特别适合iOs应用的数据的一个子集。
资源管道
资源管道(asset pipeline)描述了一个工具序列,包括用于创建3D数据的工具、用于转换数据格式的工具、优化工具、问题测试工具,以及输出适用于在一个应用中高;效加载的数据的工具。本书使用一个简单的资源管道,这个资源管道开始于SketchUp或者Blender,参见图7-1。

COLLADAViewer应用运行在Mac OS X上,可以在本章的例子中找到,下载地址为https://opengles. cosmicthump.com/learning-opengl-es-sample-code/。COLLADAViewer.app会利用MacOSX的NSXMLDocument和相关的NSXML类来解析.dae
文件。使用比较少的Objective-C代码(只有五个类)就可以从NSXMLDocument中提取想要的原始数据并转换为网格和模型。
还存在能够解析.dae
文件的其他工具。OpenCOLLADA开源软件开发工具包(http://opencollada.org/) 可以解析.dae
文件,并为解析数据或者转换为其他格式提供了一个基础。很多建模工具使用OpenCOLLADA来实现导入和导出。已经使用OpenCOLLADA建立了COLLADAViewer应用的很多版本,不过坦率地说,OpenCOLLADA是庞大的,并且有很多在Mac OSX上不常见的附属库。粗略估计,OpenCOLLADA实现了数千个C++类,这些类分散在1200个不同的源文件中。如果类似C++boost
这样的常见附属库也计算在内的话,建立MaxOSX版OpenCOLLADA
就需要编译由420万行代码组成的2万个C++文件。对于COLLADAViewer来说,使用MacOSX的内建库和Objective-C更合适。
解析.dae
文件的其他选项包括官方但是过时的COLLADA Document Object Model (DOM),网址为http://sourceforge.net/projects/collada-dom/,以及FCollada商业类库。Open Asset Import 库(最有趣的项目之一), 网址为: http://assimp.sourceforge.net/,支持包括COLLADA在内的很多3D模型格式。新项目应该考虑使用Open Asset Import库,部分原因是它会加载模型到一个简单的数据结构中,并且支持用于常见优化的各种后期处理步骤。
COLLADAViewer.app足以把COLLADA文件转换为容易导人iOs应用中的数据,但是COLLADAVewer有一长串的限制。例如,COLLADAViewer会假设每个.dae
文件只包含一个模型。不支持任何的COLLADA库/实例对象。Blender 会自动导出带有适当网格的模型,但是在使用SketchUp时,在你导出COLLADA格式文件之前,你必须要“分解”所有的“组成部分”。在SketchUp中在模型上点击鼠标右键可以看到一个“Explode".上下 文菜单。COLLADAViewer 一次只使用一个纹理图片;因此你必须要把所需的所有纹理图片结合到一个所有模型共享的大的纹理贴图集中。最后导人的模型的纹理图像会替代COLLADAViewer中的所有其他纹理图像。最好的做法是在映射到任何模型之前先使用各种建模工具创建纹理贴图集。当所有模型都使用相同的纹理图像时,它们导入COLLADAViewer的顺序就不再重要了。最后,COLLADAViewer会假设模型的位置在坐标系原点附近。
注意 本书例子中的模型都是以米为单位制作的,但是SketchUp总是转换用户指定的单位为等量的英寸,最后导出以英寸为单位的COLLADA文件。无论在建模工具中使用的是什么单位和方向,COLLADAViewer 都会自动地将模型的方向转换为“Y轴向上”,并把模型缩放为以米为单位。在COLLADAViewer中很难看清尺寸大于几十米或者小于几厘米的模型。同样的,离坐标系原点的距离大于几米的模型在COLLADAViewer中也是看不到的。
图7-2显示的是导人并合并了三个不同的COLLADA文件后的COLLADAViewer应用的屏幕截图。使用鼠标滚轮或者在触摸板上用两个手指拖动来放大和缩小。复选框可以切换参考用的法向量和-Z
坐标轴的显示。例子OpenGLES_Ch7_1重用了第6章的模拟碰碰车,图7-2中显示的是加载的模型。

即使有这些局限性,COLLADAViewer.app仍然为创建-一个综合的MacOSX版COLLADA模型浏览器提供了-一个起点。另-一个例子是XRay,其网址为http://www.hfink.eu/collada/xray,使用了OpenCOLLADA,提供-一个Mac OS X平台的Xcode工程源码。
COLLADAViewer会使用.modelplist
扩展名的文件来保存导人的模型。属性列表(plists) 定义了一个Max OS X和iOs原生的文件格式,详情请查询网址: http://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/PropetyLists。属性列表可以把数据组织到一个结构化的仍然非常有效率的格式中。在Mac OS X和iOS上,应用常常要用到属性列表。例如,系统和应用的用户默认值都是以plist格式的文件保存的。简而言之,plist 文件可以保存序列化的Cocoa或者Cocoa Touch的NSData、NSArray、NSDictionary、NSString. NSDate 和NSNumber对象的层次结构。plist 文件兼容Mac OS X和iOs,因此COLLADAViewer.app在Mac OS X.上创建的modelplist文件可以直接被iOS应用读取(以紧凑的二进制文件的形式)。下一节会讲解在modelplist文件中使用的Cocoa Touch对象的具体层次结构。