不要在追尋什么人生的意義城舞,追尋本身就很有意義-《萌菇?jīng)觥?/p>
本周我們拿出一些可能其他同學(xué)也存在的疑問來給大家講解一下關(guān)于FBX骨骼動(dòng)畫的方面東西首启。我們應(yīng)該如何去做一個(gè)動(dòng)畫系統(tǒng)吴攒。
關(guān)于繪制
我們首先來看看,我們要繪制動(dòng)畫需要具備什么樣的底層基礎(chǔ)功能:
繪制一群三角形的能力(因?yàn)闊o論模型如何復(fù)雜,它都是由三角形構(gòu)成喳整,或許你比較菜鳥,只能繪制21845個(gè)三角形(65535除以3)裸扶,或許你有良好的數(shù)據(jù)組織框都,你有一個(gè)引擎,你可以突破這些瓶頸)
Shader呵晨,你需要一個(gè)Shader為你的模型的各個(gè)部分進(jìn)行著色魏保,我們解析過FBX模型的知道,F(xiàn)BX模型里是有很多個(gè)節(jié)點(diǎn)的摸屠,節(jié)點(diǎn)上都掛在了Submesh這樣的東西谓罗,而每個(gè)submesh基本上可以對(duì)應(yīng)到某一群三角形的集合。于是乎季二,我們就需要特定的shader去繪制每個(gè)submesh檩咱,或許整個(gè)模型都可以使用一個(gè)shader去繪制。
動(dòng)畫采樣器胯舷,或許有的人至今不明白剛體動(dòng)畫和骨骼動(dòng)畫有什么區(qū)別刻蚯,但那又如何。我們來說說動(dòng)畫采樣器需纳,動(dòng)畫采樣器就是根據(jù)時(shí)間點(diǎn)的信息芦倒,能夠插值出動(dòng)畫中影響頂點(diǎn)位置的矩陣數(shù)據(jù),然后通過這些矩陣數(shù)據(jù)計(jì)算出某個(gè)時(shí)刻不翩,各種submesh的頂點(diǎn)的位置兵扬。我們通過時(shí)間去驅(qū)動(dòng)動(dòng)畫采樣器,動(dòng)畫采樣器計(jì)算出矩陣來影響各個(gè)subumesh口蝠,就形成了骨骼動(dòng)畫器钟。跟著我們學(xué)完了FBX骨骼動(dòng)畫課程的人都知道,你只要是認(rèn)真學(xué)習(xí)了妙蔗,就知道傲霸,動(dòng)畫的計(jì)算是非常耗時(shí)的。因?yàn)槟阈枰總€(gè)頂點(diǎn)是被多個(gè)矩陣影響的眉反,這樣一來昙啄,每一次模型的所有頂點(diǎn)的重新計(jì)算就涉及到多個(gè)矩陣的相乘,并且還需要將這些累加的效果應(yīng)用到所有的頂點(diǎn)數(shù)據(jù)上去寸五。在CPU上來做這件事情的開銷是非常大的梳凛。為了讓我們的課程邏輯更清晰,我們采用的是OpenGL的固定管線來教學(xué)的梳杏。任何一個(gè)學(xué)了可編程管線韧拒,并真正掌握了的人淹接,肯定知道如何變通成為可編程管線版。
難點(diǎn)
骨骼動(dòng)畫難的地方不是給模型貼圖和解碼材質(zhì)叛溢,那些東西只是一個(gè)工程學(xué)問題塑悼,只要有編程功底的人,有足夠的能力去組織一套復(fù)雜的代碼楷掉,這些問題都不是問題厢蒜。骨骼動(dòng)畫難的地方在于矩陣的理解,說具體點(diǎn)靖诗,就是那些Cluster上的矩陣是怎么影響到了各部分submesh上的頂點(diǎn)的郭怪。理論上難點(diǎn)如下,如果不是下面的問題那么一定是你自己的基礎(chǔ)不好刊橘,胡思亂想鄙才,瞎給自己折騰出來的一些難點(diǎn):
cluster與骨頭的對(duì)應(yīng)關(guān)系
cluster與頂點(diǎn)們的對(duì)應(yīng)關(guān)系
這些矩陣如何計(jì)算才是正確的骨骼矩陣的公式
動(dòng)畫采樣器是個(gè)黑盒,你不理解它是怎么采樣出來那些矩陣的促绵。
其中1攒庵、2、3點(diǎn)都在我們的FBX骨骼動(dòng)畫課程中做了詳細(xì)講解败晴,至于第4點(diǎn)為什么不講浓冒,是因?yàn)槲覀儾恢繤BX SDK是如何實(shí)現(xiàn)動(dòng)畫采樣器的,他們不是開源的東西尖坤。
動(dòng)畫采樣器
關(guān)于動(dòng)畫采樣器稳懒,實(shí)際上大家更多的不理解是它到底是個(gè)什么。實(shí)際上這部分內(nèi)容不是三言兩語能說明白的慢味,你需要系統(tǒng)的學(xué)習(xí)整個(gè)動(dòng)畫理論的知識(shí)场梆,而你想要學(xué)會(huì)動(dòng)畫理論,首先你要理解數(shù)學(xué)中的大量的插值技術(shù)纯路,我們的2D幀動(dòng)畫或油、3D幀動(dòng)畫、FBX骨骼動(dòng)畫都是某種動(dòng)畫的特例驰唬。實(shí)際上是可以泛化的顶岸,但是由于覆蓋的知識(shí)面太多,大家也知道叫编,我們這里的內(nèi)容屬于小眾內(nèi)容辖佣,有興趣來學(xué)習(xí)的都是聰明絕頂?shù)娜耍话愕某绦騿T是不會(huì)來鉆這塊內(nèi)容的搓逾。因?yàn)樗麄冃枰膬H僅的是一份工作卷谈,來學(xué)習(xí)這部分高深內(nèi)容的程序員,更多的是出于求知欲恃逻,對(duì)于原理的渴望雏搂,鉆研能讓這部分人過的更充實(shí)。
常見的誤區(qū)1
FBX不就是為了游戲而設(shè)計(jì)的嗎寇损?這必然不是凸郑,F(xiàn)BX不是慈善家,就跟天下沒有免費(fèi)又好吃的午餐一樣矛市,每個(gè)人都要生存芙沥,有的人堂堂正正的賺錢,有的人通過免費(fèi)浊吏,吸引客源而昨,最終想著別的方法賺錢,但最終都是需要落實(shí)到賺錢這件事上找田。堂堂正正賺錢的歌憨,肯定會(huì)做好本職的工作,而靠免費(fèi)來引流賺錢的墩衙,肯定免費(fèi)只是表象务嫡,它更多的時(shí)間需要思考怎么變現(xiàn)。
回來說FBX漆改,F(xiàn)BX是Adobe的用于存儲(chǔ)3D數(shù)據(jù)的格式心铃,它本身就不是為游戲而設(shè)計(jì),之所以大家用FBX動(dòng)畫挫剑,一個(gè)原因僅僅是它可以支持游戲去扣。
常見的誤區(qū)2
我不管,我要用C++寫出代碼樊破,使得我的C++程序讀入FBX模型愉棱,并渲染出來的時(shí)候,能夠逼近或者達(dá)到在Maya中一樣的效果捶码。
這一點(diǎn)但凡有經(jīng)驗(yàn)的程序員都不會(huì)這么想羽氮,一般這么想的都是純理論派,從未真正去接觸游戲產(chǎn)業(yè)的人惫恼。我們有大量的證據(jù)可以證明這樣做沒有任何意義档押。但你要是想做,并不是不可能祈纯。
你使用Unity導(dǎo)入FBX動(dòng)畫模型或者靜態(tài)模型去做游戲的時(shí)候令宿,是直接把模型丟進(jìn)Unity里,打包成AssetBundle后腕窥,就可以直接用的嗎粒没。并非如此,大部分情況都是簇爆,你先把模型導(dǎo)入進(jìn)來癞松,然后給模型各個(gè)submesh貼上心儀的材質(zhì)球爽撒,然后改改shader或者調(diào)調(diào)參數(shù),讓模型外觀看起來更滿意响蓉,最后才是打包發(fā)布游戲硕勿。我們注意到,實(shí)際上在3D建模軟件中的材質(zhì)系統(tǒng)枫甲,實(shí)際上在游戲制作的時(shí)候是沒什么用的源武,無論如何我們都需要手動(dòng)的去調(diào)整我們的模型,讓它在游戲引擎里看起來更加的精致想幻。為什么會(huì)產(chǎn)生這種問題呢粱栖?因?yàn)椋?D建模軟件的渲染系統(tǒng)跟游戲的渲染系統(tǒng)是不一樣的。他們之間的材質(zhì)并不能產(chǎn)生一一對(duì)應(yīng)的關(guān)系脏毯,所以你也不必去為了解碼模型的材質(zhì)而煩惱闹究,因?yàn)槟莻€(gè)根本不重要。這些你后續(xù)手動(dòng)設(shè)置就好了食店。
我們現(xiàn)在假設(shè)你已經(jīng)能夠做到跋核,在Maya中看到的是什么樣子,你自己寫的程序中就是什么樣子的級(jí)別了叛买。但是Maya中那個(gè)實(shí)時(shí)被渲染出來的模型砂代,你覺得好看嗎?我們很多程序員小姐姐(不好意思率挣,我們忽略了程序員小哥哥刻伊,因?yàn)槲覀兪歉矚g妹子的,不喜歡漢子椒功,攪基者滾)不是美術(shù)妹子捶箱。在3D建模軟件中通常具備兩套以上的渲染系統(tǒng),一套是建模用的动漾,這套系統(tǒng)高效丁屎,但是畫面不那么精致,另一套系統(tǒng)可能是PBRT的旱眯,一幀畫面可能要八年才渲染的出來(或許是八十年)晨川。具體如何操作,請(qǐng)請(qǐng)教美術(shù)妹子删豺」猜牵回到寫程序的方面,即便你能實(shí)現(xiàn)Maya中所有的材質(zhì)球呀页,那又能如何妈拌?你只不過實(shí)現(xiàn)了一套渲染出來很挫的畫面。
在本文的最后蓬蝶,我們希望同學(xué)們回歸正軌尘分,不要在無所謂的事情上瞎折騰猜惋,那只會(huì)讓本來應(yīng)該去談戀愛的時(shí)間,拿來折騰自己培愁。