万圣节福利:红孩儿3D引擎开发课程《3ds max导出插件初步》

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函数进行相应处理。

点击“退出”时会退出对话框。

使你疲倦的不是前面的高山,而是你鞋里的一粒沙子。

万圣节福利:红孩儿3D引擎开发课程《3ds max导出插件初步》

相关文章:

你感兴趣的文章:

标签云: