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

的筆記

隨時(shí)隨地編輯

Ogre骨骼動畫分析

http://3dlearn.googlecode.com/files/ogre skeleton animation.pdf

歡迎指出文中錯(cuò)誤

1  前言

骨骼蒙皮動畫分兩步驟進(jìn)行:根據(jù)時(shí)間插值更新骨骼、然后根據(jù)骨骼更新每骨骼上的頂點(diǎn)。為了好玩,暫且這樣看:在每一個(gè)時(shí)間點(diǎn),對每一個(gè)骨骼,我們創(chuàng)建一個(gè)骨骼魔法,并將骨骼魔法施放到每一個(gè)骨頭上;有個(gè)這些骨骼然后我們開始蒙皮,我們找出每一寸皮膚(一個(gè)頂點(diǎn)),并從骨堆里找出這塊皮需要依附的骨頭,當(dāng)然骨頭的數(shù)量都是有限的,一般就十幾或翻倍的數(shù)量級,所以骨頭還是比價(jià)好找的。我們將皮貼到骨頭上,貼完所有的皮,我們就得到了一個(gè)骨頭人鳥。看起來很形象:
 

下頁示意圖少兒不宜.

 

 

 

 

2  類圖

 <只能看pdf>

 

3  邏輯切片

不解釋.

 

渲染

Root::renderOneFrame()

->Root::_updateAllRenderTargets

->RenderSystem::_updateAllRenderTargets()

->RenderWindow::update()

->D3D9RenderWindow::update(bool swap)

->RenderTarget::update()

->Viewport::update()

->Camera::_renderScene()

->SceneManager::_renderScene(Camera* camera, Viewport* vp, bool includeOverlays)

 

4  更新骨骼

只考慮線性插值更新骨骼的情況.

4.1  創(chuàng)建一個(gè)骨骼魔法

創(chuàng)建一根骨頭需要的魔法。言歸正傳,其實(shí)就是創(chuàng)建一個(gè)TransformKeyFrame對象,看做一個(gè)全變換,一個(gè)變換只能應(yīng)用到一個(gè)骨骼上。當(dāng)前動作有24根骨頭,在每幀里,你需要對著24根骨頭施加24次骨骼魔法,如果美術(shù)認(rèn)為男人應(yīng)該是23根骨頭少畫了一根,可以不用糾結(jié),知道這不是bug就行。

一個(gè)骨骼文件看起來像這樣:

 

 

左邊定義的是骨頭,右邊定義的是動作。恩,這里只有18根骨頭,可以認(rèn)為這個(gè)不是人類骨骼數(shù)據(jù)。在程序?qū)崿F(xiàn)上,事實(shí)上考慮的術(shù)語叫joint,看起來像只是一個(gè)質(zhì)點(diǎn),可以這樣理解,一個(gè)joint是一個(gè)空間射線,它表示了一個(gè)空間變化,也即一次旋轉(zhuǎn)縮放平移。當(dāng)然,它是一個(gè)矩陣,可以分解成一個(gè)平移和一個(gè)四元素變換。這時(shí)候似乎沒有骨骼的長度,可以認(rèn)為這個(gè)joint表示的只是骨頭的關(guān)節(jié)處,骨頭的長度隱藏在2個(gè)關(guān)節(jié)之間了。

右邊描述的是動作,一個(gè)動作是所有的joint在時(shí)間軸上的一個(gè)個(gè)切片組成的。恩,為了便于組織數(shù)據(jù),ogrejoint分類關(guān)鍵時(shí)間。其實(shí)也可以用關(guān)鍵時(shí)間來分類joint。恩,這其實(shí)也是一個(gè)很好的優(yōu)化方式,如果關(guān)鍵幀分類下省略了joint,就表示這個(gè)joint不需要變換,其對應(yīng)的頂點(diǎn)都不需要進(jìn)行重新蒙皮計(jì)算了。例如一個(gè)人在揮手,假設(shè)全身只有手在揮舞,當(dāng)然這動作應(yīng)看起來像個(gè)僵尸。按ogre現(xiàn)在的實(shí)現(xiàn),這個(gè)wave下的所有24(為了男女平等考慮男人和女人都是24根骨頭)個(gè)joint都必須有關(guān)鍵時(shí)間,就算關(guān)鍵時(shí)間少幾處,也會將所有的joint進(jìn)行插值。這個(gè)時(shí)候避開某個(gè)joint被蒙皮,只有在這個(gè)動作下刪掉某個(gè)joint了。這徹頭徹尾就是個(gè)機(jī)器人鳥。如果用改進(jìn)的分類方式,在某個(gè)關(guān)鍵字里,可以省略一些joint,這樣一個(gè)人邊揮手邊輕邊擺頭還是可以實(shí)現(xiàn)的。

       創(chuàng)建一個(gè)骨頭魔法分兩步,第一部是取到當(dāng)前時(shí)間點(diǎn)在關(guān)鍵幀中的插值系數(shù),第二部是根據(jù)這個(gè)插值系數(shù)對這個(gè)骨頭進(jìn)行插值。

