共有回帖数 0 个
-
多动画集在D3D下的渲染 对于只包含一个关键帧.x文件的渲染,无论是图书还是论坛都有很多介绍,可是对于包含多个动画的.x文件的渲染,却很少提及,可是在实际的游戏场景中,单桢动画的应用几乎很少,人物不但要能表现站立、行走的简单动作,还要表现施放魔法等复杂的动作。那么怎么才能渲染这些动作呢? SDK里面的MultiAnimation例子介绍了这种方法,可是由于代码很长,不易理解,下面介绍笔者根据这个例子的理解,提炼例子中的关键部分,以实现多关键帧动画的渲染。 以下内容用到单桢动画渲染的一些知识的,在此不再介绍。 实现多动画集动画的关键是使用动画控制器。动画控制器(ID3DXANIMATIONCONTROLLER)提供了多种函数用于动画的控制。实现多动画,要使控制器指向一个单一的动画集,通过改变控制器所使用的动画集,实现不同动画的渲染。 我们打开tiny_4anim.x,搜索AnimationSet,可以发现该文件包含了Loiter、Walk、Jog、Wave四种动画。其中每个AnimationSet对象都包含了对应的角色运动信息。对于只包含一个动作的Tiny.x,它就只包含一个AnimationSet对象。 所以,我们只需要在单桢动画的基础上做一点改进,就可以实现多动作的渲染了。在装入.x文件数据的时候,我们调用D3DXLoadMeshHierarchyFromX()函数后,在最后一个参数中得到一个动画控制器。LPD3DXANIMATIONCONTROLLER接口的控制器提供了许多对播放动画进行控制的函数。对于单桢动画,在控制器设置AdvanceTime()步进之后,就可以渲染了。对于多帧动画,按下面修改程序之后,就可以播放指定的动画了。 //#defineIDLE_TRANSITION_TIME0.125f //#defineMOVE_TRANSITION_TIME0.25f hr=D3DXLoadMeshHierarchyFromX(strFileName,D3DXMESH_MANAGED,m_pd3dDevice,&Alloc,NULL,&m_pFrameRoot,&m_pAnimController); LPD3DXANIMATIONSETppAnimSet=NULL; DWORDdwNewTrack=0; m_pAnimController-GetAnimationSetByName("Jog",&ppAnimSet); m_pAnimController-SetTrackAnimationSet(dwNewTrack,ppAnimSet); ppAnimSet-Release(); m_pAnimController-UnkeyAllTrackEvents(dwNewTrack); m_pAnimController-SetTrackEnable(dwNewTrack,TRUE); m_pAnimController-KeyTrackSpeed(dwNewTrack,1.0f,0.01f,MOVE_TRANSITION_TIME,D3DXTRANSITION_LINEAR); m_pAnimController-KeyTrackWeight(dwNewTrack,1.0f,0.01f,MOVE_TRANSITION_TIME,D3DXTRANSITION_LINEAR); 其中GetAnimationSetByName()函数通过第一个LPCSTR类型参数,传入一个动画集的名称,这些数据传给ID3DXAnimationSet接口的ppAnimSet,成为一个特定的Set(姑且这么叫吧),之后SetTrackAnimationSet()函数接受这个Set,并把它标志为dwNewTrack,作为一个Track,之后UnkeyAllTrackEvents函数把dwNewTrack这个Track的所有事件全部清空,再设置它为控制器的一个Track,之后通过设置Speed和Weight,这个动画控制器实际上只保存了在GetAnimationSetByName()函数中指定的动画集,那么在后面的渲染中,出现的动画就只有这一个动画了。 需要注意的是,一定要给dwNewTrack一个初值,不然可能发生错误。 下面的函数是我写的类里面的一个函数,该函数通过传入的动画集名字,设置动画控制器所使用的动画集。 //DWORDdwTrack[10]; //LPD3DXANIMATIONCONTROLLERg_pAC; HRESULTCSkinMesh::SetAnimByName(charcString[]) { HRESULThr; LPD3DXANIMATIONSETppAnimSet=NULL; if(FAILED(hr=g_pAC-GetAnimationSetByName(cString,&ppAnimSet))) //根据动画集名字获取动画的set returnhr; g_pAC-SetTrackAnimationSet(dwTrack[1],ppAnimSet);//设置一个track ppAnimSet-Release();//释放之前的那个set g_pAC-UnkeyAllTrackEvents(dwTrack[1]);//除去track里其他的事件 g_pAC-SetTrackEnable(dwTrack[1],TRUE);//设置控制器使用当前的track g_pAC-KeyTrackSpeed(dwTrack[1],1.0f,0.01f,MOVE_TRANSITION_TIME,D3DXTRANSITION_LINEAR);//设置track的动画参数 hr=g_pAC-KeyTrackWeight(dwTrack[1],1.0f,0.01f,MOVE_TRANSITION_TIME,D3DXTRANSITION_LINEAR);//设置trcak的权重参数 returnhr; } 南京工程学院小明同学见习报告 ps:很高兴看到有几个网站引用了本人的这篇文章。这是我的处女作,呵呵,多批评,大家可以联系qq:453744327 本人目前正在制作一款rpg游戏,写了一半了吧,正在从事相同工作的朋友可以联系我,一起进步.

楼主 2015-07-06 10:38 回复
Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号
意见反馈 |
关于直线 |
版权声明 |
会员须知