关键字:3D 3dsmax7 插件 maxscript 3dmaxSDK 游戏开发
在游戏开发过程中需要大量的模型数据来描述人物、建筑、场景,如果开发编辑器来编辑网格、顶点,代价太大,因此往往利用一些现成的3D建模软件来代替。
使用 3dsMax7 进行模型、动画数据导出是3D引擎开发过程中的一个必然环节(或者使用Maya等类似的3D建模工具)。然而discreet公司在指导用户进行二次开发的方面做得并不是太好,有一些问题是在开发过程中会常常遇到。
美术工作人员在3dsMax环境中编辑好了三维人物或物体,加入了动作动画,指定了渲染方式,编辑了贴图和UV坐标之后,我们就必须想方设法把这类数据从编辑环境中导出成文件以供引擎使用。一般来说,最主要有三种方式来取得需要的数据:
1. 利用已有的导出格式取得数据
2. 制作max的export插件输出数据
3. 编写maxscript输出数据
利用已有的导出格式取得数据
使用3ds文件和xml文件作为导出源文件,然后直接在引擎中读取数据转化为自己定义的数据格式。一般来说会使用一些转换工具转换为更加高效的文件格式。比如在早期的MS DirectX SDK 中,就有一个convert3DS 的工具,把3ds格式的文件转换为D3DX使用的X文件。由于这种方式受到源文件信息固定的限制,渐渐的不被采用。DirectX SDK 也开始使用插件的方式导出数据。
Max7中,在菜单文件中选择导出,可以看到“IGame Exporter”,可以导出XML格式的文本文件,由于现在解析XML文件已经非常简单,甚至可以用序列化直接映射到数据结构,因此此方法有一定的使用价值。
制作max的export插件输出数据
使用maxSDK进行插件开发是大家普遍采用的方法,网上也可以查到相关的很多资料。在3dsmax7的目录中,可以找到maxsdk的目录,其中的help目录可以找到一些使用和开发帮助:
1. Sdk.chm
SDK的帮助文件。版本为6。个人感觉无论从整体结构还是编排都很糟糕,很难再非常快的时间内找到你想要的资料。
如果要使用CS(Character Studio)的功能,就必须包含Include\CS目录下的头文件,以前max版本必须先安装CS的SDK才可以使用此功能,在max7中,CS已经成为了max的一个标准组件,因此CS SDK的部分也已经在max SDK中包含。
Max7包含的CS的版本号为4.2。
2. IGameHelp.chm
Discreet提供了一套IGame的接口用来导出一般游戏制作需要导出的数据。“IGame Exporter”就是使用了此接口。可以在maxsdk\samples目录下找到这个插件的源代码。
DirectX9提供的max插件也是使用了IGame接口导出数据,可以在DirectX SDK中的\Utilities\Source\Max找到此插件的源代码以供参考。
IGameHelp.chm是使用Doxygen(http://www.doxygen.org/)自动生成的文档文件,因此使用和查找习惯于Doxygen通用生成格式相同。
其中的IGameSkin已经自动包含了Skin和Physique两种Modifier,无须分别写两套处理代码。
Max7自带的IGameInterface版本号为1.121。
3. sparks_archive.chm
sparks是max的一个讨论站点,在里面可以找到很多你需要的问题的答案,sparks_archive.chm可以自动更新到最新,但是我从来没有更新成功过。
此外,max7依旧提供了一套Ravi K Karra编写的VC6的3ds max Plugin Wizard,可以自动生成所需要的插件框架,很可惜,版本还是R5,搭配max7的SDK会有一些小问题。把文件\MAXSDK\HELP\SDKAPWZ.ZIP拷贝到VistualStudio的模版目录中(比如:\Microsoft Visual Studio\Common\MSDev98\Template),解压缩zip文件,VC6的新建模版中就会出现max Plugin Wizard这一项。
如果要在VC6上编译max7的插件,还需要对一个头文件作一点小小的修改:在文件include\istdplug.h文件的第1685行:
typedef struct { 改为: typedef struct Options{
1708行:
class Options2: public Options 改为:class Options2: public IAssignVertexColors::Options
这都是因为VC6编译器无法对匿名结构进行继承。
当然,也可以选择使用VC7\7.1进行Plug编写。可以在 http://sparks.discreet.com/downloads/downloadshome.cfm?f=2&wf_id=134 下载到3ds max 6 and 7 Plugin Wizard for Visual Studio 7。
使用插件导出数据有一个很大的弊端:在插件编写调试过程中,经常要重新重新启动max,浪费了不少时间,这一点无法与maxscript相比。
编写maxscript输出数据
使用maxscript进行数据输出是现在我手头项目的使用方法,使用简单、调试方便,每次有了改动不用重新启动3ds max。可以在帮助菜单内找到MAXScript Reference 7.0。maxscript可以操作max编辑环境内的所有的对象,并且可以通过plugin来增加功能与接口(插件的gup类型)。Max还内置了一个脚本编辑器,有语法高亮功能(到处是Bug!),建议使用EditPlus等文本编辑软件来编写脚本,并且可以在http://www.editplus.com/files/maxscript.zip 下载到最新的EditPlus的maxscript语法高亮配置文件。
Max7内置的Visual MaxScirpt编辑器可以方便的编辑界面,所见即所得,很方便,但是附带的方法编辑器同样非常难用,建议使用外部编辑。
如果需要导出Character Studio数据,需要注意一些问题。
Character Studio包含Biped、Physique和群组三个组件,一般我们会用到前两个。
Biped是CS中主要的和最受认可的组件,它是用与类人角色的通用装备,但同时又足够灵活,可以进行自定义以适合各种不同形状的角色。在MAXScript Reference 7.0中的MAXScript Extensions中可以找到相应扩展各种使用方式的介绍和范例。
Physique是类似于“蒙皮”的修改器,但它有额外的功能以更好的控制基本骨骼影响网格的方式。当使用Biped时,不需要Physique。它只是一种可选的蒙皮系统,也可以使用编准的“蒙皮”修改器。虽然在MAXScript Reference 7.0也有对Physique扩展方法的介绍以及范例,但是遗憾的是,Discreet并没有在Max7种实现它(这一点非常奇怪,有了说明却没有实现。据说在Max8中,这个扩展已经被删除)。如果在脚本中使用了此扩展,运行时会报告undefined。因此,我们必须手动实现此扩展,编写扩展的plugin。幸好已经有人把这个扩展导出插件写好,名字叫IPhysique,网上可以搜索到IPhysique.zip或者IPhysique.gup这个文件,把它拷贝到max的plugins目录下就可以了。因为这个导出方法和Reference中的方法不兼容,因此需要阅读自带的IPhysique.doc文档,里面大致介绍了各种函数方法的使用。在使用的时候,不要忘记在函数调用前加上physiqueOps前缀,比如physiqueOps.getPhysiqueModifier。但是要注意的是:网上下载的IPhysique.gup有不同的版本,一般来说是for max5.1的,无法在max7中使用,因此,可以有两个选择来解决这个问题:
下载源代码,重新在maxSDK7下编译。源代码地址:
http://sparks.discreet.com/downloads/downloadshome.cfm?f=2&wf_id=130
有人已经把它在maxSDK7下编译生成了二进制文件。下载地址:
http://sparks.discreet.com/downloads/downloadshome.cfm?f=2&wf_id=146
这样,就可以很方便的使用Physique的功能进行数据导出了。
总结
总的来说,使用maxscript来进行数据导出是一个比较好的选择,无须编译、无须重启max,方便调试。
http://sparks.discreet.com/downloads/downloadshome.cfm?f=2&wf_id=130
有人已经把它在maxSDK7下编译生成了二进制文件。下载地址:
http://sparks.discreet.com/downloads/downloadshome.cfm?f=2&wf_id=146
这样,就可以很方便的使用Physique的功能进行数据导出了。
总结
总的来说,使用maxscript来进行数据导出是一个比较好的选择,无须编译、无须重启max,方便调试。