3ds Max骨骼动画-游戏程序中的骨骼插件(2)
来源:互联网 作者:未知 发布时间:2010-09-07 22:11:10 网友评论 0 条
最后在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的变换矩阵则通过INode::GetObjectTM来获得,因为Object相对于Node的变换矩阵通常是单位矩阵,GetNodeTM和GetObjectTM获得的矩阵通常也是一样的,但是在必要的时候一定要加以区别。关于INode和Object的变换矩阵问题的详细讨论可以参考我blog上的一篇文章:http://blog.csdn.net/Nhsoft/archive/2005/01/06/241629.aspx
接下来我来看一下3DsMax一个几何物体的Pipeline。前面说过Object是附着在INode上的,在MAX里,Node有一个Object Reference的指针,指向一个物体对象。熟悉MAX的操作方式的读者都知道,我们在MAX里建立一个对象后,可以在上面添加各种修改器-Modifier。在Max的几何管道中,我们建立的对象通常称为Base Object。所有施加在这个物体上的修改器形成一个修改器堆栈-ModStack。BaseObject经过这个ModStack后形成一个新的Object Reference。ModStack中的每个Modifier都是输入一个Object Reference,输出一个Object Reference, 并且在应用第一个Modifier的时候会自动在几何管道里插入一个Derived Object。最终INode的Object Reference将指向这个Derived Object。
Modifier在管道中的应用实例是ModApp对象,一个ModApp代表一个应用在Object上Modifier修改,ModApp包含一个ModContext的数据对象,Modifier用ModContext中的数据来对Object进行修改,以生成最终数据。
修改器按照应用的坐标系不同分成局部空间修改器和世界空间修改器(World Space Modifier)。局部空间修改器仅仅在Object的局部空间中修改Object,不会对坐标系造成影响。世界空间的修改器比如水波纹修改器则要求先将物体变换到世界空间后再进行修改,修改完成后的坐标也是世界空间的坐标。相对来说处理世界空间修改器会麻烦的多。(如果一个物体应用了世界空间修改器,则通过Mesh对象取得的坐标已经是世界坐标系中的了。不需要再乘以INode::GetObjectTM了)。
导出骨骼动画数据
了解了MAX的场景管理和几何管道以后,我们就可以很方便的建立一个如何取得MAX场景中定点数据的流程了。
骨骼动画系统,首先应该包括物体的蒙皮数据和顶点与骨骼的绑定信息。我们分两部分介绍皮肤数据的导出。第一步,我们要导出蒙皮数据,为了简单起见,在这里只导出蒙皮的位置,法向量与切向量纹理坐标等信息留给读者自己去研究。在3DsMax里。要建立骨骼动画模型,可以使用两种修改器Skin和,Physique。其中Physique是属于CharacterStudio的,他的API相对比较复杂,本文只介绍使用Skin修改器制作的骨骼动画模型文件。
在界面上增加一些按钮
在了解了那么多理论后,我们可以开始做一些实质上的事情了,首先我们要给我们的插件增加一些按钮,通过这些按钮,使用可以下达保存/加载骨架,导出动作,导出皮肤等任务。
我们在第三节中生成的IDD_PANEL的对话框中加入几个按钮,分别用于保存骨架,加载骨架,导出动作,导出皮肤。并在对话框的WM_COMMAND消息中加入按钮响应代码。对话框的窗口过程为MyMaxSkinExporterDlgProc。
增加完的IDD_PANEL对话框看上去如图4。


INode的变换矩阵可以通过INode::GetNodeTM来获得,而附着在INode上的Object的变换矩阵则通过INode::GetObjectTM来获得,因为Object相对于Node的变换矩阵通常是单位矩阵,GetNodeTM和GetObjectTM获得的矩阵通常也是一样的,但是在必要的时候一定要加以区别。关于INode和Object的变换矩阵问题的详细讨论可以参考我blog上的一篇文章:http://blog.csdn.net/Nhsoft/archive/2005/01/06/241629.aspx
接下来我来看一下3DsMax一个几何物体的Pipeline。前面说过Object是附着在INode上的,在MAX里,Node有一个Object Reference的指针,指向一个物体对象。熟悉MAX的操作方式的读者都知道,我们在MAX里建立一个对象后,可以在上面添加各种修改器-Modifier。在Max的几何管道中,我们建立的对象通常称为Base Object。所有施加在这个物体上的修改器形成一个修改器堆栈-ModStack。BaseObject经过这个ModStack后形成一个新的Object Reference。ModStack中的每个Modifier都是输入一个Object Reference,输出一个Object Reference, 并且在应用第一个Modifier的时候会自动在几何管道里插入一个Derived Object。最终INode的Object Reference将指向这个Derived Object。
Modifier在管道中的应用实例是ModApp对象,一个ModApp代表一个应用在Object上Modifier修改,ModApp包含一个ModContext的数据对象,Modifier用ModContext中的数据来对Object进行修改,以生成最终数据。
修改器按照应用的坐标系不同分成局部空间修改器和世界空间修改器(World Space Modifier)。局部空间修改器仅仅在Object的局部空间中修改Object,不会对坐标系造成影响。世界空间的修改器比如水波纹修改器则要求先将物体变换到世界空间后再进行修改,修改完成后的坐标也是世界空间的坐标。相对来说处理世界空间修改器会麻烦的多。(如果一个物体应用了世界空间修改器,则通过Mesh对象取得的坐标已经是世界坐标系中的了。不需要再乘以INode::GetObjectTM了)。
导出骨骼动画数据
了解了MAX的场景管理和几何管道以后,我们就可以很方便的建立一个如何取得MAX场景中定点数据的流程了。
骨骼动画系统,首先应该包括物体的蒙皮数据和顶点与骨骼的绑定信息。我们分两部分介绍皮肤数据的导出。第一步,我们要导出蒙皮数据,为了简单起见,在这里只导出蒙皮的位置,法向量与切向量纹理坐标等信息留给读者自己去研究。在3DsMax里。要建立骨骼动画模型,可以使用两种修改器Skin和,Physique。其中Physique是属于CharacterStudio的,他的API相对比较复杂,本文只介绍使用Skin修改器制作的骨骼动画模型文件。
在界面上增加一些按钮
在了解了那么多理论后,我们可以开始做一些实质上的事情了,首先我们要给我们的插件增加一些按钮,通过这些按钮,使用可以下达保存/加载骨架,导出动作,导出皮肤等任务。
我们在第三节中生成的IDD_PANEL的对话框中加入几个按钮,分别用于保存骨架,加载骨架,导出动作,导出皮肤。并在对话框的WM_COMMAND消息中加入按钮响应代码。对话框的窗口过程为MyMaxSkinExporterDlgProc。
增加完的IDD_PANEL对话框看上去如图4。

- 2009-10-17
- 2009-10-17
- 2009-10-17
- 2010-09-07
- 2009-10-17
- 2009-10-17
- 2010-09-07
- 2009-10-15
- 2009-10-17
- 2010-09-07
- 2009-10-17
- 2009-10-09
- 2009-10-17
- 2009-10-17
- 2009-10-12
关于我们 | 联系方式 | 广告服务 | 免责条款 | 内容合作 | 图书投稿 | 招聘职位 | About CG Time
Copyright © 2008 CGTime.org Inc. All Rights Reserved. CG时代 版权所有