详细讲解3DMAX导出插件-tiamo

转自:详细讲解3DMAX导出插件-tiamo

3dmax的导出插件是用来把做好的3d模型导出成自己引擎需要的格式的一个dll,它由3dmax加载调用.具体怎样去写一个插件,小T不多说,在3dmax的sdk里面有比较详细的介绍,在google上面也能搜索到不少的源代码,这里说的只是3dmax的数据组织方式,以及怎么获取转换3dmax的数据.
  
  3dmax里面一个比较重要的概念就是INode,3dmax的场景模型都是由一个个的INode组成,这些INode构成一棵体系树,而各个真实的模型都是附着到一个INode上面的,3dmax的sdk提供了怎样获取INode指针,怎样获取INode的几个Matrix的方法,这个能在max的sdk里面找到,也不是小T这次主要谈的东西.获取了相应的Matrix以后,用INode的EvalWorldState等等函数就能获取到附着在这个INode上面的geom object,然后能获取到vertex信息,face信息,material信息,这些都相对容易,随便的一个导出插件的例子都会有提到这些方法,小T也不多少.说了半天,小T究竟想说什么呢?嘿嘿.一个是skin mesh的weight数据获取,一个是keyframe的control数据获取以及3dmax的几种不同的control的keyframe的插值方法.
  
  先说skin mesh的weight table数据.X文件的导出插件里面使用的skin工具属于charactor studio(cs)的一个部分,小T没有找到合适的cs安装,所以小T自己的插件不准备支持cs,小T推荐的也是唯一支持的工具是3dmax5自带的skin工具.下面说的就是skin工具的数据获取.skin这个工作在3dmax里面被称为了modifier,3dmax对于每一个object都维护一个modifier stack(关于这个方面的详细信息可以查看3dmax的sdk,或者使用google),现在首先要作的就是获取到skin这个modifier的接口指针ISkin.--->使用GetModifier函数一一遍历每个modifier,检查它的class id是不是SKIN_CLASSID,然后调用GetInterface获得ISkin的指针,通过这个指针调用GetContextInterface获取ISkinContextData指针,这个指针里面就维护了weight table.首先调用ISkinContextData指针的GetNumAssignedBones,传人vertex的id(从face的数据里面获得这个id),得到了影响这个vertex的bone的数目,然后从0到bone数目减1,一一调用GetAssignedBone,传人vertex的id和bone index,得到bone id,然后使用ISkin的GetBone传人bone id获得bone的INode指针,然后调用ISkinContextData的GetBoneWeight传人vertex的id和bone的index,就能获得weight数据.有点乱,贴代码上来.
  
     
  skin mesh 的weight数据就算是获取完成了.接下来的是3dmax的control数据获取.这个部分是整个3dmax里面最为隐讳的一个部分,它的格式只有在3dmax的debug sdk里面才有,而这个debug sdk是要钱的,小T现在可没有那个能力支付多少多少的美圆..嘿嘿.下来的这些资料来自小T从网上收集到的各个open source的3d引擎的源代码,有一小部分是小T自己研究的结果.先列出资料的来源.首先的一个是魔兽的mdl导出插件'DeX.http://republicola.wc3campaigns.com/DeX/,然后的一个是fairy-project,还有一个就是www.nevrax.org.
  
  3dmax里面的control有很多很多,小T只是打算支持主要的3种,linear,bezier和tcb control.下面一个一个的讲.
  
  linear是最简单的,几乎不需要讲,他使用线性插值算法.对于旋转数据使用quat的slerp算法就ok.
     
  接下来说tcb control 这个要比linear复杂一点,tcb control使用的是hermite(埃尔米特)插值,hermite插值是指给定有限个点的值和这些点的一阶导数,构造一个多项式,在那些给定的点的值和一阶导数都和已知值相同.这个在数值分析里面有讲到,给个链接.很明显,一个物体的位置,旋转角度是一个关于时间的函数,给定一个时间,就有一个唯一的位置,一个唯一的旋转,而现在我们不可能记录任何时间的位置和旋转信息,我们只是知道在某些特定的时间点(这些点叫keyframe)的位置和旋转信息,还有这些点的导数信息,现在就要利用这些已知信息计算出任何时间点的值来.这个就叫插值.(呃,这个解释不算是完备,但是我个人觉得还是容易理解的).而利用值和导数,我们已经能用hermite插值方法计算出任何时间点的值来了,但是,实际上,获得单个点的导数信息却并不是已经很容易的事情,所以tcb就应运而生了,他并没有记录单个点的导数,而是记录了3个额外的数据,而单个点的导数信息可以通过这些已知道信息计算出来(具体的方式可以看上面的链接里面的文章),特殊的点是第一个和最后一个点,第一个点只需要计算TD的值,
  float tm = 0.5f * (1.0f - firstKey->Tension);
  firstKey->TD = tm * ((secondKey->Value - firstKey->Value) * 3.0f - secondKey->TS);
  最后一个点计算TS的值
  float tm = 0.5f * (1.0f - lastKey->Tension);
  lastKey->TS = tm * ((lastKey->Value - previousLastKey->Value) * 3.0f - previousLastKey->TD);
  然后,上面那个链接里面给出来的方法里面必须的数据就都差不多了,唯一例外的是那个s.表面上看s就是(t - key1.time)/(key2.time - key1.time),其实不是,在3dmax里面还有一个easeIn和easeOut数据,刚刚得到的结果还得经过一系列的计算才能作为插值参数s.方法列出来:

