max導出模型插件


首先,需要做好如下的准備工作:
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,0))) { 
        TriObject *tri = (TriObject*)obj->ConvertToType(i->GetTime(),Class_ID(TRIOBJ_CLASS_ID,0));
        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(0,"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,0))
            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,0)))
            return NULL;
        BitmapTex *bitmaptex =static_cast<BitmapTex*>(texmap);
        const char *fullpath =bitmaptex->GetMapName();

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM