• <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>

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

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

            常用鏈接

            統(tǒng)計(jì)

            積分與排名

            好友鏈接

            最新評(píng)論

            骨骼動(dòng)畫導(dǎo)論(轉(zhuǎn))

            轉(zhuǎn)自http://blog.csai.cn/user1/261/archives/2008/28536.html

            先說明,這篇文章由我翻譯自Evan Pipho的<<Focus On 3D Models>>一書的內(nèi)關(guān)于骨骼動(dòng)畫第五章的內(nèi)容,去掉了前面的說明和最后的Demo說明,包含了所有的理論內(nèi)容,轉(zhuǎn)載請(qǐng)注明出處,謝謝!

            理解骨骼動(dòng)畫

            骨骼動(dòng)畫是使用骨頭來運(yùn)動(dòng)一個(gè)模型而不是通過手動(dòng)編輯和移動(dòng)每個(gè)頂點(diǎn)或面而實(shí)現(xiàn)的動(dòng)畫.每個(gè)頂點(diǎn)被附著到一根骨頭(或有時(shí)是多根骨頭).一根骨頭或一個(gè)關(guān)節(jié)只是一組頂點(diǎn)的一個(gè)控制點(diǎn).這些概念類似于我們身體里的關(guān)節(jié),例如我們的膝關(guān)節(jié)或腕關(guān)節(jié)等.當(dāng)骨頭運(yùn)動(dòng)時(shí),每個(gè)附著在它上的頂點(diǎn)也跟著運(yùn)動(dòng),如圖5.2顯示的那樣.甚至骨頭自身的運(yùn)動(dòng)也會(huì)導(dǎo)致其它骨頭的運(yùn)動(dòng).這使得模型運(yùn)動(dòng)起來比較適當(dāng)合理,因?yàn)樵谡鎸?shí)的生活中,身體的一部分運(yùn)動(dòng)會(huì)影響到身體的其它部分.所以,程序員需要能利用骨頭來計(jì)算單個(gè)頂點(diǎn)的變換.雖然這會(huì)帶來較多的工作量,可是結(jié)果證明這是值得的.

            <!--[if !vml]--><!--[endif]-->

            5.2 頂點(diǎn)動(dòng)畫需要你移動(dòng)每個(gè)頂點(diǎn),而骨骼動(dòng)畫使你只需移動(dòng)模型中的一根骨頭,頂點(diǎn)將能隨之而變.

            骨骼動(dòng)畫的優(yōu)點(diǎn)

            骨格動(dòng)畫比傳統(tǒng)的頂點(diǎn)變換型動(dòng)畫有很多優(yōu)點(diǎn),正如你在前面章節(jié)里看到的那樣.

            首先,也是對(duì)于玩家最直觀的一點(diǎn)便是要增加真實(shí)感.基于骨骼運(yùn)動(dòng)的角色更趨于真實(shí)性,并常出現(xiàn)在比傳統(tǒng)模型要求和周圍事物有更強(qiáng)交互性的地方.要使模型更趨于運(yùn)動(dòng)真實(shí)性,則對(duì)基于骨骼的模型來說確是件簡(jiǎn)單的事.在傳統(tǒng)的關(guān)鍵幀動(dòng)畫中,游戲會(huì)在兩個(gè)位置中間進(jìn)行線性插值.然而,在這種情況下,關(guān)節(jié)實(shí)際上并沒有旋轉(zhuǎn),這對(duì)于生命體以旋轉(zhuǎn)方式運(yùn)動(dòng)會(huì)有問題.

            這對(duì)用戶而言,并不那么明顯,但對(duì)程序員來說,那樣的動(dòng)畫是否占用了較少的存儲(chǔ)空間是非常重要的.用于代替為每幀動(dòng)畫都存儲(chǔ)一組新的頂點(diǎn),所有我們需要存儲(chǔ)的只是骨頭的旋轉(zhuǎn)和平移信息.這可以節(jié)省巨大的存儲(chǔ)空間,你僅僅只要加入骨頭頂點(diǎn)骨頭附著信息.

            這因骨骼動(dòng)畫需要而多加的一點(diǎn)存儲(chǔ)空間可以用于保存更細(xì)致的模型,加入額外的支運(yùn)動(dòng)幀,或甚至可經(jīng)適當(dāng)改進(jìn)后,用于游戲的其它地方.你能夠添加更多細(xì)節(jié)至游戲的世界中,改進(jìn)A.I.來提供一個(gè)更刺激的游戲,或者加入一些很酷的東東或復(fù)活節(jié)彩蛋,而這些都是原來你很想加入?yún)s因涉及空間問題而不能加入的.

            而另一個(gè)優(yōu)點(diǎn)表現(xiàn)在那些創(chuàng)建游戲3D內(nèi)容的美工上.一個(gè)好的骨骼動(dòng)畫系統(tǒng)將縮減美工做模型動(dòng)畫的時(shí)間.幾乎每一個(gè)好的動(dòng)畫程序都已使用骨骼動(dòng)畫來確保模型運(yùn)動(dòng)的過程從美工到程序員,再到游戲,最后到玩家的平滑過渡.這加速了游戲內(nèi)容的創(chuàng)建過程,也確保了當(dāng)模型被導(dǎo)出成游戲所使用的格式時(shí)沒有動(dòng)畫或特征的失真.

            一個(gè)更長(zhǎng)遠(yuǎn)的優(yōu)點(diǎn)是對(duì)程序員的另一個(gè)好處(這越來越好了,不是嗎?).因?yàn)楣趋赖淖杂尚?/span>,這使得你可以隨心所欲地實(shí)時(shí)定位它們,也可以實(shí)現(xiàn)在運(yùn)行時(shí)創(chuàng)建動(dòng)畫.就相當(dāng)于提供了一個(gè)更多樣化的動(dòng)畫庫.你甚至能夠讓游戲控制當(dāng)身體碰到一個(gè)物體時(shí)的動(dòng)作,或從一個(gè)斜坡上滑下來.這種技術(shù)是在玩的時(shí)候即時(shí)產(chǎn)生的,Unreal Tournament 2003’s Physics系統(tǒng)(http://www.epicgames.com)里就有這樣一個(gè)值得注意的例子.角色和模型在環(huán)境里面真實(shí)交互,包括從斜坡上滑下和靠在上面徐徐移動(dòng).

            骨骼動(dòng)畫有一個(gè)缺點(diǎn)就是相對(duì)于傳統(tǒng)的關(guān)鍵幀動(dòng)畫,它不容易被理解和實(shí)現(xiàn).本章將幫助你緩解任何你對(duì)骨骼動(dòng)畫的擔(dān)心.

            骨骼動(dòng)畫的原理

            首先來看看你的手臂.將你的手臂在你胸前展開并觀察它.你的手臂有許多骨頭,兩根主要的大骨頭(two main ones),還有手掌(譯注:這里指腕關(guān)節(jié)到指尖的所有部分,下面說的手掌也一樣)和手指上的一些骨頭.

            移動(dòng)你的手指,是不是它們移動(dòng)?只移動(dòng)你的手指,而你手臂上的其它部分并不會(huì)因此而移動(dòng).現(xiàn)在彎曲你的肘關(guān)節(jié),不僅你的手臂移動(dòng)了,而且你的手指和手掌也同樣跟著移動(dòng)了.如果不是這樣的,那你的手臂和你的手掌及手指就變得斷開了,且每部分都孤立得懸掛在空中,這可不太好.

            如何將這個(gè)手臂和骨骼動(dòng)畫關(guān)聯(lián)在一起運(yùn)動(dòng)呢?你的手臂代表了3D模型的一部分,你的手指,手掌,以及手臂的上下各部分都是這個(gè)模型的一部分.不同的關(guān)節(jié)和骨頭貫穿了你的手臂,如肩關(guān)節(jié),肘關(guān)節(jié),腕關(guān)節(jié),還有指關(guān)節(jié).

            這就是說,當(dāng)你移動(dòng)手臂上游的一根骨頭時(shí),任何在這根骨頭的下游部分也都會(huì)跟著移動(dòng).這就是骨骼動(dòng)畫最基本的概念.

            這樣就有一個(gè)美妙之處是:它可以允許你移動(dòng)模型上的任何一根骨頭,并滲透到下面的移動(dòng),應(yīng)用到以這個(gè)移動(dòng)為原點(diǎn)的下面的任何事物. 例如,這允許你只需移動(dòng)角色的肩膀,不需擔(dān)心肘和手的移動(dòng)位置,因?yàn)樗鼈儠?huì)自動(dòng)移到正確位置.你也能夠通過復(fù)位以確保它們會(huì)被自動(dòng)更新.5.3顯示了一個(gè)關(guān)節(jié)和附著在這些關(guān)節(jié)上的頂點(diǎn)的例子.

            <!--[if !vml]--><!--[endif]-->

            5.3 當(dāng)執(zhí)行骨骼動(dòng)畫時(shí),你不必?fù)?dān)心關(guān)節(jié),或骨頭之間的結(jié)合點(diǎn).每個(gè)頂點(diǎn)實(shí)際上是附著(關(guān)聯(lián))到關(guān)節(jié)點(diǎn)的,而不是骨頭.

            根關(guān)節(jié)

            根關(guān)節(jié)是一個(gè)模型中的終端關(guān)節(jié).任何其它關(guān)節(jié)都以自己的路徑最終關(guān)聯(lián)到根關(guān)節(jié).任何對(duì)根關(guān)節(jié)的操作,如不論是平移或是旋轉(zhuǎn),都會(huì)影響到模型中的每個(gè)頂點(diǎn).你可以認(rèn)為根關(guān)節(jié)是控制所有其它關(guān)節(jié)的關(guān)節(jié).簡(jiǎn)單修改根關(guān)節(jié),你能使角色直立行走,或旋轉(zhuǎn)他以讓他倒過來在天花板上行走所做的只是一個(gè)簡(jiǎn)單的調(diào)用.

            在每個(gè)模型里只有一個(gè)根關(guān)節(jié),它沒有父關(guān)節(jié).根關(guān)節(jié)通常是許多骨頭連接的地方,而不是需要一個(gè)小動(dòng)畫的地方.例如包括中部和下后部,但沒有明確要求根關(guān)節(jié)一定要在模型中的某個(gè)準(zhǔn)確位置.只要你愿意,每個(gè)模型都可以不同.5.4顯示了當(dāng)根節(jié)點(diǎn)的位置和朝向被修改后會(huì)發(fā)生的變化.

            <!--[if !vml]--><!--[endif]-->

            5.4 旋轉(zhuǎn)或平移根關(guān)節(jié)將影響模型中其他所有的關(guān)節(jié)和項(xiàng)點(diǎn).

            先說明,這篇文章由我翻譯自Evan Pipho的<<Focus On 3D Models>>一書的內(nèi)關(guān)于骨骼動(dòng)畫第五章的內(nèi)容,去掉了前面的說明和最后的Demo說明,包含了所有的理論內(nèi)容,轉(zhuǎn)載請(qǐng)注明出處,謝謝!

            父關(guān)節(jié)和子關(guān)節(jié)

            一個(gè)關(guān)節(jié)可以有父關(guān)節(jié)和子關(guān)節(jié).其父關(guān)節(jié)會(huì)影響到它做任何事情.父關(guān)節(jié)的旋轉(zhuǎn)和平移會(huì)影響計(jì)算當(dāng)前關(guān)節(jié)的新位置.再拿手臂的例子來說,肘關(guān)節(jié)是手掌的父關(guān)節(jié).移動(dòng)肘則影響手掌.在簡(jiǎn)單的骨骼動(dòng)畫里,每個(gè)關(guān)節(jié)只有一個(gè)父關(guān)節(jié),如果有的話.

            但是,一個(gè)關(guān)節(jié)可以有許多子關(guān)節(jié).子關(guān)節(jié)是相對(duì)于父關(guān)節(jié)來說的.任何你對(duì)父關(guān)節(jié)做的事都會(huì)滲透到子關(guān)節(jié).換個(gè)角度來說就是,當(dāng)前關(guān)節(jié)是所有在它下面的關(guān)節(jié)的父關(guān)節(jié).

            <!--[if !vml]--><!--[endif]-->

            5.5 -子關(guān)節(jié)的關(guān)系

            骨骼動(dòng)畫的關(guān)鍵幀

            常規(guī)關(guān)鍵幀動(dòng)畫保存了多份頂點(diǎn)拷貝,骨骼動(dòng)畫系統(tǒng)也有關(guān)鍵幀.關(guān)鍵幀的再現(xiàn)是一個(gè)模型位置的瞬時(shí)狀態(tài).

            然而,不同于每個(gè)關(guān)鍵幀都包含其自身所有頂點(diǎn)的拷貝的方式,骨骼動(dòng)畫的關(guān)鍵幀或叫骨骼幀(boneframe)包含了旋轉(zhuǎn)和平移的變換信息,一般平移是一個(gè)X,Y,Z值的形式,和三個(gè)分別包含了按X,Y,Z軸旋轉(zhuǎn)的值.正如常規(guī)頂點(diǎn)關(guān)鍵幀一樣,這些骨骼幀必須被插值來提供平滑的動(dòng)畫效果.

            位置或平移的值可以在兩個(gè)之間進(jìn)行線性插值,就像你在傳統(tǒng)關(guān)鍵幀動(dòng)畫里對(duì)頂點(diǎn)的操作一樣.但旋轉(zhuǎn)則有問題,簡(jiǎn)單的在兩個(gè)值之間進(jìn)行平移那樣的插值會(huì)產(chǎn)生奇怪的效果.旋轉(zhuǎn)將不是平滑的,它可能會(huì)加速和減速,這依賴于其自身的位置.如果兩個(gè)旋轉(zhuǎn)信息之間的差異比較大,模型可能像膠在一起的方塊那樣出現(xiàn)滲出(ooze)”.這是因?yàn)槭褂镁€性插值,所有的東西都是沿著直線插值的,如果這用這種方式執(zhí)行旋轉(zhuǎn)就會(huì)產(chǎn)生奇怪的效果,因?yàn)樾D(zhuǎn)是沿著弧插值而不是直線.對(duì)弧形路徑按兩端點(diǎn)的直線方式而不是沿弧的路徑方式就會(huì)產(chǎn)行滲出效果.

            解決這個(gè)問題的最好方法就是采用四元數(shù).這你在第二章就學(xué)會(huì)過了.”介紹四元數(shù)”,四元數(shù)最大的優(yōu)點(diǎn)之一是他們可以容易地進(jìn)行插值.不僅容易插值,而且能很容易地進(jìn)行球面線性插值.

            球面線性插值在球面上的兩點(diǎn)之前進(jìn)行插值.然而,相對(duì)于在兩點(diǎn)之間以直線方式逼近,球面線性插值是沿著球表面的曲面的.你可以設(shè)想撿起一只球,比如一個(gè)籃球,并在上面標(biāo)上兩點(diǎn),然后,用你的手指找出這兩點(diǎn)間最短的路徑.因?yàn)槟愕氖种覆荒苓M(jìn)入球的內(nèi)部,于是這條在兩點(diǎn)間的路徑將是一條弧.這就是SLERP的處理方式.使用SLERP函數(shù),旋轉(zhuǎn)就可以沿著弧進(jìn)行插值,創(chuàng)建出一個(gè)比較平滑的,順眼的效果.

            計(jì)算位置

            利用你在上面己經(jīng)閱讀到的信息,你可能想嘗試實(shí)現(xiàn)骨骼動(dòng)畫了.然而,你還沒有學(xué)習(xí)關(guān)于父關(guān)節(jié)是如何影響子關(guān)節(jié)的具體內(nèi)容.簡(jiǎn)單地使用關(guān)鍵幀將使每個(gè)關(guān)節(jié)獨(dú)立地移動(dòng),很可能產(chǎn)生一個(gè)奇怪的,扭曲的網(wǎng)格.

            這部分內(nèi)容將告訴你關(guān)于如何更改它以使關(guān)節(jié)之間能正常運(yùn)動(dòng).首先你要做的就是創(chuàng)建一個(gè)變換矩陣,該矩陣用于每一個(gè)使用了不同旋轉(zhuǎn)和平移關(guān)鍵幀數(shù)據(jù)(關(guān)鍵幀)點(diǎn).這個(gè)變換矩陣可以通過先生成三個(gè)旋轉(zhuǎn)矩陣(譯注:x,y,z三個(gè)方向的旋轉(zhuǎn)矩陣)和平移矩陣,這在第一章已經(jīng)學(xué)過了, 再將這三個(gè)矩陣相乘就會(huì)生成了最終的變換矩陣.你也可以使用matrix類的SetRotationSetTranslation函數(shù)來避免你自己做矩陣乘法.這個(gè)生成的矩陣叫做相對(duì)矩陣(relative matrix).

            下一步你需要計(jì)算出一個(gè)絕對(duì)矩陣(absolute matrix).絕對(duì)矩陣是關(guān)節(jié)的相對(duì)矩陣乘上它的父關(guān)節(jié)的絕對(duì)矩陣得到的.絕對(duì)矩陣告訴你關(guān)節(jié)的絕對(duì)變換(譯注:就是將關(guān)節(jié)的本地坐標(biāo)變換為世界坐標(biāo)).這包括了自身的相對(duì)變換,除此之外,層次結(jié)構(gòu)中所有在它之前的關(guān)節(jié)的變換都已計(jì)算完成.這允許其他關(guān)節(jié)的移動(dòng)作為移動(dòng)關(guān)節(jié)鏈上游關(guān)節(jié)的結(jié)果.細(xì)想一下,例如,當(dāng)你移動(dòng)肩膀時(shí)肘又是怎么移動(dòng)的,這引出了一個(gè)問題:你如何計(jì)算最初的絕對(duì)矩陣?記住,根關(guān)節(jié)是沒有父關(guān)節(jié)的,因此,它的絕對(duì)矩陣就是它的相對(duì)矩陣.

            假如你以正確的順序遍歷了各關(guān)節(jié),同時(shí)按此順序計(jì)算出各個(gè)絕對(duì)矩陣,每個(gè)關(guān)節(jié)(的絕對(duì)矩陣)將會(huì)包含它父關(guān)節(jié)的變換,以及它父關(guān)節(jié)的父關(guān)節(jié)的變換等等.5.6顯示了當(dāng)你變換一個(gè)關(guān)節(jié)前顧及所有先前(關(guān)節(jié))的變換時(shí)發(fā)生的情況.

            <!--[if !vml]--><!--[endif]-->

            5.6 遍歷各關(guān)節(jié),并顧及其所有前面的變換.注意哪怕只有一個(gè)關(guān)節(jié)要移動(dòng),在它下面的關(guān)節(jié)也得跟著移動(dòng),這很像移動(dòng)你的臀部,則你的膝和踝也得跟著移動(dòng)一樣.

            你是否只存儲(chǔ)了子關(guān)節(jié)的索引,而沒有儲(chǔ)存關(guān)節(jié)的父關(guān)節(jié)索引?你立即要訪問的索引集依賴于模型的格式.一些格式像MS3D同時(shí)給你每個(gè)關(guān)節(jié)的父關(guān)節(jié)索引,其它格式則可能給你子關(guān)節(jié)索引.使用子關(guān)節(jié)索引需要一個(gè)明顯不同于使用父索引的方法,但一點(diǎn)都不會(huì)比后者難.你再次從根關(guān)節(jié)開始,在計(jì)算了根關(guān)節(jié)的變換矩陣之后,通過一個(gè)類似于glPushMatrix的命令將一個(gè)新的矩陣壓入棧內(nèi).就創(chuàng)建了一個(gè)新的世界變換矩陣(world matrix)的拷貝,這個(gè)世界變換矩陣是在被顯示前執(zhí)行了所有的幾何變換的矩陣.現(xiàn)在用你的新矩陣乘以根關(guān)節(jié)的本地矩陣.結(jié)果就是世界變換矩陣,它在下一個(gè)骨頭被畫出之前將所有事物放置到正確位置,父關(guān)節(jié)的變換也被考慮在內(nèi)了.舉個(gè)例子,角色的臀部的旋轉(zhuǎn)可能是某些動(dòng)作的總合.因?yàn)橄リP(guān)節(jié)和踝關(guān)節(jié)是臀關(guān)節(jié)的子關(guān)節(jié),它們也要被旋轉(zhuǎn).

            繪制函數(shù)像這樣遞歸,它對(duì)自己的子關(guān)節(jié)繼續(xù)調(diào)用繪制函數(shù),每個(gè)子關(guān)節(jié)又對(duì)自己的子關(guān)節(jié)調(diào)用渲染函數(shù),以此類推直到到達(dá)終端關(guān)節(jié)(沒有子關(guān)節(jié)的關(guān)節(jié)),復(fù)位棧用一個(gè)glPopMatrix這樣的命令.例如,當(dāng)要繪制一個(gè)角色的一條腿時(shí),新的矩陣被壓入棧內(nèi)用于計(jì)算膝關(guān)節(jié),踝關(guān)節(jié)和腳關(guān)節(jié).但是,如果要開始計(jì)算手臂時(shí),你應(yīng)該出格到處理腿之前的棧狀態(tài),否則,每當(dāng)你移動(dòng)腿時(shí),手臂也將跟著移動(dòng)了.

            5.7顯示了一個(gè)遞歸渲染函數(shù).

            <!--[if !vml]--><!--[endif]-->

            5.7 渲染用子索引代替父索引存儲(chǔ)的關(guān)節(jié)

            將網(wǎng)格附著到骨骼

            當(dāng)你的關(guān)節(jié)己能平滑運(yùn)動(dòng)的時(shí)候,也是該將網(wǎng)格附著到骨骼的時(shí)候.網(wǎng)格(mesh)組成了模型的形狀,它是由一組使模型具有立體感和細(xì)節(jié)的頂點(diǎn)和三角形組成,沒有網(wǎng)格,基于骨骼運(yùn)動(dòng)的模型只是一個(gè)簡(jiǎn)單的骨架.每個(gè)網(wǎng)格的頂點(diǎn)存儲(chǔ)了一個(gè)指向關(guān)節(jié)數(shù)組的索引,用于指示它被附著到某根骨頭.現(xiàn)在,存儲(chǔ)關(guān)節(jié)的方式?jīng)Q定了這些頂點(diǎn)的變換和渲染的方法.

            如果每個(gè)關(guān)節(jié)存儲(chǔ)時(shí)帶有其父關(guān)節(jié)的索引,同時(shí)你已經(jīng)遍歷和計(jì)算了最終的絕對(duì)矩陣,那么附著網(wǎng)格是很簡(jiǎn)單的.確保變換后的頂點(diǎn)保存到一個(gè)專門的地方,不要覆蓋原始的頂點(diǎn).這是因?yàn)樵诮^大多數(shù)格式里,骨骼幀不會(huì)被累積,每幀保存了從起點(diǎn)起的特定關(guān)節(jié)的旋轉(zhuǎn)和平移的信息.如果你不回退到原始頂點(diǎn),那么當(dāng)每次計(jì)算新頂點(diǎn)位置時(shí),模型將會(huì)飄乎不定得運(yùn)動(dòng).5.8中可以看出每個(gè)頂點(diǎn)單獨(dú)附著到一個(gè)關(guān)節(jié)是什么意思.

            <!--[if !vml]--><!--[endif]-->

            5.8頂點(diǎn)附著到關(guān)節(jié)

             

            現(xiàn)在你很可能在對(duì)自己說,”好的,我能運(yùn)動(dòng)一個(gè)模型的頂點(diǎn),那三角形,法線,以及紋理坐標(biāo)怎么處理呢”? 這也正是骨骼模型真正開始閃光的地方.每個(gè)模型包含了一個(gè)紋理坐標(biāo)的集合和一個(gè)三角形信息的集合.僅因?yàn)轫旤c(diǎn)的位置變更并不意味著三角形頂點(diǎn)索引和紋理坐標(biāo)也會(huì)變化.這意思是說,當(dāng)你第一次設(shè)置好它們之后就根本不需要再擔(dān)心它們.

            法線則是另一回事了,因?yàn)槎噙呅蔚某蚝晚旤c(diǎn)的位置更改了,因此法線也相應(yīng)更改了.如果你正在使用面法線,那么你在每一幀將他們傳給渲染器之前都需要重新計(jì)算.然而,如果你一開始就計(jì)算了頂點(diǎn)法線,那么你很幸運(yùn),頂點(diǎn)法線不必在變換后都完全重新計(jì)算,它們能利用和頂點(diǎn)相同的變換矩陣來進(jìn)行變換.唯一不同的是,你不需要考慮平移.使用matrix類的Transform3()函數(shù)將旋轉(zhuǎn)你的頂點(diǎn)法向量,同時(shí)仍能保留其原始大小.

            如果關(guān)節(jié)保存了子關(guān)節(jié)的索引,并且你使用glPushMatrix將當(dāng)前的變換矩陣壓入棧內(nèi),那么渲染模型就會(huì)變得十分容易.對(duì)這種情況,沒有必要在顯示之前變換每個(gè)頂點(diǎn).不管渲染任何東西都沒有更改的必要.任何你要渲染的現(xiàn)在將被適當(dāng)變換,甚至面法線.另一個(gè)需要考慮的問題是,頂點(diǎn)如何附著到多于一根的骨頭.此時(shí),每根骨頭將被賦予一個(gè)權(quán)重,這個(gè)權(quán)重決定它影響關(guān)節(jié)點(diǎn)的比重.最終的變換是所有這些被附著的骨頭的變換的加權(quán)平均.

            posted on 2010-01-18 10:57 狂爛球 閱讀(2464) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 圖形編程

            久久久久久久女国产乱让韩| 国产精品九九久久精品女同亚洲欧美日韩综合区 | 久久ZYZ资源站无码中文动漫| 久久精品国产亚洲Aⅴ蜜臀色欲| 狠狠狠色丁香婷婷综合久久俺| 亚洲av日韩精品久久久久久a| 亚洲中文精品久久久久久不卡| 久久国内免费视频| 伊人久久大香线蕉无码麻豆 | 欧美777精品久久久久网| 2021久久精品国产99国产精品| 精品人妻久久久久久888| 波多野结衣中文字幕久久| 99re这里只有精品热久久| 精品一区二区久久久久久久网站| 国产精品岛国久久久久| 91久久精品国产成人久久| 久久久WWW成人| 中文字幕无码精品亚洲资源网久久| 伊人久久综合精品无码AV专区| 色诱久久久久综合网ywww| 久久久久夜夜夜精品国产| 久久久受www免费人成| 中文字幕久久精品无码| 久久国产高清字幕中文| 日韩精品无码久久一区二区三 | 色狠狠久久AV五月综合| 久久综合九色综合97_久久久| 国产精品伦理久久久久久| 久久综合亚洲色HEZYO社区 | 人妻精品久久久久中文字幕69 | 久久久久亚洲av成人无码电影| 国产精品99久久久精品无码| 狠狠色丁香婷综合久久| 亚洲精品97久久中文字幕无码| 久久久久久毛片免费播放| 久久精品国产亚洲Aⅴ蜜臀色欲| 欧美亚洲色综久久精品国产| 久久夜色精品国产| 成人国内精品久久久久一区| 国产美女亚洲精品久久久综合|