Search
Enter Keywords:
2010-03-13
首页
新闻快讯

不知道大家有没有听过Delta3D游戏引擎. 它是由美国海军研究学院(Naval Postgraduate School)开发的一个开源游戏引擎. 它的概念很简单: 就是把一些开源软件结合起来, 在它们之上提供一些更高层次的功能与接口. 这些开源软件包括著名的Open Scene Graph(OSG), Open Dynamic Engine(ODE), Optimized Collision Detection(OPCDOE), Character Animation Library(Cal3D)等等.

这个概念本身并不新颖. 许多小公司应该都实践过它. 毕竟在资金或时间不足的情况下, 有什么能比免费的成型系统更令人感到亲切的呢?

想了解进一步信息的朋友可以看一看Delta3D.

游戏角色动画-骨胳动画 打印 E-mail
投稿: kidd   
2005-07-28

从DOOM的二维图片到Quake 2的MD2顶点动画, 三维游戏的动画效果已经取得了极大的进步. 然而, 这个进步的过程才刚刚开始. 无论是游戏玩家还是游戏开发者都有着更高的期待. 随着硬件能力的迅速提高, 越来越先进的技术被应用到了游戏的角色动画模拟中.

顶点动画技术相当的简单, 网络上也有很多的介绍, 我不想在这里重复. 有兴趣的朋友可以参考一下GameTutorials的MD2 动画教程. 这个教程不仅提供了源码, 而且有详细的注释.

Quake 3采用了MD3动画模型. 从根本原理上, MD3还是属于顶点动画. 但是它把一个人体分割成几个部分, 每个部分分别有自己独立的动画. 通过把每个部分的动画组合起来, MD3能在不增加内存消耗的前提下提供给一个角色相当丰富的动画序列. 相比之下Tomb Rader 更进了一步, 它把整个人体按生理结构分为许多的部分, 每个部分都有自己的几何形体 (Geometry Mesh), 然后再用数据结构把所有的部分合理地组成为一个有层次的整体. 象是上臂连着前臂, 前臂连着手. 这样的方法使得游戏角色具有对动态环境良好的适应性. 在原理上, 它已经很接近骨骼动画了. 然而它仍然有着自己极大的缺陷, 那就是这种多个几何形体构成的整体在进行动画模拟时很容易被玩家观察到游戏角色的身体不同部分的分离. 这导致了游戏开发者引进更先进的动画技术: 骨骼动画. 值得一提的是, 同游戏中的许多其它技术一样, 骨骼动画并非是由游戏开发者设计出来的. 游戏开发者通常都是在合适的时候(通常都是在硬件能力达到要求的时候) 把更先进的三维图形技术, 电影动画技术和其它相关技术吸收到电脑游戏中来. 这个过程以前是这样, 以后也还会是这样. 所以, 对一个游戏开发人员来说, 了解业界相关领域的最新进展相当重要. 广博的相关领域知识对成为一个出色的游戏开发人员相当重要.

骨骼动画特别适用于对人物和其他的脊椎动物进行动画模拟. 一般来说, 被模拟的角色由两个部分来表示. 一个部分是形成人物生理层次的一系列骨骼, 我们通常称它为骨架(skeleton). 另一个部分是蒙在骨架上的几何形体(geometry mesh), 我们通常称它为皮肤(skin). 通过对骨架进行模拟以产生运动(motion), 再利用骨骼运动控制相应皮肤变形就达到了对角色进行动画模拟的目的.

人体的实际运动过程大概如下: 肌肉产生力量牵动骨骼运动(通常都是旋转运动), 骨骼带动其它连接到的部位产生相应的运动, 同时, 肌肉产生变形. 这里描述的是一个动力学过程, 肌肉力量的控制决定了一切. 以这种方式形成动画被称为动力学方式(实际上当前应用的动力学动画比这还要简单, 但这与本文无关. 所以我不详细解释). 这是动画研究的一个方向但并非游戏角色动画的重点. 对游戏来说, 最后产生的动画效果最重要, 至于产生的过程是否科学并不在关心的范围. 所以, 绝大多数游戏动画引擎采用的都是另外一种更简单的方法: 运动学的方法. 在目前, 运动学方法通常能利用较少的运算提供更逼真的动画.

在对运动学方法进行介绍之前, 我们有必要对骨骼动画的原理作一个更详细的介绍. 前面说到了骨骼动画有两个方面. 第一个是生成运动的骨架. 那么这个骨架是怎样产生的呢? 通常, 美工都会按照人体的实际骨骼结构作一些简化来形成游戏角色的骨架. 之所以要作一些简化, 是因为人体的实际骨骼结构相当的复杂. 过于真实地反映会带来不必要的计算而且产生的实际效果并没有太多的提高.

