多动画集在D3D下的渲染

多动画集在D3D下的渲染
对于只包含一个关键帧.x文件的渲染,无论是图书还是论坛都有很多介绍,可是对于包含多个动画的.x文件的渲染,却很少提及,可是在实际的游戏场景中,单桢动画的应用几乎很少,人物不但要能表现站立、行走的简单动作,还要表现施放魔法等复杂的动作。那么怎么才能渲染这些动作呢?
SDK里面的MultiAnimation 例子介绍了这种方法,可是由于代码很长,不易理解,下面介绍笔者根据这个例子的理解,提炼例子中的关键部分,以实现多关键帧动画的渲染。
以下内容用到单桢动画渲染的一些知识的,在此不再介绍。
实现多动画集动画的关键是使用动画控制器。动画控制器(ID3DXANIMATIONCONTROLLER)提供了多种函数用于动画的控制。实现多动画,要使控制器指向一个单一的动画集,通过改变控制器所使用的动画集,实现不同动画的渲染。
我们打开tiny_4anim.x,搜索AnimationSet,可以发现该文件包含了Loiter、Walk、Jog、Wave四种动画。其中每个AnimationSet对象都包含了对应的角色运动信息。对于只包含一个动作的Tiny.x,它就只包含一个AnimationSet对象。
所以,我们只需要在单桢动画的基础上做一点改进,就可以实现多动作的渲染了。在装入.x文件数据的时候,我们调用D3DXLoadMeshHierarchyFromX()函数后,在最后一个参数中得到一个动画控制器。LPD3DXANIMATIONCONTROLLER接口的控制器提供了许多对播放动画进行控制的函数。对于单桢动画,在控制器设置AdvanceTime()步进之后,就可以渲染了。对于多帧动画,按下面修改程序之后,就可以播放指定的动画了。
//#define IDLE_TRANSITION_TIME 0.125f
//#define MOVE_TRANSITION_TIME 0.25f

 

hr = D3DXLoadMeshHierarchyFromX(strFileName, D3DXMESH_MANAGED, m_pd3dDevice, &Alloc, NULL, &m_pFrameRoot, &m_pAnimController);

LPD3DXANIMATIONSET   ppAnimSet=NULL;
DWORD dwNewTrack=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一个初值,不然可能发生错误。
下面的函数是我写的类里面的一个函数,该函数通过传入的动画集名字,设置动画控制器所使用的动画集。
//DWORD dwTrack[10];
//LPD3DXANIMATIONCONTROLLER g_pAC;
HRESULT CSkinMesh::SetAnimByName(char cString[])
{
HRESULT hr;
LPD3DXANIMATIONSET   ppAnimSet=NULL;

if(FAILED(hr=g_pAC->GetAnimationSetByName(cString,&ppAnimSet)))
//根据动画集名字获取动画的set
return hr;
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的权重参数

return hr;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在d3d中,要实现纹理渲染并旋转,可以通过以下步骤来实现。 首先,需要加载纹理图像并创建一个纹理对象。通过使用d3d提供的函数,可以加载某个图像文件作为纹理,并创建一个纹理对象来保存它。例如,使用D3DXCreateTextureFromFile()函数可以从文件加载纹理,并创建一个纹理对象。 然后,需要定义一个图形对象并将纹理绑定到它上面。可以通过定义一个顶点缓冲区来定义图形对象的形状,并将纹理绑定到这个顶点缓冲区上。在顶点缓冲区中,每个顶点都包含了位置和纹理坐标信息。可以使用d3d的函数来定义顶点缓冲区,并填充相应的数据。 接下来,需要使用着色器来对图形对象进行渲染。使用着色器可以实现对图形对象的变换和渲染效果的添加。在着色器中,可以使用转换矩阵来实现旋转操作。通过改变转换矩阵中的旋转参数,可以实现对图形对象的旋转。可以使用d3d提供的函数来加载和设置着色器,并将其应用到图形对象上。 最后,需要在渲染循环中,对图形对象进行绘制和渲染操作。通过使用d3d的函数来开始渲染,绑定纹理和着色器,并调用绘制函数来绘制图形对象。在每次循环中,可以通过改变旋转参数来实现对图形对象的旋转效果。 综上所述,要实现d3d的纹理渲染和旋转,需要加载纹理图像并创建纹理对象,定义一个图形对象并将纹理绑定到它上面,使用着色器实现渲染效果和旋转操作,最后在渲染循环中进行绘制和渲染操作。这样就可以实现d3d纹理渲染和旋转了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值