模型对于一个游戏引擎来说至关重要,而3DS Max是主流的建模软件,但其中的模型格式不一定适合你的要求,开发一个适合你要求的模型格式是开发游戏引擎的第一步,现在我们来介绍如何使用3DS Max 2010的导出插件导出你自己的格式.
基础介绍:
首先,你必须保证你的开发环境,详情请看<使用VS2008进行3DS Max2010 SDK插件开发(环境配置)>这篇文章.
接着我们来了解一下开发模板的结构.我们做导出插件大部分导出操作都是在DoExport这个函数下工作的.其中参数name为你要导出的文件的全路径, ExpInterface *ei为导出插件的接口指针,Interface *i为3DS Max的接口指针,后面两个参数暂时可以忽略.而我的导出操作可以通过ExpInterface *ei和Interface *i来完成.当DoExport返回S_FALSE时3DS Max会显示”导出模块失败”的提示,返回S_OK不作任何提示.
3DS Max的场景是通过INode来管理的,获得所有Node就等于我们可以获得整个场景的所有元素,包括几何物体,相机,灯光,材质等等.而我们可以通过ITreeEnumProc这个接口来完成这项工作. ITreeEnumProc接口用途如其名,就是枚举整个场景的元素,我们可以通过继承该接口,重载里面的callback函数来完成枚举操作.callback函数有一个参数是INode *node,node就是我们需要的对象,如上面所说的,node包含了一个节点的所有几何信息,渲染信息等等.
例子:
class Max_SceneEnum : public ITreeEnumProc
{
public:
Max_SceneEnum();
~Max_SceneEnum();
int callback( INode *node );
};
声明场景枚举树后,我们需要将场景枚举树与导出插件接口相连接,我们在DoExport中连接它们:
int DoExport(const TCHAR *name,ExpInterface *ei,Interface *i, BOOL suppressPrompts, DWORD options)
{
Max_SceneEnum etProc;
ei->theScene->EnumTree(&etProc);
}
这样,当运行dle插件时, ITreeEnumProc就会自动列举所有node,并将node作为参数传递给ITreeEnumProc,这样导出工作变成了对每个节点进行导出操作,也就是实现callback函数了.
基本信息导出:
先介绍一下几个重要的函数.
INode::EvalWorldState函数,我们可以通过这个函数获取节点INode的状态ObjectState. ObjectState中的成员obj包含了所有关于INode的所有信息,包括几何类型,材质索引,SuperID等等信息.
int callback( INode *node )
{
ObjectState os = node->EvalWorldState(time);
//如果能转换为三角形几何
if(os.obj->CanConvertToType(Class_ID(TRIOBJ_CLASS_ID,0)))
{
//输出三角形几何的ID
_cprintf("TRIOBJECT %s\n", node->GetName());
//获取节点材质
Mtl *pMtl = node->GetMtl();
//如果材质存在
if(pMtl)
_cprintf("MATERIAL %s\n",pMtl->GetName());
return TREE_CONTINUE;
}
//处理非几何要素
if(os.obj)
{
//根据其SCID
switch (os.obj->SuperClassID())
{
&