游戏开发论坛

 找回密码
 立即注册
搜索
查看: 8898|回复: 2

[原创]多动画集在D3D下的渲染

[复制链接]

9

主题

28

帖子

49

积分

注册会员

Rank: 2

积分
49
发表于 2007-8-9 21:19:00 | 显示全部楼层 |阅读模式
                                 多动画集在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;
}
                                                                               
                                                                                                                       
南京工程学院    小明同学见习报告

ps:很高兴看到有几个网站引用了本人的这篇文章。这是我的处女作,呵呵,多批评,大家可以联系qq:453744327
本人目前正在制作一款rpg游戏,写了一半了吧,正在从事相同工作的朋友可以联系我,一起进步.

sf_200789211842.jpg

18

主题

493

帖子

494

积分

中级会员

Rank: 3Rank: 3

积分
494
发表于 2007-8-9 22:50:00 | 显示全部楼层

Re:[原创]多动画集在D3D下的渲染

背景好`诡异``
`
外星球额``

2

主题

429

帖子

435

积分

中级会员

Rank: 3Rank: 3

积分
435
发表于 2007-8-10 00:16:00 | 显示全部楼层

Re:[原创]多动画集在D3D下的渲染

sdk的面包圈里的背景?

人物的动作很诡异啊~~~~~~

外星人
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-25 13:03

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表