D3D角色动画学习笔记(一)——角色动画简介与初步规划
写这个系列是基于自己学习角色动画之后,相对自己的成果做一个整理,还可以给大家做一个角色动画的预览,可能会节省大家的一点时间,同时也希望各位大神能够指正一下我的错误。然后这个是基于《Character Animation with Direct3D》(Carl Granberg)这本书的,大家可以看作是这本的一个粗浅翻译,然后附带上我的一点简单的理解。还请大家多提意见与建议,我会做得更好。
最后是一点我的初步想法,书中分为16章节,目前准备的是骨骼动画,物理模拟入门,偶人动画,渐变动画(可能还有集群模拟,角色贴花)这几大部分(其余什么脸部的动画后面再说),这一篇主要是一点对角色动画的介绍,然后下一篇开始正式进入编程,主要是程序的框架与基本模型导入,还有一点HLSL的小代码。下下篇开始进入骨骼动画,基本每篇文章涉及一个知识点,最后会有一个小的成果展示。希望能够把这本书上讲的全部说一遍。
好了,现在开始进入正题~~~之前的一个小提示。。。观看这个系列文章,希望你能有一定的DirectX3D9.0的基础,这个是最基本的要求,在此我强烈推荐《DirectX 9.0 3D游戏开发编程基础》,或者是浅墨大神的博客;在此之上,还需要了解一点High Level Shading Language(HLSL),这个很重要,并且有很多知识将与它挂钩,没有它将寸步难行,还是上面推荐的那本DirectX的入门书,最后一章便是HLSL入门,看完了,对于理解这里的示例将没有任何问题,也可以自己尝试改一点、写一点,感觉非常有意思的。之后代码会经常用到一些C++ STL容器,碰到的时候我会说一下,或者直接写一个专题什么的,一并说一下常用容器,这些到时候看吧。
最后希望各位有所收获,乐在其中,也请指出我的问题;自勉一下,希望自己能一直坚持下去,做自己喜欢的事。谢谢!
一、 什么是角色动画?
“Character animationis a specialized area of the animation process concerning the animation of oneor more characters featured in an animated work” –Wikipedia(现在维基百科对角色动画的定义又改了一个,但也差不多,我这里就用老版本了)
角色动画是动画过程中的一个特殊领域,其关注于动画作品中的一个或多个角色的动画功能。而角色动画的目标就是让角色运动的时候,看起来更加真实。这个定义看起来就只能让人想到用3dMAX或者MAYA来做一个三维动画,但对于我们程序员来说,我觉得角色动画是你读进现有角色的3D模型与动画数据,然后将它们在你自己构建的场景中显示出来。在这里,你可以让角色按已有的动画数据运动,也可以按自己的规则行动。这里的角色不仅包涵人,还有任何动物,植物,甚至粒子。
在历史上,角色是绘画(图片或者是像素点表示)而来,而动作的表现是由切换不同造型的图片体现。
到现在,成熟的3D技术带给我们了方便简单又使用的3D动画。
每年都会涌现出很多新的角色动画技术,不断推动这这个领域的发展。这里我们会谈到的技术都不是当下最前沿的技术,但是它们都是这个前沿技术的基础。
二、 角色动画历史一览
现在让我们回到最开始的电脑游戏角色明星——吃豆人。这个由南梦宫于1980年推出的不完全披萨直到今天仍是最受欢迎的街机之一。四年后,吃豆人慢慢演变为一个更加偏人型的角色:Sir Graham(来自Sierra On-Line雪乐山的国王密使第一作Quest for the Crown)
Sir Graham比起同时代的吃豆人,拥有一套很好的动画,同时色彩也更加丰富。角色此后并未发现太大改进,直到80年代末,在稳定提升的角色像素数量与色彩的积累下,量变引发质变。卢卡斯艺术(Lucas Arts)发布了它们的第一版SCUMM引擎(Script Creation Utility for Maniac Mansion),同期也发布了很多冒险游戏,包括了猴岛小英雄(Monkey island,久闻大名啊),疯狂豪宅(Maniac Mansion),Loom(织布机?)。在80年代末90年代初这段时间,角色的动画大多都采用了相同了复杂程度(一个动作5幅画左右)
90年代到来,随之而来的是第一款3D游戏带来的一堆新问题。包涵德军司令部(Wolfenstein 3D,卡马克大神),毁灭战士(DOOM,还是卡马克大神)在内的许多著名游戏,由于敌人与角色仍然使用2D图形化对象(sprites)表示(绘制8个不同角度的画面,根据它们相对于玩家的方向判断显示),所以它们并不能叫做真正的3D游戏。第一个真正的3D角色是在1992发售的鬼屋魔影(Alone in the Dark),它的特色在与全3D与插值动画(interpolated animations)。
其角色只有极少的多边形,直接使用几个长方块构建了身体(每块表示一段肢体),就如上图所示。你能明显的看到角色关节间的间隙,但就当时的环境,模型上一般没有光照,同时分辨力太小,所以这些间隙一般在玩家眼里都被隐藏了。
再向前跳跃至1996年,正值3dfx公司第一次发售Voodoo芯片,它给大众们带来了支付得起的3D加速卡。雷神之锤(Quake,又是卡马克大神啊~~~)就是首先在这款产品中大展身手的著名游戏之一。同时雷神之锤通过渐变动画(vertex morphing顶点变形)给我们带来了无缝的角色,尽管细节粗糙(low-poly低多边形量)。
三、 渐变动画与骨骼动画
渐变动画(Morphinganimation or per-vertex animation)工作原理将两个(或多个)网格模型的每个顶点混合在一起。这两个网格模型需要拥有相同的顶点数量,同时它们的多边形的排列也要按照同一技术规则去工作。每个网格模型代表着这个角色的一个造型,同时也是变形的一个目标。超过一个的变形目标将会被混合到最终网格模型上。现在对于渐变动画的应用主要在于脸部表情。但是在过去,它同样被用于创建全身的动作。比如在雷神之锤一代和二代的引擎中,大受欢迎却又略显过时的MD2文件格式就使用这种方法处理它们的角色。(其实说白了渐变动画就是用一个型模,摆出两个不同的姿势,然后将这两个姿势的顶点信息混合在一个,然后通过改变其混合比例就可以调节出介于这两个目标姿势中的不同姿势)
三个从同一最终网格模型中随机组合出来的不同面部表情
让我们再快速的回到1998年,SierraStudios(雪乐山)发行了半条命(Half-Life,V社万岁~~~),半条命建立在经过高度改良版本的Quake引擎。最令人称道的是,V社添加了一个新的骨骼动画系统,允许他们将一套骨骼动画用在不同的角色上。
正如名字所意味着的,骨骼动画与骨骼的运作紧密的联系在了一起。人类的骨骼一般有206快骨头。这些骨头的状态与位置决定了这个人的造型。假使一块骨头从一个位置移到另外一处,它外围的肌肉,组织还有外面的皮肤都在随着它一起移动。这个简单的道理就是骨骼动画的关键。唯一的不同就是在电脑游戏中你只关心皮肤这最外面的显示出来的一层(即玩家所看到的)。在后面我们将会谈到蒙皮网格模型。
下面的图示就显示了一个忍者模型的骨骼与蒙皮后的模型本体。可以看到手的动作是与旁边手的骨骼是一致的。
自从半条命以来,角色的变得越来越精细,更多的多边形,更多的纹理,法线贴图(normal maps),先进的着色器。然而基础的技术却未曾改变太多。
这两个技术——骨骼动画与渐变动画,在今天的游戏发展中有着广阔的用途,我们将会全部讨论一遍。它们都有着优势与缺陷,骨骼动画更适合整体性的活动,而渐变动画更适合细节上的变化,比如面部表情。
原文地址:http://blog.csdn.net/ACWrong/article/details/25921705
自此本篇正文结束,希望大家喜欢,下篇将要说一下程序的框架与基本模型导入,让我们一起期待一下吧。最后再看一下卡马克大神,感谢他为我们带来了这么多的进步,希望我们能有一天向他靠拢。大家共勉。