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

的筆記

隨時隨地編輯

Ogre骨骼動畫分析

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

歡迎指出文中錯誤

1  前言

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

下頁示意圖少兒不宜.

 

 

 

 

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

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

 

 

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

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

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

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

 

 

可以看到移動和縮放非常好理解,都是進行的一次線性插值。只有旋轉(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)聽,再更新實體

OgreMain_d.dll!Ogre::Root::renderOneFrame

OgreMain_d.dll!Ogre::Root::startRendering

AnalyzeAnimation.exe!BaseApplication::go

AnalyzeAnimation.exe!WinMain

 

TransformKeyFrame 看做一個全變換.

 

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

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

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

 

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

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

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

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

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

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

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

 

 

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

 

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

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

 

 

 

5  蒙皮

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

 

V=M4*V

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

 

 

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

 

 

 

const VertexData*

sourceVertexData

 

const VertexData*

targetVertexData

 

const Matrix4* const*

blendMatrices

 

size_t

numMatrices,

 

bool

blendNormals

 

 

sourceVertexData

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

 

targetVertexData

目標的頂點,混合版本的法線緩存.需要注意向量的歸一化.

 

blendMatrices

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

 

numMatrices

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

 

blendNormals

true表示法線也同頂點一起混合.

 

 

 

 

srcElemPos

源頂點

 

srcElemNorm

源法線

 

srcElemBlendIndices

源混合索引

 

srcElemBlendWeights

源混合權(quán)重

 

 

 

 

 

 

 

srcPosBuf      

源頂點緩存

 

srcIdxBuf      

源索引緩存

 

srcWeightBuf 

源權(quán)重緩存

 

srcNormBuf

源法線緩存

 

destElemPos

目頂點

 

destElemNorm

目法線

 

      

 

 

destPosStride

目法線跨步

 

 

 

 

 

 

 

5.2  蒙皮核心算法

核心算法如下

 

 

首先對頂點進行計算

ü 找到當前的混合索引值

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

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

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

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

 

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

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

評論

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

Good!
Mark...  回復  更多評論   

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

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

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

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


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導航: 博客園   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>
            亚洲欧美日韩在线播放| 久久五月婷婷丁香社区| 国产精品国产三级国产普通话99| 久久久久久91香蕉国产| 久久精品国产96久久久香蕉| 美女啪啪无遮挡免费久久网站| 久久综合久久久| 欧美护士18xxxxhd| 国产精品久久网站| 伊大人香蕉综合8在线视| 亚洲国产精品久久久久| 亚洲一区二区少妇| 久久婷婷国产综合国色天香| 亚洲国产精品一区二区第一页 | 免费看成人av| 亚洲人成在线播放| 亚洲图片自拍偷拍| 久久爱www| 亚洲国产欧美一区二区三区同亚洲 | 国产欧美三级| 亚洲黄色片网站| 亚洲欧美网站| 亚洲第一视频| 久久精品九九| 国产精品爱久久久久久久| 好看的日韩av电影| 亚洲午夜一区| 欧美护士18xxxxhd| 性欧美暴力猛交另类hd| 欧美片网站免费| 国产女优一区| 99精品欧美一区二区三区| 久久精品视频免费| 亚洲一区二区三区精品视频| 免费在线看一区| 韩国一区二区三区在线观看| 亚洲深夜福利| 亚洲精品欧美日韩专区| 久久精品视频一| 国产精品一区二区欧美| 宅男精品视频| 亚洲韩国精品一区| 久久一区国产| 今天的高清视频免费播放成人| 亚洲夜晚福利在线观看| 欧美成人一区二区三区片免费| 亚洲综合视频在线| 国产精品久久久久999| 日韩视频三区| 91久久精品国产91性色tv| 老妇喷水一区二区三区| 狠狠干狠狠久久| 久久性色av| 久久久久欧美| 亚洲福利视频免费观看| 蜜桃久久精品乱码一区二区| 久久av一区| 黑人巨大精品欧美黑白配亚洲| 欧美一级欧美一级在线播放| 亚洲在线一区二区| 国产日产欧产精品推荐色 | 欧美一级夜夜爽| 国产日产欧美a一级在线| 欧美一区激情| 久久国产精品久久久| 韩国av一区二区三区| 噜噜噜91成人网| 免费在线欧美视频| 亚洲美女网站| aⅴ色国产欧美| 国产精品久久福利| 国产一级一区二区| 麻豆91精品91久久久的内涵| 久久一区二区三区av| 最新成人在线| 一本色道精品久久一区二区三区| 欧美深夜福利| 久久精品99久久香蕉国产色戒| 久久精品国产亚洲aⅴ| 亚洲国产导航| 中文在线一区| 激情婷婷欧美| 亚洲日韩视频| 国产日韩精品一区观看| 欧美成人精品激情在线观看| 欧美人交a欧美精品| 欧美在线看片a免费观看| 欧美中文在线观看| 亚洲精品久久久蜜桃| 在线视频免费在线观看一区二区| 国户精品久久久久久久久久久不卡| 欧美国产激情二区三区| 国产精品第一页第二页第三页| 久久亚洲高清| 国产精品美女主播| 女生裸体视频一区二区三区| 欧美日韩精品一区二区三区四区| 久久黄色小说| 欧美日韩国产va另类| 久久久噜噜噜久久狠狠50岁| 欧美日韩亚洲天堂| 蜜臀91精品一区二区三区| 欧美午夜在线一二页| 欧美成人免费视频| 国产亚洲福利一区| 一区二区电影免费观看| 一区二区三区无毛| 亚洲深夜福利视频| 亚洲精品自在久久| 久久精品亚洲精品国产欧美kt∨| 亚洲美女av在线播放| 久久精品视频在线看| 亚洲欧美激情一区| 欧美日韩国产精品一区二区亚洲| 久久九九久精品国产免费直播| 欧美日韩卡一卡二| 亚洲国产精品视频| 亚洲欧洲精品一区| 久久婷婷综合激情| 久久精品一本| 国产毛片精品国产一区二区三区| 999亚洲国产精| 99精品久久| 欧美激情中文不卡| 亚洲国产精品va在线看黑人动漫| 国内成+人亚洲+欧美+综合在线| 一区二区三区视频在线看| 99视频在线观看一区三区| 蜜桃久久av一区| 欧美电影在线播放| 亚洲黄色毛片| 欧美激情视频在线免费观看 欧美视频免费一 | 禁断一区二区三区在线| 女女同性精品视频| 国产亚洲美州欧州综合国| 亚洲一区二区在| 欧美一区二区三区免费观看| 国产精品夜色7777狼人| 亚洲少妇自拍| 欧美伊人久久久久久久久影院| 国产精品久久久一本精品| 在线中文字幕日韩| 久久爱www.| 在线看日韩av| 欧美顶级大胆免费视频| 亚洲日本成人| 亚洲性夜色噜噜噜7777| 国产精品久久久久久五月尺| 亚洲校园激情| 久久手机免费观看| 亚洲国产精品女人久久久| 欧美国产高清| 亚洲午夜精品福利| 久久嫩草精品久久久久| 最新高清无码专区| 国产精品高潮呻吟久久av无限 | 午夜欧美理论片| 久久久久国产精品一区二区| 在线观看福利一区| 欧美日韩国产限制| 午夜精品亚洲| 免费久久精品视频| 亚洲色诱最新| 黄色亚洲在线| 欧美伦理在线观看| 午夜影视日本亚洲欧洲精品| 欧美电影免费观看| 午夜精品视频一区| 亚洲黄色片网站| 国产精品视频久久| 免费日本视频一区| 亚洲免费影视第一页| 欧美激情一区| 久久国产日韩| 亚洲午夜精品一区二区| 在线观看亚洲精品视频| 欧美午夜理伦三级在线观看| 久久久99爱| 亚洲一区在线免费| 亚洲欧洲一区二区天堂久久| 久久精品国产一区二区电影| 一区二区成人精品| 激情视频亚洲| 国产欧美日本| 国产精品大片免费观看| 欧美成人一区二区| 久久久久久日产精品| 亚洲综合色在线| 99国产精品久久久久老师| 欧美成人一区二区三区在线观看| 欧美在线地址| 亚洲一区国产精品| 一本色道久久综合亚洲精品婷婷| 黄色成人av在线| 国产午夜精品美女视频明星a级| 欧美日韩一区二区三区在线| 免费亚洲一区| 免费观看30秒视频久久| 久久久久国产一区二区三区| 亚洲免费在线|