包含 for 3DS MAX3 for 3DS MAX4 0 for 3DS MAX4 0+ CS3 1 for 3DS MAX4 2 CS3 2+ or MAX 5 0 for 3DS Max 6 0+ CS4 2 and 3DS Max 7 0 for 3DS Max 8 0 for 3DS Max 9 0 Panda Directx Exporter x64 5 9 67 0 for 3DS Max 9 64 bit Panda Directx Exporter x64 5 2008 67 0 for 3DS Max 2008 64 bit Panda Directx Exporter x64 5 2009 67 0 for 3DS Max 2009 64 bit Panda Directx Exporter x64 6 9 72 0 for 3DS Max 9 64 bit Panda Directx Exporter x64 6 2008 71 0 for 3DS Max 2008 64 bit Panda Directx Exporter x64 6 2009 72 0 for 3DS Max 2009 64 bit Panda Directx Exporter x64 6 2010 72 0 for 3DS Max 2010 64 bit Panda Directx Exporter x64 6 2011 72 0 for 3DS Max 2011 64 bit Panda Directx Exporter x64 6 2012 72 0 for 3DS Max 2012 64 bit Panda Directx Exporter x86 5 8 66 0 for 3DS Max 8 32 bit Panda Directx Exporter x86 5 9 67 0 for 3DS Max 9 32 bit Panda Directx Exporter x86 5 2008 67 0 for 3DS Max 2008 32 bit Panda Directx Exporter x86 5 2009 67 0 for 3DS Max 2009 32 bit Panda Directx Exporter x86 6 9 72 0 for 3DS Max 9 32 bit Panda Directx Exporter x86 6 2008 71 0 for 3DS Max 2008 32 bit Panda Directx Exporter x86 6 2009 72 0 for 3DS Max 2009 32 bit Panda Directx Exporter x86 6 2010 72 0 for 3DS Max 2010 32 bit Panda Directx Exporter x86 6 2011 72 0 for 3DS Max 2011 32 bit Panda Directx Exporter x86 6 2012 72 0 for 3DS Max 2012 32 bit ">包含 for 3DS MAX3 for 3DS MAX4 0 for 3DS MAX4 0+ CS3 1 for 3DS MAX4 2 CS3 2+ or MAX 5 0 for 3DS Max 6 0+ CS4 2 and 3DS Max 7 0 for 3DS Max 8 0 for 3DS Max 9 0 Panda Directx Exporter x64 5 9 67 0 for 3DS Max 9 64 bit Panda Directx Exporter x64 5 2008 67 0 for 3DS Max 2008 64 bit Panda Direc [更多]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值