签到

05月19日
尚未签到

共有回帖数 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 回复

共有回帖数 0
  • 回 帖
  • 表情 图片 视频
  • 发表

登录直线网账号

Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号 意见反馈 | 关于直线 | 版权声明 | 会员须知