最近由于工作需要,开始深入的研究MAX导出插件,在此做一点学习笔记和大家分享交流....
其实MAX的SDK说大也大,说小也小.....虽然说MAX那么多类那么多接口,但实际上如果是开发导出插件的话.....至少有70%以上的DLLEXPORT类都是用不上的.....而在这些用的上的类里面,Set一族函数也是没有用的.....虽然说网上的资料很少,只要耐心的啃SDKHELP,基本上还是可以满足自己的功能的.....在此提一些之前学习MAXSDK中的一些经验和教训..
1.MAX中的坐标系和DX不一样,需要交换Y和Z..
2.MAX中FACE的索引顺序和DX中的索引顺序是相反的...
3.MAX中遍历整个模型必须是通过面的遍历,首先获取每个"面"中的每个顶点的索引,以及每个"纹理面"中的每个纹理顶点的索引,然后你可以通过一个MAP表来建立关系,然后再通过MESH中的GETVERT和GETTVERT来传入"面"和"纹理面"的索引,来获取顶点坐标和纹理坐标,至于你要说,如果遇到一个顶点对应了多个纹理坐标怎么办...那只有在程序中手动的去把这个顶点拆成两个顶点,并且自己去添加索引序号...
好了,接下来到重点了...关于材质动画的导出
这里还是描述一下我这里所谓的材质的概念...基本上和OGRE的材质的概念差不多...但这里我所导出的实质上就是MATERIAL中的一个PASS...主要因为在我的FUNK引擎中并没有用到MATERIAL->TECH->PASS的概念,而是直接使用了PASS,主要是因为那样的框架比较复杂,而且也并不是那么的实用...而且我这里没有用到多PASS,那样的结构实在是又不实用又麻烦,因为个人认为做多PASS还是直接用SHADER吧....
我们要实现的目标就是导出每帧(我没有做关键帧)的纹理坐标,漫反射材质,镜面光材质,ALPHA信息
提供一些我编码中的一些接口供大家参考...
MtlBase:基础材质类,这个类中可能没有你需要导出数据的接口,但是,贴图类,材质类,标准材质类等都是从这个类中派生出来的...
Mtl:材质类,如果你是一个对敏感的图形程序员,你就会发现这里有你需要的接口了,类似GetAmbient,GetDiffuse之类的接口,没错,你的猜测没错,这里就可以导出环境光,漫反射光之类的数据了...但是这远远不够,我们需要的是动画啊,在GetAmbient的参数里面没有看到TimeValue,不要急,往下面看...
StdMat:标准材质类,哈哈,在SDK中查找这个类的接口后,你就发现
之类的好东西了,材质动画的入口我们已经找到了...你会说,纹理呢?纹理在哪儿??不要急...且听下回分解!
哎...累啊!明天还要加班!哥先去睡咯!
P.S. 由于代码还没写完!暂时没图!哈哈哈!