t=(i-k1)/(k2-k1)

 

 

可以看到移動和縮放非常好理解,都是進(jìn)行的一次線性插值。只有旋轉(zhuǎn)使用了四元素的歸一化線性插值。兩個(gè)旋轉(zhuǎn)的插值似乎也只能用四元素插值,矩陣插值聽說有這樣那樣的問題。這個(gè)插值有誤差,并且不是恒速插值。

 

核心算法也是基本的線性插值公式,灰常神奇

q1+(q2-q1)*k

 

 

4.2  更新動畫時(shí)間

AnalyzeAnimation.exe!AnalyzeAnimation::frameRenderingQueued

OgreMain_d.dll!Ogre::Root::_fireFrameRenderingQueued

OgreMain_d.dll!Ogre::Root::_fireFrameRenderingQueued

OgreMain_d.dll!Ogre::Root::_updateAllRenderTargets

OgreMain_d.dll!Ogre::Root::renderOneFrame

OgreMain_d.dll!Ogre::Root::startRendering

AnalyzeAnimation.exe!BaseApplication::go

AnalyzeAnimation.exe!WinMain

 

4.3  骨骼動畫的核心玩法(更新骨骼)

OgreMain_d.dll!Ogre::NodeAnimationTrack::applyToNode

OgreMain_d.dll!Ogre::Animation::apply

OgreMain_d.dll!Ogre::Skeleton::setAnimationState

OgreMain_d.dll!Ogre::Entity::cacheBoneMatrices

OgreMain_d.dll!Ogre::Entity::updateAnimation

OgreMain_d.dll!Ogre::Entity::_updateRenderQueue

OgreMain_d.dll!Ogre::RenderQueue::processVisibleObject

OgreMain_d.dll!Ogre::SceneNode::_findVisibleObjects

OgreMain_d.dll!Ogre::SceneNode::_findVisibleObjects

OgreMain_d.dll!Ogre::SceneManager::_findVisibleObjects

OgreMain_d.dll!Ogre::SceneManager::_renderScene

OgreMain_d.dll!Ogre::Camera::_renderScene

OgreMain_d.dll!Ogre::Viewport::update

OgreMain_d.dll!Ogre::RenderTarget::_updateViewport

RenderSystem_Direct3D9_d.dll

OgreMain_d.dll!Ogre::RenderTarget::_updateAutoUpdatedViewports

OgreMain_d.dll!Ogre::RenderTarget::updateImpl

OgreMain_d.dll!Ogre::RenderTarget::update

OgreMain_d.dll!Ogre::RenderSystem::_updateAllRenderTargets

OgreMain_d.dll!Ogre::Root::_updateAllRenderTargets              --->先更新幀監(jiān)聽,再更新實(shí)體

OgreMain_d.dll!Ogre::Root::renderOneFrame

OgreMain_d.dll!Ogre::Root::startRendering

AnalyzeAnimation.exe!BaseApplication::go

AnalyzeAnimation.exe!WinMain

 

TransformKeyFrame 看做一個(gè)全變換.

 

對骨骼(bone/node)進(jìn)行變換的流程

輸入:節(jié)點(diǎn)、時(shí)間(省略權(quán)值和縮放)

輸出:節(jié)點(diǎn)的全變換

 

構(gòu)造出插值關(guān)鍵幀全變換buffer(TransformKeyFrame kf)

從關(guān)鍵幀buffer釋放一個(gè)平移buffer

對節(jié)點(diǎn)施加平移buffer (省略權(quán)值與縮放)

從關(guān)鍵幀buffer釋放一個(gè)旋轉(zhuǎn)buffer

對節(jié)點(diǎn)施加旋轉(zhuǎn)buffer

從關(guān)鍵幀buffer釋放一個(gè)縮放buffer

對節(jié)點(diǎn)施加一個(gè)縮放buffer

 

 

每幀對每一個(gè)骨骼(這里蛻化成node)4個(gè)關(guān)鍵幀buffer,正是骨骼動畫的核心玩法。

 

4.3.1  釋放一個(gè)關(guān)鍵幀魔法

關(guān)鍵幀魔法需要創(chuàng)建一個(gè)特殊的buffer,即關(guān)鍵幀全變換buffer(TransformKeyFrame).

 

 

 

5  蒙皮

Ogre蒙皮算法的核心是對每頂點(diǎn)進(jìn)行對應(yīng)骨骼的全變換。

 

V=M4*V

