• 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 FilesAutodesk3ds Max 2012 SDK

    maxsdkhowto3dsmaxPluginWizard
    ),
    b.打开此目录下的MaxPluginWizard.vsz 文件,编辑ABSOLUTE  PATH参数为:

    Param="ABSOLUTE_PATH=C:Program FilesAutodesk3ds Max 2012SDKmaxsdkhowto3dsmaxPluginWizard"

    c.将3dsmaxPluginWizard文件夹下的三个文件3dsmaxPluginWizard.ico、3dsmaxPluginWizard.vsdir、3dsmaxPluginWizard.vsz拷贝到VS 2005安装目录的 VC  Projects 目录下,我电脑上的目录是C:Program FilesMicrosoft Visual Studio 12VCvcprojects。
    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 FilesAutodesk3ds Max 2012plugins

    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();

  • 相关阅读:
    shell脚本计算斐波那契数列
    SQL查询出某字段不等于某值的行(其中有为NULL的字段)
    如何修改和关闭1433端口
    SqlServer 数据库日志无法收缩处理过程
    人生的抉择—aspx、ashx、asmx文件处理请求效率比较
    HTTP 错误 500.21
    如何使用快照来初始化化请求订阅
    怎么改svn的登陆账号
    更换用installshield打包生成exe文件的图标【转】
    win10下怎么在桌面创建IIS快捷方式
  • 原文地址:https://www.cnblogs.com/dragon2012/p/4337597.html
Copyright © 2020-2023  润新知