FBX骨骼動(dòng)畫(huà)

不要在追尋什么人生的意義,追尋本身就很有意義-《萌菇?jīng)觥?/p>

本周我們拿出一些可能其他同學(xué)也存在的疑問(wèn)來(lái)給大家講解一下關(guān)于FBX骨骼動(dòng)畫(huà)的方面東西。我們應(yīng)該如何去做一個(gè)動(dòng)畫(huà)系統(tǒng)。

關(guān)于繪制

我們首先來(lái)看看,我們要繪制動(dòng)畫(huà)需要具備什么樣的底層基礎(chǔ)功能:

  1. 繪制一群三角形的能力(因?yàn)闊o(wú)論模型如何復(fù)雜,它都是由三角形構(gòu)成,或許你比較菜鳥(niǎo),只能繪制21845個(gè)三角形(65535除以3),或許你有良好的數(shù)據(jù)組織,你有一個(gè)引擎,你可以突破這些瓶頸)

  2. Shader,你需要一個(gè)Shader為你的模型的各個(gè)部分進(jìn)行著色,我們解析過(guò)FBX模型的知道,F(xiàn)BX模型里是有很多個(gè)節(jié)點(diǎn)的,節(jié)點(diǎn)上都掛在了Submesh這樣的東西,而每個(gè)submesh基本上可以對(duì)應(yīng)到某一群三角形的集合。于是乎,我們就需要特定的shader去繪制每個(gè)submesh,或許整個(gè)模型都可以使用一個(gè)shader去繪制。

  3. 動(dòng)畫(huà)采樣器,或許有的人至今不明白剛體動(dòng)畫(huà)和骨骼動(dòng)畫(huà)有什么區(qū)別,但那又如何。我們來(lái)說(shuō)說(shuō)動(dòng)畫(huà)采樣器,動(dòng)畫(huà)采樣器就是根據(jù)時(shí)間點(diǎn)的信息,能夠插值出動(dòng)畫(huà)中影響頂點(diǎn)位置的矩陣數(shù)據(jù),然后通過(guò)這些矩陣數(shù)據(jù)計(jì)算出某個(gè)時(shí)刻,各種submesh的頂點(diǎn)的位置。我們通過(guò)時(shí)間去驅(qū)動(dòng)動(dòng)畫(huà)采樣器,動(dòng)畫(huà)采樣器計(jì)算出矩陣來(lái)影響各個(gè)subumesh,就形成了骨骼動(dòng)畫(huà)。跟著我們學(xué)完了FBX骨骼動(dòng)畫(huà)課程的人都知道,你只要是認(rèn)真學(xué)習(xí)了,就知道,動(dòng)畫(huà)的計(jì)算是非常耗時(shí)的。因?yàn)槟阈枰總€(gè)頂點(diǎn)是被多個(gè)矩陣影響的,這樣一來(lái),每一次模型的所有頂點(diǎn)的重新計(jì)算就涉及到多個(gè)矩陣的相乘,并且還需要將這些累加的效果應(yīng)用到所有的頂點(diǎn)數(shù)據(jù)上去。在CPU上來(lái)做這件事情的開(kāi)銷(xiāo)是非常大的。為了讓我們的課程邏輯更清晰,我們采用的是OpenGL的固定管線來(lái)教學(xué)的。任何一個(gè)學(xué)了可編程管線,并真正掌握了的人,肯定知道如何變通成為可編程管線版。

難點(diǎn)

骨骼動(dòng)畫(huà)難的地方不是給模型貼圖和解碼材質(zhì),那些東西只是一個(gè)工程學(xué)問(wèn)題,只要有編程功底的人,有足夠的能力去組織一套復(fù)雜的代碼,這些問(wèn)題都不是問(wèn)題。骨骼動(dòng)畫(huà)難的地方在于矩陣的理解,說(shuō)具體點(diǎn),就是那些Cluster上的矩陣是怎么影響到了各部分submesh上的頂點(diǎn)的。理論上難點(diǎn)如下,如果不是下面的問(wèn)題那么一定是你自己的基礎(chǔ)不好,胡思亂想,瞎給自己折騰出來(lái)的一些難點(diǎn):

  1. cluster與骨頭的對(duì)應(yīng)關(guān)系

  2. cluster與頂點(diǎn)們的對(duì)應(yīng)關(guān)系

  3. 這些矩陣如何計(jì)算才是正確的骨骼矩陣的公式

  4. 動(dòng)畫(huà)采樣器是個(gè)黑盒,你不理解它是怎么采樣出來(lái)那些矩陣的。

其中1、2、3點(diǎn)都在我們的FBX骨骼動(dòng)畫(huà)課程中做了詳細(xì)講解,至于第4點(diǎn)為什么不講,是因?yàn)槲覀儾恢繤BX SDK是如何實(shí)現(xiàn)動(dòng)畫(huà)采樣器的,他們不是開(kāi)源的東西。

動(dòng)畫(huà)采樣器

