3dsMax7数据导出方法及存在问题
作者:卢立祎 来自:愤怒的犬夜叉
1Zb2`(e6m;n0s"n0 在游戏开发过程中需要大量的模型数据来描述人物、建筑、场景,如果开发编辑器来编辑网格、顶点,代价太大,因此往往利用一些现成的3D建模软件来代替。
_|G+Yx9A"g0图腾cg博客rK.V3v9XA u
使用 3dsMax7 进行模型、动画数据导出是3D引擎开发过程中的一个必然环节(或者使用Maya等类似的3D建模工具)。然而discreet公司在指导用户进行二次开发的方面做得并不是太好,有一些问题是在开发过程中会常常遇到。图腾cg博客9r;p\
w3w
#C+[1g/m]
L2o$@$al0 美术工作人员在3dsMax环境中编辑好了三维人物或物体,加入了动作动画,指定了渲染方式,编辑了贴图和UV坐标之后,我们就必须想方设法把这类数据从编辑环境中导出成文件以供引擎使用。一般来说,最主要有三种方式来取得需要的数据:图腾cg博客r{+r9s&Jxr
图腾cg博客#k?un)@7\ x
1. 利用已有的导出格式取得数据图腾cg博客O.u%N
w)eLC
3G[h7Yk,zI02. 制作max的export插件输出数据
BLst(U*TvF
L^0图腾cg博客u{_@M/Jti.{U
3. 编写maxscrīpt输出数据图腾cg博客"i"kV^lb3B,o
图腾cg博客[yNE F
Gg]1o0~0利用已有的导出格式取得数据图腾cg博客T&ZB`cfi's [{&e
使用3ds文件和xml文件作为导出源文件,然后直接在引擎中读取数据转化为自己定义的数据格式。一般来说会使用一些转换工具转换为更加高效的文件格式。比如在早期的MS DirectX SDK 中,就有一个convert3DS 的工具,把3ds格式的文件转换为D3DX使用的X文件。由于这种方式受到源文件信息固定的限制,渐渐的不被采用。DirectX SDK 也开始使用插件的方式导出数据。图腾cg博客'OI+AV4[nt mB)j
v3M"j-wq8U0 Max7中,在菜单文件中选择导出,可以看到“IGame Exporter”,可以导出XML格式的文本文件,由于现在解析XML文件已经非常简单,甚至可以用序列化直接映射到数据结构,因此此方法有一定的使用价值。
T\
|&x:oE"dB0
pKW'}0e!z~P^0
a]II/T{_Dgx0制作max的export插件输出数据图腾cg博客3IF4} Oq7b T1tu
使用maxSDK进行插件开发是大家普遍采用的方法,网上也可以查到相关的很多资料。在3dsmax7的目录中,可以找到maxsdk的目录,其中的help目录可以找到一些使用和开发帮助:
`ve\h1{;Im YL0图腾cg博客3a8P7mj(ak
1. Sdk.chm
?*E'Qs&IE6e%Jx)j_0图腾cg博客j+H1|]-axo'Z
SDK的帮助文件。版本为6。个人感觉无论从整体结构还是编排都很糟糕,很难再非常快的时间内找到你想要的资料。图腾cg博客"z8Q,H/PEa
v_
图腾cg博客 B,WH? Pq`^z"L,o#a%q
如果要使用CS(Character Studio)的功能,就必须包含Include\CS目录下的头文件,以前max版本必须先安装CS的SDK才可以使用此功能,在max7中,CS已经成为了max的一个标准组件,因此CS SDK的部分也已经在max SDK中包含。图腾cg博客:B+_]|
A
v@Ju$m$K
图腾cg博客$O%Yimf8b
[q#J$T
Max7包含的CS的版本号为4.2。图腾cg博客Q(s0t a!vA
o&j.a
图腾cg博客e~#Xc"~
2. IGameHelp.chm
}'a.n)rV Yk!U0图腾cg博客ZqIw]0L
g0Ee4e
Discreet提供了一套IGame的接口用来导出一般游戏制作需要导出的数据。“IGame Exporter”就是使用了此接口。可以在maxsdk\samples目录下找到这个插件的源代码。
'VF4j8]R
O2l0
{-O.R/UkB] sf^]0 DirectX9提供的max插件也是使用了IGame接口导出数据,可以在DirectX SDK中的\Utilities\Source\Max找到此插件的源代码以供参考。
c4\;h$o(p!WM0图腾cg博客n
NRX&Uu$dEr
IGameHelp.chm是使用Doxygen(http://www.doxygen.org/)自动生成的文档文件,因此使用和查找习惯于Doxygen通用生成格式相同。图腾cg博客P0Ot]tXUj
图腾cg博客9Y {MMf{6R
其中的IGameSkin已经自动包含了Skin和Physique两种Modifier,无须分别写两套处理代码。图腾cg博客f PcKR5r z-m`8i@%e;n
图腾cg博客K?
B4E1sILQ*F
Max7自带的IGameInterface版本号为1.121。
v&e+DYR0图腾cg博客
@yD_'Q5E]6Dd
3. sparks_archive.chm
:K3k+~}&pw8}
u0
T uC
gF'e|*CZ0 sparks是max的一个讨论站点,在里面可以找到很多你需要的问题的答案,sparks_archive.chm可以自动更新到最新,但是我从来没有更新成功过。
L/P#GD:J'D$b|R0图腾cg博客5yk"cx)hNdr
c$to!QSF!St/Re0图腾cg博客:m`"MgYO"k/{
此外,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这一项。
m+` eS!W
J0图腾cg博客mt(}mgI;p
如果要在VC6上编译max7的插件,还需要对一个头文件作一点小小的修改:在文件include\istdplug.h文件的第1685行:
Q0`T w_%v-f}-t0
7R
u1R
p1?9RKUSy'l)q0typedef struct { 改为: typedef struct Options{图腾cg博客2R$RWjq4S] Bs
图腾cg博客!P@Lg*d&u+q5r
1708行:图腾cg博客x]U)I2L*@,I|'H
NSl-`FX!p0class Options2: public Options 改为:class Options2: public IAssignVertexColors::Options图腾cg博客}?l pJ5zC'}^
图腾cg博客 n}:P~-W/WIS
这都是因为VC6编译器无法对匿名结构进行继承。
@5hq9Ob)a"E+Q ]2\N_%I3S2^0
5_P&E%K&Q0 当然,也可以选择使用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。
/mA9d w%n0
r|E:Um/k_0
_$`/j%Z0f*\0 使用插件导出数据有一个很大的弊端:在插件编写调试过程中,经常要重新重新启动max,浪费了不少时间,这一点无法与maxscrīpt相比。图腾cg博客j6pco8k v qz0v2u
图腾cg博客j.v,Jk*I1F
m:m5x @Noz0编写maxscrīpt输出数据