现在的位置: 首页 > 综合 > 正文

骨骼系统

2013年10月06日 ⁄ 综合 ⁄ 共 1816字 ⁄ 字号 评论关闭
在三维系统中,骨骼系统是一个重要的部分,是控制人物动作的较佳方法,也是未来人物动作的发展趋势。当前游戏的三维人物动作的控制大多采用顶点关键帧,但这种方式为每一帧动画都要记录人物的顶点数据,当动作多了的时候,存储的需求就越来越大,所以这种方式不但限制了人物的多边形数(顶点数),还限制了动作不能太多。而骨骼动画不同,每帧只记录骨骼的转换,然后通过骨骼与顶点的联系把转换附加到顶点上,生成新的顶点位置,所以骨骼动画的大小跟人物的复杂程度无关,所以可能一个几M的顶点关键帧动画用骨骼动画只需要几十K,骨骼动画还有一个最大的优点还是设计的好的化人物之间的动画可以共享(当然这点不是那么容易实现的),也就是说只需要一个走动动作文件就可以让所有的角色在游戏中走动(是不是无限向往了呢)。
不过骨骼动画比顶点关键帧最大的不足就是需要大量的计算,每一个顶点都需要几个矩阵乘法,所以cpu的能力就限制了人物的顶点的数量(其实是pc的架构导致了从内存输入数据到cpu是很慢的,而不是cpu慢,现在软件计算都慢在内存寻址上),不过随着硬件的不断改进,这一不足将会成为历史。

骨骼系统把角色模型主要有顶点几何数据,骨骼,顶点与骨骼联系,矩阵变化动画四部分。
首先是顶点几何数据。这跟原来的模型数据是一致的,就是包含三角形,顶点等渲染所需的数据。
然后是骨骼,这个就是影响该角色模型的关键点结构,一般可以在三维软件如maya,max等导出期间获得,可以用来判定两个角色模型是否使用同一个骨骼。
接下来的顶点与骨骼联系,就决定一个顶点有多少骨骼影响和其影响权重或者是一个骨骼影响多少顶点及其影响权重,还有。
最后是矩阵变化动画,这里面的数据是每跟骨骼的变换矩阵,这个矩阵可以是相对于原点的变换矩阵,也可以是相对于上级骨骼的变换矩阵(这个很复杂,要求骨骼的结构要组织成层次结构,但好像这样才能实现不同的骨骼之间的统一,但我想还是要为每一个骨骼加入一个骨骼初始矩阵,这样的话运算量大大增加,不划算)。
骨骼系统的基本原理就是用骨骼运动的矩阵通过顶点与骨骼联系计算出模型顶点的位置。

知道了原理,我们就可以用程序实现了。
首先,是数据结构的设置。为了发挥骨骼系统的最大优势,模型要与动画分离,基于这点,我们就可以定下共两个结构。接下来就是把上面的四个部分的数据分配到模型和动画两个结构中。
模型数据结构应该有关系到几何的数据:顶点几何数据、顶点与骨骼联系和骨骼。
动画数据结构应该有关系到矩阵变换的数据:矩阵变化动画和骨骼。
大家注意到两个部分都有骨骼,这是因为两边的数据要有一个桥梁来联系,否则一个恐龙的模型使用普通人的动画就会很可笑甚至出错。
顶点与骨骼的联系(蒙皮顶点)这个数据结构可以有两种方法实现:一种是以骨骼层次为基础,把该骨骼影响的所有顶点和影响权重都连接在骨骼上;第二种是以空间位置顶点为基础,把影响其运动的骨骼和影响权重连接在顶点上。我选择了后者。
我的蒙皮顶点结构是这样的:
蒙皮顶点
{
影响骨骼数量;
影响的权重列表;
影响骨骼的索引列表;
影响骨骼与该顶点的相对位置列表;
}
接下来,就是数据来源。最佳的方法当然是从3d专业软件中导出来,为了要得到最佳的数据,还是应该自己写插件。微软有对应于max和maya的插件,但都是错误的,首先没有进行左右手坐标的转换,纹理坐标是错误的;没有进行坐标轴交换,如在max里看起来站着的人到了d3d里就是躺着的,主要是max里默认向上的轴是z轴而d3d里是y轴。当然大家可能还不会写max和玛雅的插件,可以看微软的插件例子,虽然不实用但拥有完整的输出方法,是个学习的好材料,加上max和maya自带的sdk,应该会很快写出自己的插件。过几天可能会写一下如何制作max或maya的导出插件,但在这里就不多说了。
最后是计算和渲染了。这里的顶点与骨骼联系基于空间位置顶点。
第一步,根据当前运动的时间,从动画数据中把当前骨骼运动的矩阵得到。
比如说,整个动画有两秒,共20帧,当前动画已经到了1.2秒,那就读出第12帧动画的各个矩阵。
第二步,遍历所有骨骼顶点(空间位置顶点),并把各骨骼的影响乘以动画矩阵。
具体操作应该是这样的:
对每一个蒙皮顶点,先将顶点位置至零。
for( i = 0; i

抱歉!评论已关闭.