在前面《OpenGL下导入骨骼动画模型(ms3d,md5)》一文中介绍了包括MD5在内的几种骨骼动画模型格式,并给出了部分openGL下的效果图。最近一段时间,因为makehuman的原因(下面会提到),也折腾了collada(DAE)模型,磕磕绊绊也算调试通了。目前的状况是,MD5和collada都合适做为项目的模型,并且加载程序都有了,关键是哪个能方便地制作或者顺利地导出。关于角色是否“运动化”,即服饰是否运动相关(短袖,紧身等),那就看在网上能不能找到合适的模型,这里的合适意思是模型文件是否包括骨骼和贴图,否则的话必须自己蒙皮.封套,UV设置。这是个技术活啊。-_-
---------------------------------------------割一下--------------------------------------------------
上面说的makehuman的原因,下面具体探讨一下。在文档makehuman_a_manual.pdf中有下面一段关于Quake(MD5)的一句话。Not yet fully functional。如果早对makehuman的相关功能进行深入地了解,就会更早地发现这个功能缺陷。也收获了一个教训,那就是做事之前,有必要做好相关的调查工作,在时间允许的情况下,越详细越好。它大致意思是:从mhx(makehuman的标准模型)导出MD5时,皮肤没有跟骨骼很好的关联在一起。如果看模型文档的话,就会发现权重信息块中骨骼节点索引值全为0,即把所有的顶点以权重1的方式关联给了根(root)节点(节点序号为0)。事情的直接结果就是人体或者模型只能作为一个整体进行平移旋转到等相关运动,类似于一个刚性的人体,这显然不是我们想要的结果。现在问题是发现了,一系列的问题也就来了,有补救的措施吗?是不是有改进的代码?如果没有makehuman里面的模型是怎样运动的呢?去看看导出插件的源代码吧。
在makehuman的安装路径中,在\apps\mh2文件夹下有个叫mh2md5.py和mh2md5.pyc的文件。从他们的名字就可以猜测是转换MD5模型的代码,其中前者是源代码,后者是有前者编译生成的一种二进制文件(用txt查看是乱码)。py文件变成pyc文件后,加载的速度有所提高,而且pyc是一种跨平台的字节码,是由python的虚拟机来执行的,这个是类似于JAVA的虚拟机的概念。pyc的内容,是跟python的版本相关的,不同版本编译后的pyc文件是不同的,2.5编译的pyc文件,2.4版本的 python是无法执行的。这样做的目的是在商业行为中保护源代码,不过可以反编译,这种反编译器好像是收费的。在这个文件夹下都是模型转换的工具,如mh2bvh,mh2collada,mh2obj,和mh2stl等。
打开mh2md5.py文件,其中有下面一段关于骨骼权重的程序:他把所有的顶点权重都加在了root上。
f.write('\n\tnumweights %d\n' % (len(obj.verts)))
for vert inobj.verts:
# TODO: Weattach all vertices to the root with weight 1.0, this should become
# realweights to the correct bones
# weight[weightIndex] [jointIndex] [weightValue] ( [xPos] [yPos] [zPos] )
f.write('\tweight %d %d %f ( %f %f %f )\n' % (vert.idx, 0, 1.0,vert.co[0], -vert.co[2], vert.co[1]))
f.write('}\n\n')
f.close()
那么,是不是可以下结论了那,makehuman里面根本没有骨骼权重的信息, makehuman中没有对手臂、腿等(面部表情除外)的运动设置也间接印证了这一结论。如果这样下结论,我又错了,冤枉makehuman了。强有力的证据就是makehuman导出的collada模型中有骨骼对mesh的权重信息。好吧,结论是:makehuman的程序员很忙,还没对MD5导出插件进行完善。下面贴出collada的证据,同时也结束了本文,为下文结束collada做准备了。
权重值:
骨骼节点影响顶点索引 值: