青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

永遠(yuǎn)也不完美的程序

不斷學(xué)習(xí),不斷實踐,不斷的重構(gòu)……

常用鏈接

統(tǒng)計

積分與排名

好友鏈接

最新評論

Ogre骨骼動畫融合(轉(zhuǎn))

轉(zhuǎn)自http://www.guibian.com/article.asp?id=50

很多商業(yè)引擎都支持骨骼動畫融合這個功能。
融合可以讓你的動畫自然過渡到下一個動畫,你可以精確控制下一個動畫播放時間等信息。

Ogre其實也支持動畫的融合,只是Ogre并沒有給出代碼級的支持。
PS:Ogre很有意思,他天然支持很多東西,但是都沒有實現(xiàn)出來,需要你來實現(xiàn)。

好的,下面來通過代碼看看如果進(jìn)行一個簡單的骨骼動畫融合。
程序代碼 程序代碼


class AnimationBlender
{
public:
    enum BlendingTransition  //不同的混合方式
    {
        BlendSwitch,         // 直接切換到目標(biāo)動畫
        BlendWhileAnimating,   // 交叉淡入淡出(源動畫比例縮小,同時目標(biāo)動畫比例增大)
        BlendThenAnimate      // 淡出源動畫到目標(biāo)動畫第一幀,然后開始目標(biāo)動畫
    };

private:
    Entity *mEntity;
    AnimationState *mSource;
    AnimationState *mTarget;

    BlendingTransition mTransition;

    bool loop; //是否循環(huán)

    ~AnimationBlender() {}

public:
    Real mTimeleft, mDuration; //持續(xù)時間

    bool complete;

    void blend( const String &animation, BlendingTransition transition, Real duration, bool l );
    void addTime( Real );
    Real getProgress() { return mTimeleft/ mDuration; }
    AnimationState *getSource() { return mSource; }
    AnimationState *getTarget() { return mTarget; }
    AnimationBlender( Entity *);
    void init( const String &animation );
};


實現(xiàn)的代碼
程序代碼 程序代碼

void AnimationBlender::init(const String &animation)
{
    //初始化所有動作的AnimationState
    AnimationStateSet *set = mEntity->getAllAnimationStates();
    AnimationStateIterator it = set->getAnimationStateIterator();
    while(it.hasMoreElements())
    {
        AnimationState *anim = it.getNext();
        anim->setEnabled(false);
        anim->setWeight(0);
        anim->setTimePosition(0);
    }
    //初始化mSource
    mSource = mEntity->getAnimationState( animation );
    mSource->setEnabled(true);
    mSource->setWeight(1);
    mTimeleft = 0;
    mDuration = 1;
    mTarget = 0;
    complete=false;
}
void AnimationBlender::blend( const String &animation, BlendingTransition transition, Real duration, bool l )
{
    loop=l; //設(shè)置是否需要循環(huán)
    if( transition == AnimationBlender::BlendSwitch )
    {//如果混合方式為直接切換,改變mSource 即可
        if( mSource != 0 )
            mSource->setEnabled(false);
        mSource = mEntity->getAnimationState( animation );
        mSource->setEnabled(true);
        mSource->setWeight(1);
        mSource->setTimePosition(0);
        mTimeleft = 0;
    }
    else
    {
        //先取得新的動畫狀態(tài)
        AnimationState *newTarget = mEntity->getAnimationState( animation );
        if( mTimeleft > 0 ) //前一次的混合尚未結(jié)束
        {
            if( newTarget == mTarget )
            {
                // 新的目標(biāo)就是正在混合中的目標(biāo),什么也不做
            }
            else if( newTarget == mSource )
            {
                // 新的目標(biāo)是源動畫,直接go back
                mSource = mTarget;
                mTarget = newTarget;
                mTimeleft = mDuration - mTimeleft;
            }
            else
            {
                // 現(xiàn)在newTarget是真的新的動畫了
                if( mTimeleft < mDuration * 0.5 ) //上一次的混合進(jìn)度還未超過一半
                {
                    // 簡單替換Target就行了
                    mTarget->setEnabled(false);
                    mTarget->setWeight(0);
                }
                else //如果已經(jīng)過半,舊的target成為新的source
                {

                    mSource->setEnabled(false);
                    mSource->setWeight(0);
                    mSource = mTarget;
                }
                mTarget = newTarget;
                mTarget->setEnabled(true);
                mTarget->setWeight( 1.0 - mTimeleft / mDuration );
                mTarget->setTimePosition(0);
            }
        }
        else //上次的混合已經(jīng)結(jié)束,當(dāng)前未處于混合狀態(tài)中
        {
            mTransition = transition;
            mTimeleft = mDuration = duration;
            mTarget = newTarget;
            mTarget->setEnabled(true);
            mTarget->setWeight(0);
            mTarget->setTimePosition(0);
        }
    }
}
void AnimationBlender::addTime( Real time )
{
    if( mSource != 0 ) //若無AnimationState則不進(jìn)行操作
    {
        if( mTimeleft > 0 ) //兩個動畫仍在混合過程中
        {
            mTimeleft -= time;
            if( mTimeleft < 0 )
            {
                // 混合完畢,切換到目標(biāo)動畫
                mSource->setEnabled(false);
                mSource->setWeight(0);
                mSource = mTarget;
                mSource->setEnabled(true);
                mSource->setWeight(1);
                mTarget = 0;
            }
            else
            {
                // 仍然處于混合狀態(tài)中,改變兩個動畫的權(quán)值
                mSource->setWeight(mTimeleft / mDuration);
                mTarget->setWeight(1.0 - mTimeleft / mDuration);
                //在這種混合方式下,需要為目標(biāo)動畫增加時間
                if(mTransition == AnimationBlender::BlendWhileAnimating)
                    mTarget->addTime(time);
            }
        }
        if (mSource->getTimePosition() >= mSource->getLength())
        {
            complete=true;
        }
        else
        {
            complete=false;
        }
        mSource->addTime(time);
        mSource->setLoop(loop);
    }
}
AnimationBlender::AnimationBlender( Entity *entity ) : mEntity(entity){}