分兩步進(jìn)行,第一步在Mesh::softwareVertexBlend中準(zhǔn)備好計(jì)算數(shù)據(jù)結(jié)構(gòu)的上下文,第二步在softwareVertexSkinning中進(jìn)行每頂點(diǎn)的蒙皮計(jì)算。

 

 

處理軟件索引頂點(diǎn)混合,本意是用于骨骼動畫,但是也可用于其他用途.

 

 

 

const VertexData*

sourceVertexData

 

const VertexData*

targetVertexData

 

const Matrix4* const*

blendMatrices

 

size_t

numMatrices,

 

bool

blendNormals

 

 

sourceVertexData

頂點(diǎn),法線,混合索引,混合權(quán)重

 

targetVertexData

目標(biāo)的頂點(diǎn),混合版本的法線緩存.需要注意向量的歸一化.

 

blendMatrices

指向一個(gè)用于混合的矩陣數(shù)組,sourceVertexData的混合指數(shù)索引.

 

numMatrices

blendMatrices中矩陣數(shù)組的數(shù)量

 

blendNormals

true表示法線也同頂點(diǎn)一起混合.

 

 

 

 

srcElemPos

源頂點(diǎn)

 

srcElemNorm

源法線

 

srcElemBlendIndices

源混合索引

 

srcElemBlendWeights

源混合權(quán)重

 

 

 

 

 

 

 

srcPosBuf      

源頂點(diǎn)緩存

 

srcIdxBuf      

源索引緩存

 

srcWeightBuf 

源權(quán)重緩存

 

srcNormBuf

源法線緩存

 

destElemPos

目頂點(diǎn)

 

destElemNorm

目法線

 

      

 

 

destPosStride

目法線跨步

 

 

 

 

 

 

 

5.2  蒙皮核心算法

核心算法如下

 

 

首先對頂點(diǎn)進(jìn)行計(jì)算

ü 找到當(dāng)前的混合索引值

ü 用這個(gè)值索引出混合矩陣M4

ü M4左乘以頂點(diǎn)V1(*)得到V2

ü V2進(jìn)行加權(quán)計(jì)算得到V3(=V2*weight)

ü V3歸一處理得到V4(=V3.normalized)

 

然后對法線進(jìn)行同樣過程的計(jì)算,只是上面流程中的(*) 處的V1換成法線.如果一個(gè)頂點(diǎn)存在多個(gè)權(quán)重值,需要對每一個(gè)權(quán)值重復(fù)上面的14步驟進(jìn)行累積計(jì)算到V3.一次頂點(diǎn)計(jì)算完成,即對下一個(gè)頂點(diǎn)進(jìn)行同樣的計(jì)算過程.所有頂點(diǎn)計(jì)算完成,即完成了骨骼蒙皮.

posted on 2012-07-25 23:42 的筆記 閱讀(4836) 評論(3)  編輯 收藏 引用

評論

# re: Ogre骨骼動畫分析 2013-05-09 22:55 eryar

Good!
Mark...  回復(fù)  更多評論   

# re: Ogre骨骼動畫分析 2013-10-28 11:08 渣漿泵

扔下太久了,看著好累  回復(fù)  更多評論   

# re: Ogre骨骼動畫分析[未登錄] 2014-09-02 16:58 albert

內(nèi)容看的有些懂了,不過作者很有意思  回復(fù)  更多評論   


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美一区二区三区精品| 免费成人毛片| 国产精品一区二区你懂的| 免费视频一区| 久久日韩粉嫩一区二区三区| 久久久精品一区二区三区| 久久精品视频免费| 另类图片国产| 欧美人成在线| 国产日韩在线视频| 国产曰批免费观看久久久| 国产亚洲欧美aaaa| 91久久久久久久久| 亚洲一区视频在线观看视频| 欧美一区二区三区在线| 久久精品一区二区| 欧美黄色一区| 一本色道久久加勒比88综合| 一区二区三区日韩欧美| 欧美一区二区三区喷汁尤物| 久久久久久穴| 欧美日韩亚洲一区三区| 国产麻豆精品视频| 亚洲国产天堂久久国产91| 一区二区av| 久久免费少妇高潮久久精品99| 免费在线日韩av| 日韩一级免费观看| 久久精品日韩欧美| 国产精品理论片在线观看| 国产一区二区精品丝袜| 亚洲人在线视频| 久久er99精品| 91久久在线观看| 亚洲一区二区精品视频| 美女视频黄a大片欧美| 国产精品色网| 一区二区三区国产在线观看| 久久先锋影音av| 亚洲影院在线| 欧美新色视频| 日韩视频在线一区二区三区| 久久久水蜜桃av免费网站| 99精品99| 欧美黄色日本| 18成人免费观看视频| 性欧美1819sex性高清| 欧美激情精品久久久久久蜜臀| 午夜精品成人在线视频| 欧美视频中文在线看| 亚洲精品欧洲精品| 欧美福利一区二区| 久久国产精品久久久| 国产欧美一区二区精品仙草咪 | 国内久久精品| 午夜在线播放视频欧美| 亚洲精品一二三区| 亚洲人成网站777色婷婷| 欧美在线观看日本一区| 国产精品欧美久久| 中文亚洲视频在线| 亚洲精品国精品久久99热| 欧美成人精品h版在线观看| 一区精品久久| 久热精品视频在线| 久久久在线视频| 在线观看av不卡| 欧美xart系列高清| 欧美aⅴ一区二区三区视频| 亚洲欧洲另类国产综合| 欧美激情网站在线观看| 欧美电影免费观看高清| 日韩午夜av在线| aⅴ色国产欧美| 国产精品欧美经典| 久久亚洲精品一区二区| 久久免费高清视频| 亚洲精品日韩在线| 一本大道久久a久久精二百| 国产精品久在线观看| 欧美一区二区视频免费观看| 欧美一二三视频| 亚洲第一成人在线| 亚洲靠逼com| 国产精品综合网站| 欧美aⅴ一区二区三区视频| 欧美激情精品久久久久久大尺度| 中文在线一区| 欧美一级免费视频| 亚洲国产一二三| 99精品久久免费看蜜臀剧情介绍| 国产精品日韩在线| 免费高清在线一区| 欧美日韩成人综合在线一区二区 | 日韩视频免费观看高清完整版| 欧美日韩亚洲系列| 久久伊人精品天天| 欧美福利视频在线| 欧美在线啊v一区| 你懂的视频一区二区| 亚洲直播在线一区| 久久人人97超碰国产公开结果| 亚洲精品乱码| 午夜精品999| 一区二区三区www| 久久成人精品| 亚洲专区欧美专区| 欧美成人国产va精品日本一级| 亚洲欧美日韩高清| 欧美国产欧美亚州国产日韩mv天天看完整 | 在线综合+亚洲+欧美中文字幕| 国产亚洲欧美日韩在线一区| 亚洲国产成人av| 国产亚洲一区在线播放| 日韩午夜精品视频| 最近中文字幕日韩精品| 久久人人九九| 欧美视频精品一区| 亚洲丁香婷深爱综合| 国产一区二区中文字幕免费看| 99精品99| av成人老司机| 免费黄网站欧美| 久久躁日日躁aaaaxxxx| 国产精品免费网站在线观看| 亚洲免费av电影| 亚洲免费电影在线| 蜜桃av一区二区在线观看| 老**午夜毛片一区二区三区| 国产精品视频你懂的| 亚洲人精品午夜| 亚洲日本一区二区三区| 久久伊人精品天天| 久热这里只精品99re8久| 国产欧美日韩另类视频免费观看| 99国产精品久久| 一区二区三欧美| 欧美四级在线| 中文无字幕一区二区三区| 一本久道久久综合中文字幕| 免费观看成人网| 亚洲福利久久| av成人天堂| 欧美日韩日本国产亚洲在线| 亚洲精品美女91| 亚洲午夜国产一区99re久久 | 能在线观看的日韩av| 欧美1区2区视频| 91久久午夜| 欧美精品在线免费| 一本色道久久综合狠狠躁的推荐| 亚洲一区二区视频| 国产精品乱人伦一区二区| 亚洲欧美成人一区二区在线电影| 午夜亚洲一区| 精品51国产黑色丝袜高跟鞋| 久久久在线视频| 亚洲韩国日本中文字幕| 亚洲天堂免费观看| 国产女同一区二区| 久久国产精彩视频| 亚洲激情午夜| 午夜一区不卡| 亚洲精品国产精品乱码不99 | 亚洲国产一区视频| 欧美日韩国产黄| 亚洲欧美日韩精品久久| 免费日韩av| 一本色道久久综合亚洲精品不卡 | 黄网动漫久久久| 欧美风情在线| 亚洲一区二区在线| 男女av一区三区二区色多| 亚洲天堂男人| 1204国产成人精品视频| 国产精品久久久久免费a∨大胸 | 午夜亚洲视频| 美女福利精品视频| 国产精品99久久久久久白浆小说 | 亚洲色图综合久久| 欧美xart系列在线观看| 亚洲午夜精品福利| 1024成人| 国产亚洲亚洲| 国产精品久久久久9999吃药| 老色批av在线精品| 亚洲欧美亚洲| 亚洲每日在线| 欧美激情视频免费观看| 久久精品成人一区二区三区蜜臀 | 性做久久久久久免费观看欧美| 欧美激情精品| 久久久久国产精品一区三寸| 一区二区高清在线观看| 极品av少妇一区二区| 国产精品一区二区欧美| 欧美日韩亚洲激情| 欧美黄色一区| 欧美成人精品一区| 久久―日本道色综合久久|