3dsmax导出插件将3dsmax中的模型按照自已的需要格式导出,是非常基本和重要的工作。
_PATH为3dsmaxsdk中howto下的3dsmaxPluginWizard目录。
选择三个输入框要求的路径后点击“Finish”,即可生成一个新的导出插件工程。
解决方案中生成的文件如下x64,否则启动程序后3dsmax会提示“不是有效的win32程序”之类的对话框。
然后要将输入文件设为3dsmax下的plugins目录:
之后启动程序,如果提示“无法找到3dsmax.exe的调试信息,或者调试信息不匹配,是否继续调试?”,选择“是”就可以继续调试了。
会发现在程序中收到断点:
按F5后,我们会发现3dsmax也启动起来了,这样,我们的导出插件就被3dsmax加载了。
在3dsmax中创建一个立方体,然后在主菜单里选择“导出”,之后在下拉列表中可以看到有一个(*)的奇怪文件格式,那就是我们当前调试中的导出插件所对应的文件格式,因为还没有为导出插件设置导出文件信息,所以默认为空。
输入一个文件名并确定后,会进入到maxProject1::DoExport函数,这个函数即是场景导出插件类maxProject1在3dsmax进行文件导出时被调用的函数了,它将是我们3dsmax导出插件编程的入口函数。
按F5略过断点后,我们可以看到弹出了一个对话框:
这个就是我们导出插件的默认导出设置对话框,它对应maxProject1.rc中的IDD_PANEL对话框资源。
通过修改这个对话框资源,我们可以在导出时进行相应的设置。 下面,我们就来尝试导出一个简单的模型。四.导出一个简单的模型到文件中:
首先,我们先修改一下设置对话框,改成这样:
一个模型名称的输入框,,一个显示信息的列表框和响应“导出”和“退出”的按钮。
然后我们在场景导出插件类maxProject1中增加一些变量保存DoExport函数传入的参数指针变量。
private:ExpInterface*m_pExpInterface;//导出插件接口指针Interface*m_pInterface;//3ds max接口指针BOOLm_exportSelected;//是否只导出选择项charm_szExportPath[_MAX_PATH];//导出目录名
并增加一个导出场景的处理函数:
//导出模型intExportMesh(const char* szMeshName);
对应函数实现:
int maxProject1::ExportMesh(const char* szMeshName){return 0;}
在构造函数中进行置空设置,并在maxProject1::DoExport中加入
int maxProject1::DoExport(const TCHAR *name,ExpInterface *ei,Interface *i, BOOL suppressPrompts, DWORD options){#pragma message(TODO("Implement the actual file Export here and"))//保存变量strcpy(m_szExportPath,name);m_pExpInterface = ei;m_pInterface = i;m_exportSelected = (options & SCENE_EXPORT_SELECTED);…
我们可以看到
if(!suppressPrompts)DialogBoxParam(hInstance,MAKEINTRESOURCE(IDD_PANEL),GetActiveWindow(),maxProject1OptionsDlgProc, (LPARAM)this);
我们想做到点一下点击“确定”就导出模型,点击“取消”就退出对话框。首先需要在maxProject1.cpp头部增加:
#include "resource.h"//列表框句柄HWNDG_hListBox = NULL;//输出字符串到列表框voidAddStrToOutPutListBox(const char* szText){if( G_hListBox ){SendMessage(G_hListBox,LB_ADDSTRING,0,(LPARAM)szText);}}imp = (maxProject1 *)lParam;CenterWindow(hWnd,GetParent(hWnd));G_hListBox = ::GetDlgItem(hWnd,IDC_LIST1);// 得到文件名std::string strPathName = imp->GetExportPathName() ;std::string strFileName;std::string::size_type pos1 = strPathName.find_last_of(‘\\’);std::string strFileName_NoExt;if (pos1 != std::string::npos){strFileName = strPathName.substr(pos1+1);}else{strFileName = strPathName;}//去掉扩展名std::string::size_type pos2 = strFileName.find_last_of(‘.’);if (pos2 != std::string::npos){strFileName_NoExt = strFileName.substr(0, pos2);}else{strFileName_NoExt = strFileName ;}//将字符串设为模型名HWND hNameEdit = ::GetDlgItem(hWnd,IDC_EDIT1);SetWindowText(hNameEdit,strFileName_NoExt.c_str());case WM_COMMAND:{switch(wParam){case IDC_BUTTON1:{if(imp){HWND hNameEdit = ::GetDlgItem(hWnd,IDC_EDIT1);char szMeshName[64];GetWindowText(hNameEdit,szMeshName,64);//导出场景imp->ExportMesh(szMeshName);}}break;case IDC_BUTTON2:{//退出对话框EndDialog(hWnd, 0);return 0;}break;}}break;
这样输入模型名称后点击“确定”,我们将调用ExportMesh函数进行相应处理。
点击“退出”时会退出对话框。
使你疲倦的不是前面的高山,而是你鞋里的一粒沙子。