我盡量把話題說的通俗易懂一點,因為要做外掛程式的可能不只是程式設計師:)
如果你想快速寫外掛程式,通常使用 maxsdk提供的 vc wizard 最容易建立乙個特定的外掛程式框架程式.這裡簡單說一下設定 3dsmax vc wizard 的方法:
安裝了3dsmax product以後,還要安裝maxsdk,sdk和大量的sample在***完整安裝版本上,pluginwizard 的路徑在autodesk/3ds max 2009 sdk/maxsdk/howto/3dsmaxpluginwizard下面,裡面有readme.txt檔案,大意是這樣的:用文字編輯器開啟3dsmaxpluginwizard.vsz,我裝的是3dsmax2009,開啟這個vsz檔案的內容如下:
vswizard 7.0
wizard=vswizard.vswizardengine.8.0
param="wizard_name = 3dsmaxpluginwizard"
param="absolute_path = c:/dev/p4/gouda/3dswin/src/maxsdk/howto/3dsmaxpluginwizard"
param="fallback_lcid = 1033"
把absolute_path 的路徑改為 d:/autodesk/3ds max 2009 sdk/maxsdk/howto/3dsmaxpluginwizard,就是你複製檔案的原路徑
這個時候用vc8 新建 project ,選擇vc++,會看到乙個 3ds max plugin wizard 列表項,然後按照提示一步一步操作就能建立乙個基本的外掛程式框架.
這裡我要多說一點的是用自定義dll project方法建立3dsmax plugins的方法,我本人不太喜歡用現成的東西,凡事總喜歡自己親手做來的東西,這樣理解的也比較深刻透徹
3dsmax外掛程式,有幾個標準的可匯出函式,3dsmax.exe裝載外掛程式時,用getprocaddress api找出預定的幾個標準介面,然後呼叫乙個libclassdesc的介面,建立出使用者自定義的物件例項,類似於"抽象廠"方法
3dsmax 外掛程式中必須定義的標準匯出函式:
#define dllexport_api __declspec(dllexport)
//外掛程式描述
dllexport_api const tchar* libdescription()
//這個dll中有幾個外掛程式
dllexport_api int libnumberclasses()
//取得外掛程式描述塊,3dsmax.exe用它來建立你的外掛程式類的例項
dllexport_api classdesc* libclassdesc(int i)
} //libversion用來匹配外掛程式和宿主3dsmax.exe之間的版本匹配問題.
dllexport_api ulong libversion()
關於如何在vc中建立dll project,不需要多說了,要說的一點就是匯出函式必須用 _declspec(dllexport) 修飾,另外還需要在def檔案中列出匯出函式的名字如下:
假定乙個匯出外掛程式的檔名是sampleexporter
//sampleexporter.def
library sampleexporter
exports
libdescription @1
libnumberclasses @2
libclassdesc @3
libversion @4
sections
.data read write
下面著重說getmyclassdesc() 這個函式...
#define sampleexporter_class_id class_id(0xc2a1ee34, 0x832cc295) //這個class_id用autodesk/3ds max 2009 sdk/maxsdk/help/getcid.exe 自己生成,只要不存在衝突就可以.
//sampleexporter 是從sceneexport 繼承的匯出外掛程式類,sceneexport是sdk預定義的用於實現匯出外掛程式的基類,使用者寫匯出外掛程式,只需要繼承它,然後實現相應的純虛介面即可.
//匯入外掛程式基於sceneexport,輔助外掛程式基於utilityobj,還有建立面板上的,詳見3ds max sdk programmer'sguide中的type of plug-ins 介紹.
//函式doexport是3dsmax.exe和匯出外掛程式互動的主要介面,選擇file/export選單,然後選擇sampleexporter後,將會進入doexport函式...
class sampleexporter : public sceneexport ;
//3dsmax.exe如何與使用者自定義的外掛程式建立起聯絡,就是通過下面這個classdesc類來獲得建立外掛程式物件例項所需要的必要的資訊
class sampleexporterclassdesc: public classdesc2
virtual void* create(bool /*loading = false*/) //這裡其實就是"抽象廠"方法,讓使用者提供乙個例項
virtual const tchar * classname()
virtual sclass_id superclassid()
virtual class_id classid()
virtual const tchar* category()
virtual const tchar* internalname() // returns fixed parsable name (scripter-visible name)
virtual hinstance hinstance() // returns owning module handle
};static sampleexporterclassdesc expoertdesc;
classdesc2* getmyclassdesc()
//下面是sampleexporter類的實現**
sampleexporter::sampleexporter()
sampleexporter::~sampleexporter()
int sampleexporter::extcount()
const tchar *sampleexporter::ext(int n)
const tchar *sampleexporter::longdesc()
const tchar *sampleexporter::shortdesc()
const tchar *sampleexporter::authorname()
const tchar *sampleexporter::othermessage1()
const tchar *sampleexporter::othermessage2()
unsigned int sampleexporter::version()
void sampleexporter::showabout(hwnd hwnd)
bool sampleexporter::supportsoptions(int ext, dword options)
//這裡是真正的匯出函式入口,使用者選擇匯出後,將執行到這裡
int sampleexporter::doexport(const tchar *name,expinte***ce *ei,inte***ce *i, bool suppressprompts, dword options)
至此乙個基本的外掛程式框架就搭建起來了,剩下的就是要遍歷場景節點,實現你自己的資料匯出功能了
(完)
3ds max 匯出外掛程式開發後記
一直以來。3ds max 匯出外掛程式的開發這部分對我都是神秘的黑盒子。直到乙個月前,不得不去做這個事,我才開始一步步走近他。通過網路上的只言片語和 揣摩。終於在兩周的時間搞定了匯出外掛程式和骨骼動畫的檢視器。我用的vs2005進行開發。對應 3ds max 2008sdk,3ds max 2009...
3ds max 匯出外掛程式開發後記
一直以來。3ds max 匯出外掛程式的開發這部分對我都是神秘的黑盒子。直到乙個月前,不得不去做這個事,我才開始一步步走近他。通過網路上的只言片語和 揣摩。終於在兩周的時間搞定了匯出外掛程式和骨骼動畫的檢視器。我用的vs2005進行開發。對應 3ds max 2008sdk,3ds max 2009...
3DS MAX外掛程式開發(1) 開發環境配置
開發3dsmax外掛程式必備 vs2005或2008,3ds max 2009 當然不一定是這個版本 3ds max 2009 sdk,3ds max 2009 sdk helper。參照helper getting start installing the plug in wizard一章即可完成...