首先,需要做好如下的准备工作:
1. 安装一个完整版本的3D MAX与Visual Stdio。
我安装的是3D MAX 2012,最好是找一个完整的版本,因为完整的版本中有很多的学习资料与sdk供学习,很省事。3D MAX的二次开发对VS的要求是有一个对应关系的,在SDK文档中可以找到,3D MAX 2012对应的VS开发版本应该是VS 2010,确保电脑上已经安装了VS 2010,我用的是vs2012,不过一样。
2.定制3D MAX plug-in向导。
a.找到安装目录的3dsmaxPluginWizard文件夹(我的安装目录是C:\Program Files\Autodesk\3ds Max 2012 SDK

\maxsdk\howto\3dsmaxPluginWizard
),
b.打开此目录下的MaxPluginWizard.vsz 文件,编辑ABSOLUTE  PATH参数为:

Param="ABSOLUTE_PATH=C:\Program Files\Autodesk\3ds Max 2012\SDK\maxsdk\howto\3dsmaxPluginWizard"

c.将3dsmaxPluginWizard文件夹下的三个文件3dsmaxPluginWizard.ico、3dsmaxPluginWizard.vsdir、3dsmaxPluginWizard.vsz拷贝到VS 2005安装目录的 VC  Projects 目录下,我电脑上的目录是C:\Program Files\Microsoft Visual Studio 12\VC\vcprojects。
d.启动VS 2012,File-New Project,选择Visual C++就可以看到3ds max Plugin Wizard选项,说明定制成功。
以上只是开发前的一些准备工作,都可以直接在3D MAX SDK的文档中直接找到,不过文档可都是英文的哦,要耐心的读下去。
在以上准备工作做好以后,就可以开始开发一个插件了,由简单到复杂,先做一个简单的插件程序。插件程序的编写有两种方法,一是用插件向导,就是刚才上面所说的;另一种是通过手工创建一个插件项目,在这里暂时只讨论用插件向导来开发,比较便捷,手工开发以后在补上。
1.第一步,生成一个插件程序的工程,具体如下:
a. 打开File —>New Project —>选择3ds max Plugin Wizard,输入project名字,如 “MyExport”。
b. 进入Welcome to the 3ds max Plugin Wizard 画面,选择plugin type如图所示:

c.这里显示各种插件类型,目前要做的是一个文件的导出插件,所以选择FileExport类型。
d.下一步,再出现一个对话框

max sdk的目录里面的框架放到vs目录下,然后新建项目就max的工程选项,方便建工程,少了配置步骤

选择file export,然后 配置路径

class MeshEnumProc : public ITreeEnumProc {
public: MeshEnumProc(const char *name,IScene *scene,Interface *i,DWORD options);
~MeshEnumProc(); int callback(INode *node);
void export(INode *node,TriObject *tri); FILE *file;
IScene *scene;
Interface *i;
int selected; int num_surfaces;
};

写一个类继承自 ITreeEnumProc,这个类有一个EnumTree方法,遍历所有的max场景节点,会调用callback方法

int MeshEnumProc::callback(INode *node)
{
if(selected && node->Selected() == FALSE) return TREE_CONTINUE;
Object *obj = node->EvalWorldState(i->GetTime()).obj;
if(obj->CanConvertToType(Class_ID(TRIOBJ_CLASS_ID,))) {
TriObject *tri = (TriObject*)obj->ConvertToType(i->GetTime(),Class_ID(TRIOBJ_CLASS_ID,));
export(node,tri);
if(obj != tri) delete tri;
}
return TREE_CONTINUE;
}

export方法写保存顶点数据和法线,贴图uv

doexport里面写这个类导出

int    Exp1::DoExport(const TCHAR *name,ExpInterface *ei,Interface *i, BOOL suppressPrompts, DWORD options)
{
//#pragma message(TODO("Implement the actual file Export here and"))
/*
if(!suppressPrompts)
DialogBoxParam(hInstance,
MAKEINTRESOURCE(IDD_PANEL),
GetActiveWindow(),
Exp1OptionsDlgProc, (LPARAM)this);
*/ MessageBox(,"abc","Enter MeshEnumProc",MB_OK);
MeshEnumProc mesh(name,ei->theScene,i,options); return true;
}
const TCHAR *Exp1::Ext(int n)
{
//#pragma message(TODO("Return the 'i-th' file name extension (i.e. \"3DS\")."))
return _T("MiMesh");
}

这个是后缀名

编译完成后生成.dle文件,把它拷贝到max目录下的pugines文件夹 如:D:\Program Files\Autodesk\3ds Max 2012\plugins

3dmax里面编辑模型

导出选择

保存好文件,使用自己的框架加载显示

加入贴图后

Mtl *mat =_node->GetMtl();
if(!mat) //if not have material
return NULL; if(mat->ClassID()!=Class_ID(DMTL_CLASS_ID,))
return NULL;
//yes it's stdmat
StdMat *stdmat =(StdMat *)mat;
Texmap *texmap =stdmat->GetSubTexmap(ID_DI);
if(!texmap||(texmap->ClassID()!=Class_ID(BMTEX_CLASS_ID,)))
return NULL;
BitmapTex *bitmaptex =static_cast<BitmapTex*>(texmap);
const char *fullpath =bitmaptex->GetMapName();

最新文章

  1. js最详细的基础,jquery 插件最全的教材
  2. js截取中英文字符串、标点符号无乱码示例解读
  3. Myeclipese建立servelet时出现带有javax.servlet.http.HttpServlet;变成了红色的解决方法
  4. 谈谈数据监听observable的实现
  5. Nodejs笔记(一)
  6. Drawable
  7. hdu 1541 Stars(树状数组)
  8. hibernate search例子
  9. C++学习——类的继承
  10. Oracle 11g系统自己主动收集统计信息的一些知识
  11. MVVM模式应用 之xml文件的读取
  12. C#隐式执行CMD命令
  13. 用Docker解决坑爹的环境搭建系列——postgresql
  14. Kafka 详解(三)------Producer生产者
  15. 关于TCP和MQTT之间的转换(转载)
  16. 《python3网络爬虫开发实战》第一章、开发环境配置-问题汇总
  17. 基于Clang的缓存型C++编译器Zapcc
  18. ??? cliquers
  19. vc709时钟信号报单端信号错误的记录
  20. 201621123008 《Java程序设计》第二周学习总结

热门文章

  1. 【转】mysqldump的锁表的问题
  2. Android开发(五)——计时器
  3. poj3073
  4. git log 关键字查找
  5. nginx负载均衡和反相代理的配置
  6. SQLSERVER SQL备份还原代码C#
  7. 【css】css 背景色渐变兼容写法
  8. CSS(九):设置盒子水平垂直居中
  9. MVC教程六:视图的寻址
  10. SSM Spring +SpringMVC+Mybatis 整合配置 及pom.xml