图一描述了一具极其简化的人体骨架. 髋骨作为最顶层的骨骼, 它的下面连着脊椎骨, 左跨骨与右跨骨. 脊椎骨下面又连着颈骨与左肩骨, 右肩骨. 颈骨下面仅仅连着头骨. 其它部分可用相同方法解释.
Image
这样的骨架对应着树的数据结构. 每一块骨骼对应了树的一个节点. 一般来说, 髋骨(当然也可以是其它骨骼)会被选择为根节点, 任何其它骨骼都是根节点的子节点, 或是更深层次的节点. 一个骨骼节点的描述大概如下:

class AnimationBone
{
public:
     // 骨骼节点的公共接口. 略

private:
     // 骨骼节点的私有数据
     Vector3                  m_translation;     // 本地位移
     Quaternion             m_rotation;       // 本地旋转
     Matrix                    m_globalMatrix; // 全局变换矩阵
     AnimationBone      *m_childList;      // 子节点数组
     unsigned char         m_numChildren;// 子节点的数目
     AnimationBone      *m_parent;         // 父节点
};

其中m_translation是骨骼相对于它的父节点的位移, m_rotation是骨骼相对于其父节点的旋转. 它们的几何意义分别是骨骼的长度和两块骨骼之间关节的旋转. m_globalMatrix是骨骼相对于全局坐标系的变换矩阵. 如果你到现在还不明白Quaternion是什么, 那你有必要补充一下基本的数学知识. 详细请见游戏中的基本数学概念-旋转.

生成了人体的骨架只是生成运动骨架的第一个任务, 也是最简单的任务. 更困难的是怎样生成骨架的运动. 角色的动画从根本上是由这个运动来主导的. 以后我们会看到大部分骨骼动画的工作都在于怎样动态地生成优美的自然的动作. 生成运动的方法有很多种, 我们经常也根据这些方法来对骨骼动画进行分类. 由此也可见运动在骨骼动画中的重要性.

游戏角色动画运动生成技术目前的标准是正向运动学(Forward Kinematics). 通过简单的数学公式, 正向运动学可以表示为:

M(t)=f(P0(t), Q0(t), Q1(t), Q2(t), ..., Qn(t))
其中, P0, Q0代表人物(或根节点)在虚拟世界中的移动与旋转. Q1, Q2, ..., Qn代表了人物所有骨骼的旋转. 它们共同决定了游戏角色在空间中的运动(motion). M代表了骨架在空间的状态. 通过计算骨架空间状态对时间的函数, 我们就得到了骨架的运动.

对一块特定的骨骼来说, 它在全局空间中的位置以及旋转要由从根节点到该节点的一系列骨骼的状态来决定. 比方说, 图二中人体手的状态要由所有蓝色的骨骼决定. 肩关节的旋转不仅要影响到上臂的位置和旋转, 而且会顺着骨架一直传递到手. 图三显示了肩关节的旋转对上臂, 前臂和手的空间位置的影响. 虽然它们的局部相对位置都没有改变, 但是每块骨骼的全局空间位置都发生了变化.
ImageImage

那么我们到底怎样在游戏中生成这种骨架状态对时间的函数呢? 电脑游戏常用的方法是预先设计好一整套运动, 并把这些运动存储在文件中. 到游戏启动时把这些运动加载到内存中, 然后游戏运行时就能以少量的计算来显示事先设计好的精美运动了.


Image

现在我们的骨骼运动已经生成了. 如果我们要显示的话, 你就会得到大概如图四的结果. 显然这并不是我们需要的. 要实现最后的动画效果, 我们还有一件事情要做: 把人物的几何外形贴到骨骼上去. 这种任务通常被称为Skinning. 我们现在的问题是: 只有一块几何形体(geometry mesh), 却有许多的骨骼, 怎样去贴呢? 通常的解决办法是利用骨骼控制相应位置的顶点. 但这种办法会导致关节不自然的变形. 如果利用几块骨骼(例如形成关节的两块相连的骨骼)同时控制关节顶点的变形, 就能取得不错的效果. Jeff Lander 的"Skin Them Bones: Game Programming for the Web Generation"一文对相关的技术有详细的说明. 这种技术通常被称为Vertex Blending, 它的基本数学模型如下.
Image
其中P代表受控制的顶点. n表示影响顶点P的骨骼数量. wi代表第i块骨骼对点P的影响程度. Bi和Mi是两个矩阵. Mi的逆矩阵和Bi先后把顶点P转换到第i块骨骼的局部坐标系和全局坐标系. 看起来相当复杂哦. 但大部分数据都由Animator产生的动画模型文件提供. 你只需要计算好骨架的运动, 并由该运动计算出每块骨骼的全局变换矩阵Bi, 一个简单的骨骼动画引擎就成型了.
Image

最近更新 ( 2005-09-07 )
< 上一篇   下一篇 >

Copyright 2005 GameTechZone. All rights reserved