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

的筆記

隨時隨地編輯

Ogre骨骼動畫分析

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

歡迎指出文中錯誤

1  前言

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

下頁示意圖少兒不宜.

 

 

 

 

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)建一個骨骼魔法

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

一個骨骼文件看起來像這樣:

 

 

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

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

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

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

 

 

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

 

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

q1+(q2-q1)*k

 

 

4.2  更新動畫時間

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 看做一個全變換.

 

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

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

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

 

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

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

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

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

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

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

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

 

 

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

 

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

關(guān)鍵幀魔法需要創(chuàng)建一個特殊的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

指向一個用于混合的矩陣數(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)前的混合索引值

ü 用這個值索引出混合矩陣M4

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

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

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

 

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

posted on 2012-07-25 23:42 的筆記 閱讀(4829) 評論(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>
            亚洲美女91| 亚洲免费在线视频| 蜜臀91精品一区二区三区| 欧美一区二区观看视频| 激情六月婷婷综合| 欧美激情视频免费观看| 欧美日韩日日骚| 午夜视频一区| 美女黄毛**国产精品啪啪| 日韩视频在线一区| 亚洲欧美不卡| 亚洲东热激情| av成人老司机| 一区二区在线观看av| 亚洲国产精品精华液网站| 欧美日韩国产成人在线91| 欧美一级片在线播放| 毛片基地黄久久久久久天堂| 亚洲一区二区免费视频| 久久全球大尺度高清视频| 在线亚洲自拍| 久久午夜精品一区二区| 一本色道久久综合亚洲91| 午夜亚洲精品| av成人国产| 久久久九九九九| 亚洲婷婷免费| 美女精品在线| 欧美中文字幕不卡| 欧美欧美天天天天操| 久久亚洲春色中文字幕| 欧美日韩精品二区第二页| 久久嫩草精品久久久久| 国产精品久久久久久影视| 欧美国产亚洲另类动漫| 国产精品女主播在线观看| 亚洲国产小视频在线观看| 国产一区二区久久久| 一本久道久久久| 亚洲美女精品久久| 久久国产天堂福利天堂| 亚洲欧美日韩成人| 欧美激情综合五月色丁香| 久久一区二区视频| 国产欧美日韩视频| 一级成人国产| 一区二区三区毛片| 欧美国产高潮xxxx1819| 欧美成人国产| 国产亚洲欧美在线| 夜夜嗨av一区二区三区网页| 亚洲国产一区二区在线| 久久九九99视频| 久久精品道一区二区三区| 国产精品乱码人人做人人爱| 亚洲精品乱码久久久久久蜜桃麻豆| 狠狠色狠狠色综合日日小说| 亚洲欧美第一页| 亚洲欧美一区二区原创| 国产精品电影在线观看| 亚洲免费电影在线观看| av成人国产| 欧美三级午夜理伦三级中视频| 亚洲精品美女91| aⅴ色国产欧美| 欧美日韩中文在线| 亚洲午夜性刺激影院| 欧美亚洲一区二区三区| 国产伦精品免费视频| 欧美在线视频观看| 男同欧美伦乱| 亚洲精品久久久久久下一站| 欧美精品国产精品| 一本色道88久久加勒比精品| 亚洲一区二区视频在线| 国产精品久久久久久妇女6080 | 国产欧美一区二区精品性色| 亚洲在线观看免费| 久久亚洲欧洲| 亚洲国产高清一区| 欧美日韩国产123区| 在线中文字幕一区| 久久精品中文字幕免费mv| 国内一区二区三区| 欧美成人嫩草网站| 在线亚洲一区观看| 久久精品国语| 亚洲精品婷婷| 国产精品午夜电影| 久久综合五月天婷婷伊人| 亚洲国产成人在线播放| 午夜精品国产精品大乳美女| 一区二区三区无毛| 欧美日韩亚洲一区二区三区四区| 亚洲欧美国产毛片在线| 欧美国产另类| 亚洲男女毛片无遮挡| 影音先锋亚洲一区| 国产精品激情电影| 麻豆国产精品777777在线| 一区二区三区精品| 欧美成人dvd在线视频| 亚洲欧美激情视频| 亚洲国产一区二区精品专区| 国产精品青草久久| 欧美大片在线看| 欧美一级电影久久| 日韩一区二区高清| 欧美大片在线看| 香蕉久久久久久久av网站| 亚洲精品免费在线播放| 国产午夜亚洲精品羞羞网站| 欧美日韩成人激情| 美女91精品| 欧美专区中文字幕| 亚洲一级片在线观看| 最新中文字幕亚洲| 免费成人黄色片| 久久精品夜色噜噜亚洲aⅴ| 久久久亚洲精品一区二区三区| 性色一区二区| 亚洲高清电影| 国产日韩在线亚洲字幕中文| 欧美裸体一区二区三区| 久久久久久久综合日本| 亚洲一区二区三区四区视频| 欧美激情视频网站| 美女成人午夜| 久久久久国产精品人| 香蕉成人久久| 亚洲欧美激情精品一区二区| 夜夜夜精品看看| 亚洲免费成人| 亚洲精品在线二区| 亚洲国产精品久久人人爱蜜臀 | 欧美激情在线有限公司| 久热精品视频在线观看一区| 久久国产精品久久久久久久久久| 亚洲一区二区免费在线| 亚洲一卡二卡三卡四卡五卡| 一本大道久久a久久综合婷婷 | 小黄鸭视频精品导航| 亚洲伊人久久综合| 亚洲欧美一区二区三区极速播放| 亚洲影视九九影院在线观看| 亚洲伊人伊色伊影伊综合网| 亚洲在线一区二区三区| 亚洲欧美色婷婷| 久久爱另类一区二区小说| 久久成人18免费观看| 久久亚洲欧美| 欧美激情在线狂野欧美精品| 亚洲欧洲综合另类在线| 亚洲第一在线| 日韩视频免费观看| 亚洲专区免费| 久久九九99视频| 欧美国产日韩xxxxx| 欧美色另类天堂2015| 国产精品自拍视频| 影音先锋国产精品| 日韩亚洲不卡在线| 午夜精品电影| 欧美肥婆在线| 亚洲天堂久久| 久久偷看各类wc女厕嘘嘘偷窃| 欧美成人一品| 国产精品入口麻豆原神| 一区二区在线视频观看| 日韩午夜剧场| 久久精品人人爽| 91久久综合亚洲鲁鲁五月天| 亚洲一区二区三区免费在线观看| 久久精品噜噜噜成人av农村| 欧美激情性爽国产精品17p| 国产精品日产欧美久久久久| 在线观看精品一区| 亚洲神马久久| 美女爽到呻吟久久久久| 一本久久综合亚洲鲁鲁| 久久精品麻豆| 国产精品久久久久久久午夜| 亚洲成人在线免费| 亚洲欧美日韩一区| 亚洲国产高清在线| 欧美伊人久久久久久久久影院| 欧美国产精品一区| 国精品一区二区| 亚洲天堂久久| 亚洲第一福利在线观看| 亚洲女同精品视频| 猫咪成人在线观看| 国产一区二区三区在线观看精品| 日韩视频二区| 免费成人高清| 亚洲欧美一区二区三区久久| 欧美日韩国产综合视频在线观看中文 | 91久久久国产精品| 久久久女女女女999久久| 国产精品日韩在线播放|