3DS Max 2010简单导出插件开发(实例开发)

本文介绍了如何使用3DS Max 2010 SDK开发导出插件,以导出符合特定需求的模型格式。首先,设置开发环境,了解模板结构,特别是DoExport函数的作用。接着,通过ITreeEnumProc接口枚举场景元素,遍历并导出INode。在callback函数中,利用INode::EvalWorldState获取对象状态,通过SuperClassID判断对象类型,如几何对象、相机和灯光。导出基本几何信息时,利用ConvertToType转换为TriObject,获取Mesh信息并写入文件。此外,文章还涉及了平滑组、渲染信息、材质和纹理坐标等高级导出内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

适用平台: VS2008 + 3dsmax 2010

         模型对于一个游戏引擎来说至关重要,而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())

              {

        &

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值