插件的使用:
在 MAX 中安装插件以后,如果你对这个插件不是很熟悉的话,找到它恐怕也要费一番周折。通常你可以根据插件的类型(可以参考上面的表格),在 MAX 的不同位置发现它。
建模类插件(DLO),在建立命令面版能够找到它,根据类型不同分别归属与不同的建立项目中;
修改器类插件(DLM):这类插件在修改命令面版中(Modify)。但是要注意有些修改器插件可能是针对特定的场景对象类型,因此必须选择与之相对应的对象才能显示该修改器;
渲染效果类插件(DLR):可以在 Environment 面版的添加效果中找到:
外挂渲染器可以在渲染设置面版找到:
输入输出类插件(DLI/DLO):在文件菜单的输入/输出项目中的文件类型中;
材质贴图类插件(DLT):一般可以通过材质贴图浏览器来使用。
视频效果类插件(FLT):在视频通道设置面版的添加效果中;
特殊用途类插件(DLU):在 MAX 的系统工具面版:
导出插件(dle): 一般游戏引擎写的导出3dmax 资源个 插件
想想研究3D MAX 的SDK已经有了不短的时间,真正算起来也有两个月了吧,但是讲到收获,确实不大。作为一个3D MAX二次开发的学习者,我首先学习了导出插件的编写,网上有很多参考资料,写的都差不多,可是都是写到关键的地方或者说比较模糊的地方就说不清楚了,今天我就结合自己所做的工作来讲讲3D MAX导出插件的编写心得。
首先,需要做好如下的准备工作:
1. 安装一个完整版本的3D MAX与Visual Stdio。我安装的是3D MAX 2009,最好是找一个完整的版本,因为完整的版本中有很多的学习资料与sdk供学习,很省事。3D MAX的二次开发对VS的要求是有一个对应关系的,在SDK文档中可以找到,3D MAX 2009对应的VS开发版本应该是VS 2005,确保电脑上已经安装了VS 2005。
2.定制3D MAX plug-in向导。
a.找到安装目录的3dsmaxPluginWizard文件夹(我的安装目录是C:\Program Files\Autodesk\3ds Max 9 SDK
\maxsdk\howto\3dsmaxPluginWizard),
b.打开此目录下的MaxPluginWizard.vsz 文件,编辑ABSOLUTE PATH参数为:
Param="ABSOLUTE_PATH=C:\Program Files\Autodesk\3ds Max 9\SDK\maxsdk\howto\3dsmaxPluginWizard"
1,在Program Files\maxsdk\howto\3dsmaxPluginWizard中的readme.txt有配置方法
<1>打开3dsmaxPluginWizard.vsz修改如下:
VSWIZARD 7.0
Wizard=VsWizard.VsWizardEngine.9.0 //9.0是必要的,没有这个无法开启导航
Param="WIZARD_NAME = 3dsmaxPluginWizard"
Param="ABSOLUTE_PATH = F:\Program Files\maxsdk\howto\3dsmaxPluginWizard"//这里是当前2010sdk的文件夹(注意文件路径不能有空格)
Param="FALLBACK_LCID = 1033"
<2>将以下的3个文件放到VS的vcprojects(Program Files\Microsoft Visual Studio 8\VC\vcprojects)中
3dsmaxPluginWizard.ico
3dsmaxPluginWizard.vsdir
3dsmaxPluginWizard.vsz
在readme.txt完成后还要做以下几步:
<3>将max安装目录Autodesk\3ds Max 9 SDK\maxsdk\howto\3dsmaxPluginWizard下3dsmaxPluginWizard.vcproj文件及Autodesk \3ds Max 9 SDK\maxsdk\howto\3dsmaxPluginWizard\Templates\1033下root.vcproj文件里的 Version="8.00"改为Version="9.00";
<4>将max安装目录Autodesk\3ds Max 9 SDK\maxsdk\howto\3dsmaxPluginWizard下3dsmaxPluginWizard.vsz文件中 Wizard=VsWizard.VsWizardEngine.8.0改为Wizard=VsWizard.VsWizardEngine.9.0
<5>编译的时候可能会出现如下错误:
1>cl : Command line warning D9035 : option 'Wp64' has been deprecated and will be removed in a future release
1>cl : Command line error D8022 : cannot open 'D:\Program'
修改方法:Properties->C/C++->Command Line->Addition Options去掉:/LD @D:\Program Files\Autodesk\3ds Max 2009SDK\maxsdk\ProjectSettings\AdditionalCompilerOptions.txt
重新编译即可完成。
}
其实其中5、的错误,是由于SDK的安装路径中含有空格符号,这个问题在官方的视频教程中已有提到。解决的方法是:
Properties->C/C++->Command Line->Addition Options 将 /LD @D:\Program Files\Autodesk\3ds Max 2009SDK\maxsdk\ProjectSettings\AdditionalCompilerOptions.txt 修改为: /LD @“D:\Program Files\Autodesk\3ds Max 2009SDK\maxsdk\ProjectSettings\AdditionalCompilerOptions.txt” 即加一对引号。
c.将3dsmaxPluginWizard文件夹下的三个文件3dsmaxPluginWizard.ico、3dsmaxPluginWizard.vsdir、3dsmaxPluginWizard.vsz拷贝到VS 2005安装目录的 VC Projects 目录下,我电脑上的目录是C:\Program Files\Microsoft Visual Studio 8\VC\vcprojects。
d.启动VS 2005,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.下一步,再出现一个对话框
不用去管这些Plugin Detail,会有默认路径的,。
e.再下一步,设置一些路径,具体见图及注明。
注明:
Enter your MAXSDK path指的是3D MAX SDK的安装目录
Enter your Plugin output path 指的是生成插件文件.dll存放的目录,可以自己设置
Enter your 3dsmax.exe path指的是3D MAX的安装目录
2.项目生成以后,在MyExport.cpp文件中找到Ext(int n)函数,改为return _T("MY3D"), "MY3D"是根据自己的要求来添加的;
找到ShortDesc()函数,改为return _T("MyExportPlugin");
AllocConsole();
_cprintf( "Export Begin\n" );//记得#include <conio.h>
3. 生成并调试你的插件,系统会执行3dsmax.exe以启动3ds Max,然后选择“文件”->”导出”,如果能看到"MyExportPlugin(*.My3D)"
说明导出成功,然后定义一个导出文件的名称即可.这样一个空的导出插件就编写成功了!接下来请看: 3D MAX导出插件编写II
3D MAX导出插件编写I中已经具有了一个插件程序的基本框架,但这还是远远不够的,接下来,我们对I中的程序来补充肌肉、注入血液。
在正式写插件之前,也必须要弄清楚一些概念,比如说Node,Object,Mesh,Face,以及他们之间的关系,还有就是3D MAX场景的组织方式,关于这些内容我会专门安排一篇文章来进行归纳总结,请阅读:3D MAX中的重要概念及场景组织方式
在写程序之前,有一点必须弄明白的是,需要导出的什么数据,在这里,我们需要的导出的数据有:
1.几何信息——顶点坐标、顶点法线向量、面法线向量、顶点颜色
2.材质信息——基本材质信息(材质的Ambient、Diffuse、Specular、Shininess)、纹理信息(纹理图片的文件名)
从读程序开始,首先找到程序的入口点DoExport()函数,在这个函数中有一个重要的类ExpInterface,在这个类中包含IScene这个类,这个类很关键,我们先看它在SDK 9.0中的描述:
Description:
- This is the callback object used by IScene::EnumTree() . To use it, derive a class from this class, and implement the callback method.
还有,由上面描述可知ITreeEnumProc这个类必须通过继承去实现其中的callback()函数才行,继承类 MyTreeEnum如下:
{
public :
MyTreeEnum( void );
~ MyTreeEnum( void );
public :
int callback( INode * node );
};
有了这样类,剩下的导出数据的工作就都在这个函数中实现。
接下来,是一个callback函数的简单框架:
{
ObjectState os = node -> EvalWorldState( 10 );
if ( os.obj -> CanConvertToType( Class_ID(TRIOBJ_CLASS_ID, 0 ) ) )
{
_cprintf( " TRIOBJECT %s\n " , node -> GetName());
Mtl * pMtl = node -> GetMtl();
if ( pMtl )
{
_cprintf( " MATERIAL %s\n " ,pMtl -> GetName() );
}
return TREE_CONTINUE;
}
if (os.obj)
{
switch (os.obj -> SuperClassID())
{
case CAMERA_CLASS_ID:
_cprintf( " CAMERA %s\n " , node -> GetName());
break ;
case LIGHT_CLASS_ID:
_cprintf( " LIGHT %s\n " , node -> GetName());
break ;
}
}
return TREE_CONTINUE;
}
而在程序的入口函数处需要修改一下:
{
MyTreeEnum tempProc;
ei -> theScene -> EnumTree( & tempProc );
return TRUE;
}
最后,编译它,开始调试,找一个有物体,材质,灯光,摄像机的场景进行导出,如果你能在控制台输出窗口看到每个结点的名字,说明你的代码成功了。
1. 在SDK中有一个Mesh的概念,Node的几何信息都可以通过这个Mesh类获取到。在获取到TriObject对象后,获取Mesh对象就很容易了。
然后分别获取顶点信息、法向量信息、纹理坐标。
int VerticesNum = pMesh -> getNumVerts();
for ( int i = 0 ; i < VerticesNum; i ++ )
{
Point3 Coord,Normal,VColor,TCoord;
int FaceNumber;
// 导出顶点坐标
Coord = pMesh -> getVert(i);
// 导出顶点的法向量
pMesh -> buildNormals();
Normal = pMesh -> getNormal(i);
// 导出顶点的纹理坐标
TCoord = pMesh->tVerts[i];
}
寥寥几行代码,就可以导出node的几何信息。除此,还需要导出node的材质信息,对于单纹理的node,可以简单的获取材质信息。
以上获取的这些信息还只是孤立的数据,要想把这些数据组织起来,需要获取Mesh类中的Face信息。