關(guān)于動(dòng)畫(huà)采樣器,實(shí)際上大家更多的不理解是它到底是個(gè)什么。實(shí)際上這部分內(nèi)容不是三言兩語(yǔ)能說(shuō)明白的,你需要系統(tǒng)的學(xué)習(xí)整個(gè)動(dòng)畫(huà)理論的知識(shí),而你想要學(xué)會(huì)動(dòng)畫(huà)理論,首先你要理解數(shù)學(xué)中的大量的插值技術(shù),我們的2D幀動(dòng)畫(huà)、3D幀動(dòng)畫(huà)、FBX骨骼動(dòng)畫(huà)都是某種動(dòng)畫(huà)的特例。實(shí)際上是可以泛化的,但是由于覆蓋的知識(shí)面太多,大家也知道,我們這里的內(nèi)容屬于小眾內(nèi)容,有興趣來(lái)學(xué)習(xí)的都是聰明絕頂?shù)娜?,一般的程序員是不會(huì)來(lái)鉆這塊內(nèi)容的。因?yàn)樗麄冃枰膬H僅的是一份工作,來(lái)學(xué)習(xí)這部分高深內(nèi)容的程序員,更多的是出于求知欲,對(duì)于原理的渴望,鉆研能讓這部分人過(guò)的更充實(shí)。

常見(jiàn)的誤區(qū)1

FBX不就是為了游戲而設(shè)計(jì)的嗎?這必然不是,F(xiàn)BX不是慈善家,就跟天下沒(méi)有免費(fèi)又好吃的午餐一樣,每個(gè)人都要生存,有的人堂堂正正的賺錢(qián),有的人通過(guò)免費(fèi),吸引客源,最終想著別的方法賺錢(qián),但最終都是需要落實(shí)到賺錢(qián)這件事上。堂堂正正賺錢(qián)的,肯定會(huì)做好本職的工作,而靠免費(fèi)來(lái)引流賺錢(qián)的,肯定免費(fèi)只是表象,它更多的時(shí)間需要思考怎么變現(xiàn)。

回來(lái)說(shuō)FBX,F(xiàn)BX是Adobe的用于存儲(chǔ)3D數(shù)據(jù)的格式,它本身就不是為游戲而設(shè)計(jì),之所以大家用FBX動(dòng)畫(huà),一個(gè)原因僅僅是它可以支持游戲。

常見(jiàn)的誤區(qū)2

我不管,我要用C++寫(xiě)出代碼,使得我的C++程序讀入FBX模型,并渲染出來(lái)的時(shí)候,能夠逼近或者達(dá)到在Maya中一樣的效果。

這一點(diǎn)但凡有經(jīng)驗(yàn)的程序員都不會(huì)這么想,一般這么想的都是純理論派,從未真正去接觸游戲產(chǎn)業(yè)的人。我們有大量的證據(jù)可以證明這樣做沒(méi)有任何意義。但你要是想做,并不是不可能。

  1. 你使用Unity導(dǎo)入FBX動(dòng)畫(huà)模型或者靜態(tài)模型去做游戲的時(shí)候,是直接把模型丟進(jìn)Unity里,打包成AssetBundle后,就可以直接用的嗎。并非如此,大部分情況都是,你先把模型導(dǎo)入進(jìn)來(lái),然后給模型各個(gè)submesh貼上心儀的材質(zhì)球,然后改改shader或者調(diào)調(diào)參數(shù),讓模型外觀看起來(lái)更滿意,最后才是打包發(fā)布游戲。我們注意到,實(shí)際上在3D建模軟件中的材質(zhì)系統(tǒng),實(shí)際上在游戲制作的時(shí)候是沒(méi)什么用的,無(wú)論如何我們都需要手動(dòng)的去調(diào)整我們的模型,讓它在游戲引擎里看起來(lái)更加的精致。為什么會(huì)產(chǎn)生這種問(wèn)題呢?因?yàn)椋?D建模軟件的渲染系統(tǒng)跟游戲的渲染系統(tǒng)是不一樣的。他們之間的材質(zhì)并不能產(chǎn)生一一對(duì)應(yīng)的關(guān)系,所以你也不必去為了解碼模型的材質(zhì)而煩惱,因?yàn)槟莻€(gè)根本不重要。這些你后續(xù)手動(dòng)設(shè)置就好了。

  2. 我們現(xiàn)在假設(shè)你已經(jīng)能夠做到,在Maya中看到的是什么樣子,你自己寫(xiě)的程序中就是什么樣子的級(jí)別了。但是Maya中那個(gè)實(shí)時(shí)被渲染出來(lái)的模型,你覺(jué)得好看嗎?我們很多程序員小姐姐(不好意思,我們忽略了程序員小哥哥,因?yàn)槲覀兪歉矚g妹子的,不喜歡漢子,攪基者滾)不是美術(shù)妹子。在3D建模軟件中通常具備兩套以上的渲染系統(tǒng),一套是建模用的,這套系統(tǒng)高效,但是畫(huà)面不那么精致,另一套系統(tǒng)可能是PBRT的,一幀畫(huà)面可能要八年才渲染的出來(lái)(或許是八十年)。具體如何操作,請(qǐng)請(qǐng)教美術(shù)妹子?;氐綄?xiě)程序的方面,即便你能實(shí)現(xiàn)Maya中所有的材質(zhì)球,那又能如何?你只不過(guò)實(shí)現(xiàn)了一套渲染出來(lái)很挫的畫(huà)面。

在本文的最后,我們希望同學(xué)們回歸正軌,不要在無(wú)所謂的事情上瞎折騰,那只會(huì)讓本來(lái)應(yīng)該去談戀愛(ài)的時(shí)間,拿來(lái)折騰自己。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容