3D游戏角色动画.doc
《3D游戏角色动画.doc》由会员分享,可在线阅读,更多相关《3D游戏角色动画.doc(25页珍藏版)》请在咨信网上搜索。
1、3D游戏角色动画 摘要:本文主要描述了3D游戏角色动画的原理及应用,从介绍微软的X文件到最为广泛应用的骨骼蒙皮动画,另外简要的介绍了下渐变动画的原理。关键词:Role Animation Skeletal Animation Morphing Animation Skinned Mesh Abstract:Introduce 3D Game Role Animation, for example Skeletal Animation and Skinned Mesh etc. 目录:一 概述3D角色动画的应用二 3D游戏动画基础-基于时间的运动三 3D游戏角色动画 1 介绍微软的X文件 2 骨
2、骼蒙皮动画的原理与实现 3 增加场景数据 4 简介渐变动画四 结束语正文:一 概述3D角色动画的应用3D角色动画是计算机动画技术的一个重要组成部分,也是计算机图形学的一个分支。无论是在离线渲染环境下,还是在实时渲染环境下,3D角色动画都得到了广泛的应用。在离线渲染环境下,主要应用于动画电影制作和各类广告制作。动画电影制作中所使用的3D角色动画技术的一个重要特点是动画数据量大,渲染需要耗费大量时间,因此动画作品必须预先制作,渲染,然后转化成视频文件播放。在实时渲染环境下,主要应用于虚拟现实,视频游戏,甚至是建模软件,动画制作软件。现在,随着计算机硬件技术的发展,特别是带有硬件加速功能的显卡性能的
3、提高,很多曾经只能在离线环境下应用的技术,都转移到实时渲染环境中来。其中,实时渲染的角色动画技术得到了发展且被广泛的应用。目前,实时角色动画技术大体可分为三种类型。第一类是关节动画(Skeletal Animation)。关节动画中的角色由若干独立的部分组成。每一个部分对应着一个独立的网格模型,不同的部分按照角色的特点组织成一个层次结构。比如说,一个人体模型可以由头,上身,左上臂,左前臂,左手,右上臂,右前臂,右手,左大腿,左小腿,左脚,右大腿,右小腿,右脚等各部分组成。而某个部分,可能是另一个部分的子节点,同时又是另一个部分的父节点。比如上面的人体模型中,右前臂就是右上臂的子节点,同时也是右
4、手的父节点。而右上臂是上身的子节点,后者则是躯体的子节点。通过改变不同部分之间的相对位置,比如夹角,位移等等,就可以实现所需要的各种动画效果。这类动画的优点很多。首先,在动画序列的关键帧中只需要存储节点间的相对变化,因此动画文件占用的空间很小。其次,可以实现很多复杂的动画效果,如果应用程序支持反向动力学还可以动态实现预先存储的动画序列之外的新的动画效果。当然这类动画也有不少缺点。其中之一是由于角色模型是一个层次模型,要获得某一个部分相对于世界坐标的位置,必须从根结点开始遍历该节点所有的祖先节点累计计算模型的世界变换。但最关键的问题是在不同部分的结合处往往会有很明显的接缝,这会严重的影响模型的真
5、实感。第二类是渐变动画(Morphing Animation)。这种动画中的角色由一系列的渐变网格模型构成。在动画序列的关键帧中记录着组成网格的各个顶点的新位置或者是相对于原位置的改变量。通过在相邻关键帧之间插值来直接改变该网格模型中各个顶点的位置就可以实现动画效果。相对于关节动画,单一网格模型动画的角色看上去更真实,也不会有关节动画所面临的接缝问题。由于没有使用层次模型,获得模型网格顶点在世界坐标中位置的计算量也很小。但是,这类动画的适应性很弱,角色很难通过实时计算来与环境进行良好的互动,以获得预先存储的动画序列之外的动画效果。另一方面,由于关键帧要存储网格模型所有的顶点信息,动画文件占用的
6、空间比较大。第三类是骨骼蒙皮动画(Skinned Mesh)。骨骼蒙皮动画可以看作是关节动画和渐变动画的结合。他同时兼有关节动画的灵活和渐变动画的逼真。后面将详细介绍骨骼蒙皮动画的技术细节。3D角色动画技术和其它动画技术相结合,就能创造出绚丽多彩的游戏世界。二 3D游戏动画基础-基于时间的运动在一个游戏项目中,计时扮演了一个重要的角色。基于时间的运动,也就是创建计时器来控制运动。它能够产生这样一种动画效果:同样处理10000毫秒的动画,在性能好的计算机上得到平滑完整的动画效果,在性能不好的计算机上显得跳帧,但也能够在10000毫秒的时候完成任务,和性能好的计算机是同步的。基本思路是事先设置好动
7、画关键帧序列,在主循环中判断出第一个动画关键帧和下一个动画关键帧的编号,利用一个时间计数器去定位相对于第一动画关键帧的位置。随着时间计数器的增长,不断从第一个动画关键帧的位置移动至下一个动画关键帧的位置。主要分为以下几个步骤:1设置动画关键帧序列。2计算出每一帧的时间Time,Time是相对于程序开始运行的毫秒数。3定位出第一个动画关键帧和下一个动画关键帧。4利用Time计算出相对于第一个动画关键帧的毫秒数,再利用这个偏移毫秒数计算出相对于第一个动画帧的偏移位置。5设置变换矩阵。6回到第2步。 上图表示了4帧的关键帧动画,其中第0帧和第3帧变换矩阵相同。下面直接看代码,我将结合代码详细叙述。t
8、ypedef struct sKeyframe DWORD Time; D3DMATRIX matTransformation; sKeyframe;/关键帧的结构,DWORD Time为执行该帧的时间,D3DMATRIX /matTransformation为在该帧时模型的变换矩阵。sKeyframe g_Keyframes4 = / Keyframe 0, 0ms 0, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1
9、.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f , / Keyframe 1, 40ms 400, 0.000796f, 1.000000f, 0.000000f, 0.000000f, -1.000000f, 0.000796f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 50.000000f, 0.000000f, 0.000000f, 1.000000f , / Keyframe 2, 80ms 800, -0.9999
10、99f, 0.001593f, 0.000000f, 0.000000f, -0.001593f, -0.999999f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 25.000000f, 25.000000f, 0.000000f, 1.000000f , / Keyframe 3, 120ms 1200, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f,
11、0.000000f, 1.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 1.000000f ;/定义了4帧的关键动画。其中第3帧和第0帧的变换矩阵一样,为了使动画能进入循环状态。void DoFrame() /此函数在循环内 static DWORD StartTime = timeGetTime(); DWORD Time = timeGetTime() - StartTime;/用timeGetTime()得到一个操作系统运行的毫秒数,储存到static变量以后将不再改变,/DWORD Time变量不断改变,为本程序运行的毫秒数。
12、Time %= (g_Keyframes3.Time+1);/得到一个不断从0到1200变化的毫秒数。 DWORD Keyframe = 0; / 从第0帧开始。 for(DWORD i=0;i= 某一关键帧的时间,将关键帧定位于此帧。 if(Time = g_Keyframesi.Time) Keyframe = i; DWORD Keyframe2 = (Keyframe=3) ? Keyframe:Keyframe + 1;/得到接下来的关键帧,如/果Keyframe为第3关键动画帧,Keyframe2也为第3关键动画帧。/当Keyframe=1200时这种情况才成立,几率很小。一般情况
13、下,Keyframe2=Keyframe+1。 DWORD TimeDiff = g_KeyframesKeyframe2.Time - g_KeyframesKeyframe.Time; if(!TimeDiff) TimeDiff=1;/计算两个sKeyframe的时间差,当Keyframe=Keyframe2=3时,TimeDiff=0,/此时另TimeDiff=1。 float Scalar = (float)(Time - g_KeyframesKeyframe.Time) / (float)TimeDiff; / Scalar取 /值为0,1),利用Time计算出相对于Keyfra
14、me的偏移毫秒数,再除以两/帧的时间差。 D3DXMATRIX matInt = D3DXMATRIX(g_KeyframesKeyframe2.matTransformation) - D3DXMATRIX(g_KeyframesKeyframe.matTransformation); matInt *= Scalar; /用于计算相对于Keyfrme的偏移位置。 matInt += D3DXMATRIX(g_KeyframesKeyframe.matTransformation); / 计算出该帧处相/对于Keyfrme的偏移位置。 g_pD3DDevice-SetTransform(D3
15、DTS_WORLD, &matInt); / 设置 world transformation matrix 设置完变换矩阵,剩下的事情就只是渲染了。创建计时器控制动画的技术是非常简单有效的,这是现代计算机游戏动画的基础,因此,必须深刻理解它的内容。三 3D游戏角色动画1 介绍微软的X文件 制作3D游戏角色动画需要与之相关的“动画容器”。这个“容器”中储存着动画的数据。微软的X文件正是这样的一种容器。由于微软的影响力,它们公司设计的X文件也广为流传。X文件是一套基于模版定义的文件,理论上它能够容纳任何数据。也就意味着不仅仅是3D模型文件,任何用于游戏引擎加载的外部资源都可以被包含于X文件之中。下
16、面我们详细的介绍下X文件。为了得到一个直观的印象,我们首先浏览下它的全貌。xof 0302txt 0032template Header DWORD major;DWORD minor;DWORD flags;template Frame FrameTransformMatrixMeshHeader 1;0;1;Frame Scene_Root FrameTransformMatrix 1.000000, 0.000000, 0.000000, 0.000000,0.000000, 1.000000, 0.000000, 0.000000,0.000000, 0.000000, 1.00000
17、0, 0.000000,0.000000, 0.000000, 0.000000, 1.000000; Frame Pyramid_Frame FrameTransformMatrix 1.000000, 0.000000, 0.000000, 0.000000,0.000000, 1.000000, 0.000000, 0.000000,0.000000, 0.000000, 1.000000, 0.000000,0.000000, 0.000000, 0.000000, 1.000000;Mesh PyramidMesh 5;0.00000;10.00000;0.00000;,-10.00
18、000;0.00000;10.00000;,10.00000;0.00000;10.00000;,-10.00000;0.00000;-10.00000;,10.00000;0.00000;-10.00000;6;3;0,1,2;,3;0,2,3;,3;0,3,4;,3;0,4,1;,3;2,1,4;,3;2,4,3;MeshMaterialList 1;6;0,0,0,0,0,0;Material Material0 1.000000; 1.000000; 1.000000; 1.000000;0.000000; 0.050000; 0.050000; 0.050000;0.000000;
19、0.000000; 0.000000; 首先看头文件xof 0302txt 0032。xof表示这是一个真正的X文件。0302txt表示通知程序使用Directx的X文件,版本为3.2的模版,其中txt表示此文件为文本文件,可读,并非是一个2进制文件。0032表示一个浮点数的位数为32,如果想要用64位的浮点数,可以写成0064。下面我们将按照以下七个步骤进行介绍和说明。第一,声明一个模版:假设声明 template ContactEntry ,首先需要用guidgen.exe产生一个GUID。产生的GUID如下:/ 4C9D055B-C64D-4bfe-A7D9-981F507E45FFDE
20、FINE_GUID(,0x4c9d055b, 0xc64d, 0x4bfe, 0xa7, 0xd9, 0x98, 0x1f, 0x50, 0x7e, 0x45, 0xff);之后需要在程序代码中加入:#include initguid.h/ At beginning of source code file - add DEFINE_GUIDsDEFINE_GUID(ContactEntry, 0x4c9d055b, 0xc64d, 0x4bfe, 0xa7, 0xd9, 0x98, 0x1f, 0x50, 0x7e, 0x45, 0xff);还要在X文件中加入:template Contact
21、Entry 这里介绍下声明模版用到的数据类型:关键字 描述WORD 16-bit value (short)DWORD 32-bit value (32-bit int or long)FLOAT IEEE float value (float)DOUBLE 64-bit floating-point value (double)CHAR 8-bit signed value (signed char)UCHAR 8-bit unsigned value (unsigned char)BYTE 8-bit unsigned value (unsigned char)STRING A NULL-
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 游戏 角色 动画
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【w****g】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【w****g】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。