3Ds MAX骨骼动画导出插件编写

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

如何编写自己的3DsMAX骨骼动画导出插件

潘李亮

2007-12-7

xheartblue@

一 简介

在3D引擎中,骨骼动画系统是非常重要的一个组成部分,虽然在一个游戏的真正开发过程中,一个优秀的游戏引擎也许不需要用户去关心它的骨骼动画系统是如何实现的,但是还是有很多人希望了解这样的一个技术。

一个商业化的骨骼动画系统包含的组件是很多的,比如有DCC(Digital Content Creator 数字内容创建工具,比如3Ds MAX , Maya等)插件,蒙皮计算程序,蒙皮渲染程序,动作计算程序,表情系统,柔体系统,音唇同步,以及针对物理系统的接口等。其中DCC 插件包含DCC的导出插件和其他专用数据生成插件。

本文将会介绍骨骼动画系统里的一个基础部件:3Ds MAX 的骨骼动画导出插件。2005年底的时候我在csdn的游戏开发频道里发过一个在linux下可以运行的骨骼动画程序,使用的是自定义的骨骼动画模型。从程序发布以后,就有很多人问我关于3Ds MAX插件的编写和骨骼动画数据管理等问题。网络上相对这方面的资源比较少,希望本文对那些在寻找和学习这方面内容的读者能有一定的帮助。另外鉴于作者水平有限,文中难免出现错误的地方,欢迎指正与批评。

本文是介绍如何编写3DsMAX插件的文章,所以假设读者有一定的骨骼动画原理基础和图形编程经验。如果对这两块还比较陌生的读者,建议先阅读相关资料。

二 3Ds Max SDK和插件系统

选择编写3DsMAX(以下简称MAX)来导出的数据的原因是MAX拥有强大的建模能力,并且通过它美工可以方便的修改动作,材质等属性。同时个人感觉MAX的SDK 对初学者来说虽然有些晦涩。但是这个SDK还是能非常直接的反映出MAX本身的工作流程的,在熟练以后,使用起来还是比较顺手的。

最新版本MAX9的MAXSDK包含在安装光盘里,在安装完MAX后直接安装SDK,并在工程里添加maxsdk的包含路径和库的路径就可以开始编译max插件了。MAX SDK 还提供了3Ds Max Help for Visual Studio,这个帮助系统可以集成到Visual Studio .NET 的帮助系统中,非常方便。建议在安装的时候一起装上。

MaxSDK主要目的就是用来开发MAX插件,虽然Max也提供了MaxScript,也可以用来做插件,但是对C++程序原来说,MaxSDK则更顺手一些。

Max插件根据用途分为好几种,每种对应不同的扩展名,在游戏开发中,我们通常比较关心三种类型的插件,他们分别是: 导入/导出插件,对应扩展名为dli/dle, utility 插件,对应扩展名为dlu , 以及扩展名为dlm的modifier。导入导出插件基本上MAX与其它工具交互的接口。Utility插件则可以为MAX增加很多操作功能面板。Modifier则是3DsMAX

3DsMax自带的插件放在X:\3DsMax\maxsdk\stdplugs目录下,而我们自己编写的插件通常会放到X:\3DsMax\maxsdk\ plugins目录下。只要把插件放到这两个目录下,Max 在启动的时候就会自动加载你的插件。很多初学者可能会问dlm/dle这些插件是怎么生成的呢?其实这些都是一些标准的dll程序,只是扩展名不同而已。跟编译一个普通的Windows DLL没有区别。

初学MaxSDK最好的例子应该就是MAXSDK自带的sample。在maxsdk的安装目录下可以找到,一般是X:\3DsMax\maxsdk\samples 下。这个目录下已经对插件的种类进行了分类。一般在做骨骼动画导出插件的时候,我们不会选择导出插件而是选择utility 插件,这样做的目的是ultility插件在max启动的时候就处于激活状态,而导出插件则只会在用户选择export命令的那一刻,并且这些插件都可以访问到MAX的整个环境,因此,使用utility插件会让用户更加的方便,本文的例子就是采用utility插件。

图(1)utility插件例子,XReal3D 的模型导出插件

三 构造第一个3Ds Max 插件

本节我将讲述如何快速的建立一个utility插件的框架, 因为关心的是导出插件本身的功能,而不是插件框架本身,因此我给大家提供一个个比较简洁的方法:使用3dsmaxPluginWizard. 这是MaxSDK提供的一个组件,位于X:\3dsmax\maxsdk\howto\3dsmaxPluginWizard下, 仔细阅读一遍这个目录下的ReadMe.txt文件的Installing一小节,就可安装好3DsMaxPluginWizard. 这时候打开Visual Studio 2005.在新建工程中就可以看到3Ds Max Plugin Wizard一项,选择后,看到标签页一共有三页,在第一页Plugin-Type里,选择Utility项,在接下来的Plugin Detail里填入详细信息如图2所示.

图2 Max Plugin Wizard

最后在Project Detials 选项卡里填入maxsdk的路径,插件输出路径和3dsmax.exe 所在的路径就可以生成一个utility工程了。

生成的工程仅仅是一个架子,它包含了两个类和一个IDD_PANEL的对话框。第一个类MyMaxSkinExporter是从UtilityObj派生下来的,代表了插件本身。另外一个类从ClassDesc2派生,用来描述这个插件的一些信息。IDD_PANEL则是我们插件的主界面,我们可以简单的理解它就是我们插件的主窗口。

MyMaxSkinExporter有两个重要的函数: BeginEditParams(Interface *ip,IUtil *iu)和EndEditParams(Interface *ip,IUtil *iu)这两个函数。BeginEditParams可以简单的理解成插件的初始化函数,EndEditParams则在插件退出时候被调用。参数Interface *ip 则代表整个Max对象,用它可以访问到MAX程序的所有功能。

编译这个工程,一个简单的utility插件就已经生成了,你可以在刚才Project Detials 选项卡里填入的插件输出路径里找到生成的插件。

四 3Ds MAX的场景组织和几何管道

要编写一个导出骨骼动画的插件,必须先了解MAX是如何组织场景的,并了解MAX 中一个mesh对象从建立到最终输出都经历那些阶段。下面首先介绍一下MAX的场景组织。

MAX的整个场景是一个树状结构,树的节点用INode来表示,整个树的根节点可以通过Interface::GetRootNode来获得,场景中的所有物体都是INode。INode中的NumberOfChildren函数和GetChildNode则用来访问INode的子节点。要遍历整个场景中对象,只需要通过Interface::GetRootNode和GetChildNode做一个递归循环就可以了。如果仅仅是想获得在视口中选定的物体,则可以使用Interface::GetSelNodes 函数。

INode仅仅是一个虚拟的节点,它本身仅仅包含一些标记和变换信息,并不表示实际的Object。实际的Object需要附着在INode上,并以INode的坐标系为Object的本地坐标系。Max中常见的Object有形状(各种参数曲线),Camera ,Mesh等。Object有自己的变换矩阵(TM), 在很多情况下这个矩阵都是单位矩阵。

INode的变换矩阵可以通过INode::GetNodeTM来获得,而附着在INode上的Object

相关文档
最新文档