哈哈,相信你已經(jīng)看出來,這段代碼有很多很多的不足。比如只有骨骼動畫的融合,
而且還是寫死的,必須0.5。

我現(xiàn)在已經(jīng)擴展了這些功能,包括做到了骨骼動畫與定點動畫的融合,變形動畫的融合等等。而且可以精確控制融合的時機。你有什么好想法也歡迎與我討論

posted on 2010-01-18 10:47 狂爛球 閱讀(2357) 評論(1)  編輯 收藏 引用 所屬分類: 圖形編程

評論

# re: Ogre骨骼動畫融合(轉(zhuǎn)) 2011-06-01 09:09 ruibin

正在研究相關(guān)知識,能否將你實現(xiàn)的代碼傳一份,謝謝!!!!
郵箱:653396438@qq.com  回復(fù)  更多評論   

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久久久久高潮国产精品视| 亚洲欧洲日本专区| 久久激情视频免费观看| 免费欧美日韩国产三级电影| 一区二区高清视频| 欧美国产免费| 久久久91精品| 日韩视频一区二区| 校园激情久久| 国外成人性视频| 99re在线精品| 美女视频网站黄色亚洲| 久久国产视频网| 一区在线播放视频| 国产一区二区中文字幕免费看| 欧美国产日本韩| 亚洲最新视频在线播放| 久久亚洲综合色| 亚洲视频www| 麻豆freexxxx性91精品| 欧美一区二区视频网站| 中文在线资源观看网站视频免费不卡 | 六月婷婷一区| 欧美jjzz| 亚洲免费在线精品一区| 激情成人av| 国产性色一区二区| 国产精品99免费看 | 久久精品五月| 国产一区二区成人久久免费影院| 日韩亚洲欧美一区二区三区| 国产一区二区三区精品欧美日韩一区二区三区 | 亚洲国产欧美一区二区三区同亚洲 | 久久国产精品亚洲va麻豆| 久久疯狂做爰流白浆xx| 亚洲视频精选在线| 国产主播精品在线| 国产日本欧美视频| 欧美激情亚洲精品| 免费成人在线观看视频| 亚洲国内自拍| 亚洲免费观看在线观看| 在线视频精品一| 久久激情一区| 国产精品天天看| 国产视频在线观看一区二区三区| 欧美亚洲一级| 久久一区二区视频| 久久综合伊人| 欧美日韩精品伦理作品在线免费观看 | 欧美一级成年大片在线观看| 日韩视频一区二区三区在线播放免费观看| 亚洲精品一级| 欧美亚洲午夜视频在线观看| 亚洲国产高清在线观看视频| 亚洲精品三级| 一区二区三区国产精品| 久久久久久久尹人综合网亚洲| 欧美国产欧美亚洲国产日韩mv天天看完整 | 亚洲国产精品黑人久久久| 激情久久久久久久| 亚洲精品免费电影| 亚洲欧美日韩一区| 久久精品青青大伊人av| 亚洲国产精品久久久久秋霞不卡| 亚洲无线观看| 欧美一区二区成人6969| 欧美激情欧美激情在线五月| 午夜精品久久久久久| 激情婷婷亚洲| 麻豆成人小视频| 久久精品免费| 含羞草久久爱69一区| 久久av一区| 午夜亚洲福利| 在线播放视频一区| 一区二区三区欧美在线| 亚洲激情在线观看视频免费| 久久黄色影院| 亚洲黄色尤物视频| 欧美中文字幕视频在线观看| 午夜精品国产更新| 欧美亚洲成人网| 日韩午夜在线电影| 欧美成人在线免费观看| 欧美国产综合| 在线欧美电影| 亚洲国产精品一区二区www| 亚洲欧美精品| 国产精品视频大全| 欧美69wwwcom| 欧美日本亚洲视频| 欧美亚洲日本网站| 亚洲欧美国产va在线影院| 亚洲精选在线| 亚洲神马久久| 国内精品国语自产拍在线观看| 亚洲图片在线| 久久精品综合| 亚洲天堂免费在线观看视频| 久久久久青草大香线综合精品| 午夜精品久久久久久99热| 午夜精品一区二区三区在线| 日韩视频在线观看| 一个色综合导航| 一本久道综合久久精品| 欧美日韩亚洲综合| 欧美中文字幕在线| 欧美精品在欧美一区二区少妇| 久久精品国产久精国产一老狼 | 久久人人九九| 亚洲人成在线影院| 久久国产一区二区三区| 中文一区字幕| 久久精品卡一| 亚洲永久免费观看| 久久婷婷激情| 久久爱另类一区二区小说| 亚洲欧洲在线看| 久久高清国产| 亚洲四色影视在线观看| 欧美大片免费观看| 欧美一区二区三区在线| 噜噜噜噜噜久久久久久91| 亚洲视频在线二区| 欧美大片在线观看一区| 午夜一区不卡| 欧美视频在线观看视频极品| 久久久久女教师免费一区| 一本色道久久综合| 黄色小说综合网站| 亚洲一级电影| 日韩视频一区| 国产精品视频内| 久久成年人视频| 欧美.日韩.国产.一区.二区| 亚洲美女色禁图| 欧美激情精品久久久久久| 国内精品久久久久久久影视麻豆 | 欧美日韩成人一区二区| 欧美不卡视频| 亚洲综合导航| 黑人巨大精品欧美黑白配亚洲| 最新日韩在线视频| 国产亚洲精品久| 欧美精品福利在线| 最新国产拍偷乱拍精品| 久久激情一区| 亚洲欧美一区二区三区久久 | 一本色道久久综合| 国产精品免费在线| 日韩午夜电影| 亚洲一区二区精品| 韩国三级电影久久久久久| 亚洲欧美日韩成人高清在线一区| 激情视频一区二区| 亚洲电影免费在线| 欧美中文字幕在线视频| 亚洲欧美经典视频| 夜夜夜久久久| 在线精品视频免费观看| 国产亚洲精品7777| 国产亚洲精品久久久久婷婷瑜伽| 久久亚洲免费| 欧美中文在线观看| 欧美一级二级三级蜜桃| 一区二区三区视频在线观看| 久久se精品一区精品二区| 亚洲一区视频在线| 午夜视频在线观看一区| 亚洲国产精品免费| 国内成人精品一区| 久久久夜夜夜| 中文一区字幕| 亚洲天堂免费观看| 欧美麻豆久久久久久中文| 午夜精品成人在线视频| 亚洲男人第一av网站| 欧美一区二区精美| 洋洋av久久久久久久一区| 亚洲在线不卡| 欧美激情一区二区三级高清视频| 欧美国产1区2区| 亚洲精品国产精品国自产在线| 久久久久久69| 农村妇女精品| 亚洲少妇自拍| 国产精品久久久久久福利一牛影视 | 欧美日韩国产色综合一二三四| 欧美亚洲综合久久| 欧美韩日一区二区| 国产精品久久久久久久久久妞妞| 国产欧美日韩在线观看| 国产一区三区三区| 亚洲精品欧美日韩| 亚洲综合清纯丝袜自拍| 卡一卡二国产精品| 久久久久国产一区二区| 国产精品99久久久久久久久久久久 | 久久免费的精品国产v∧|