builditnow的ChinaUnix博客builditnow.blog.chinaunix.net
builditnow
全部博文(43)
OGRE(0)
Irrlicht(10)
Restricted Quadt(1)
2015年(1)
2014年(1)
2013年(5)
2012年(36)
a7465427
stormdes
eiaeii
z_d_r281
VankeH
chaosink
scq2099y
qq948299
yudongwa
分类: C/C++
2013-09-08 15:06:17
89 0 1783 0 0 1 1784 1 7 ...
里面的数据都是在source里面的索引,里面的offset则是一个vertex在
的偏移,根据offset可以知道一个vertex在p里面要用占多少个数字,set表示一个semantic的n,比如d3d里面texcoord的texcoord0,texcoord1...。 根据上面:一个vertex占4个。 89 0 1783 0为一个顶点对应vertex,normal,texcoord,(textangent,texbinormal)的索引。注意textangent,texbinormal的offset一样,所以他们只占一个数字。 里面的数字个数/4/3 = 三角形的个数。 顺便说一下,collada的格式很灵活,解析起来就很麻烦。我这里用的是dom,有的代码直接用的Torque的。 Skin数据的解析: 这个过程主要构建两个数据:vertex weights和bone inverse bind matrix(将vertex从model space转换到bone space)。注意:的matrix是将geometry里的local space转换到model space。 导入Skeleton 这个过程比较简单,在mesh list里面所有的skin mesh可以拿到skeleton的root node,因此直接可以生成skeleton。 导入Animation Animation这个过程比较麻烦,在Torque里面,Animation是单独在一个.dae文件里面,而mesh和skeleton在一个.dae里面。但是Animation的.dae里面仍然有一个skeleton node结构,这个和在mesh那个文件里是保持一致的,这样Animation才能够根据bone的index来保存动画帧的数据。 各个节点的引用关系如下: 通过上面的关系图,一个channel影响一个bone(target指向的node),注意:一个bone可能被多个channel影响。把source指向的sampler里面的三个inputs : 时间线,每个时间点对应的matrix,对应的插值方法。来分别生成每一个bone对应每一帧的transform matrix,如果需要的一个时间点不是input array里面的时间点,则需要用interpolation指定的插值方法来计算。 我是通过translation,quaternion来保存一帧的变换,scale没有保留,感觉用处不多。 Animation里面一个bone对应一个track,这个track包含这个bone的所有帧的变换。所有的bone的帧数需要一样。 后记: 写了骨骼动画一段时间了,单一个动画播放已经完成,但quaternion的一个问题一直不能解决。 原因是Quaternion在差值的时候不能确定是选择长路径还是段路径,当两个动画合成的时候,就会出现某一个骨骼突然跳到另一个方向上去。 Reference : Torque Web : Torque Git :
里面的数字个数/4/3 = 三角形的个数。 顺便说一下,collada的格式很灵活,解析起来就很麻烦。我这里用的是dom,有的代码直接用的Torque的。 Skin数据的解析: 这个过程主要构建两个数据:vertex weights和bone inverse bind matrix(将vertex从model space转换到bone space)。注意:的matrix是将geometry里的local space转换到model space。
上一篇:BIN_Luabind C++与Lua连接层库
下一篇:上海-南京 骑行
登录 注册