3D动画概述暨骨骼动画实现
引言
本文論述了3D領(lǐng)域內(nèi)的常見動(dòng)畫類型的運(yùn)作機(jī)制。不同于其他文章簡(jiǎn)單的羅列和介紹每種類型的3D動(dòng)畫,本文嘗試以一種優(yōu)化演進(jìn)的思路對(duì)動(dòng)畫運(yùn)作機(jī)理進(jìn)行遞進(jìn)式推演,在這個(gè)過(guò)程中自然而然的推導(dǎo)出常見的幾種3D動(dòng)畫類型,以此證明其出現(xiàn)的必要性和合理性。本文盡量以平實(shí)簡(jiǎn)明的語(yǔ)言來(lái)闡述講解,不過(guò)如果閱讀者具備初級(jí)3D知識(shí),對(duì)頂點(diǎn),矩陣變換,著色器等有一定認(rèn)識(shí),閱讀效果會(huì)更好。另外,本文聚焦在相對(duì)宏觀的機(jī)制層面,對(duì)細(xì)節(jié)不做過(guò)多描述。
動(dòng)畫宏觀分類
3D領(lǐng)域內(nèi),刨除粒子等特殊的動(dòng)畫效果,對(duì)于一個(gè)3D物體來(lái)說(shuō),動(dòng)畫效果可以概括性分為兩類:紋理變化效果和頂點(diǎn)變化效果,兩者可以模擬出的動(dòng)畫效果基本互不相交。
紋理變化
紋理變化可以營(yíng)造出物體表面圖案不斷變化的效果,更進(jìn)一步,如果結(jié)合透明/光照等高級(jí)紋理類型,可以實(shí)現(xiàn)更加豐富的效果。紋理變化通過(guò)改變紋理采樣坐標(biāo)來(lái)實(shí)現(xiàn)動(dòng)畫效果,自然不會(huì)引起模型的形變,想象一個(gè)靜止的,不斷變換表面顏色的球體。紋理變化方案對(duì)應(yīng)的動(dòng)畫類型就是UV動(dòng)畫,該動(dòng)畫類型擅長(zhǎng)模擬水流,巖漿等流體效果,雖然效果做不到非常逼真,但是性價(jià)比很高,因?yàn)閁V動(dòng)畫的性能損耗極低,在一些遠(yuǎn)景或者對(duì)視覺(jué)要求不是非常高的情況下可以被大量使用。UV動(dòng)畫的機(jī)理非常簡(jiǎn)單, 不再做過(guò)多展開。下圖是一個(gè)UV動(dòng)畫模擬瀑布的效果:
頂點(diǎn)變化
頂點(diǎn)變化則是通過(guò)物體模型頂點(diǎn)的位移來(lái)營(yíng)造出物體不斷形變(嚴(yán)格的說(shuō)是形變和位移,但是在3D范疇內(nèi),可以籠統(tǒng)的統(tǒng)稱為形變)的效果,相對(duì)的就不會(huì)導(dǎo)致物體表面紋理變化。下圖的頭盔合上動(dòng)作就是一個(gè)簡(jiǎn)單的頂點(diǎn)變化效果:
頂點(diǎn)動(dòng)畫
綜合上面的描述和效果,可以看出兩者的效果互不重疊,互相補(bǔ)充,各自有各自的適用場(chǎng)景。不過(guò)顯然頂點(diǎn)變化效果在3D動(dòng)畫領(lǐng)域中的比重更大,想象如果3D世界中的物體都是靜止沒(méi)有動(dòng)作的,那該是多么無(wú)聊的一個(gè)世界!因此下面重點(diǎn)探討頂點(diǎn)變化動(dòng)畫效果的實(shí)現(xiàn),既然是通過(guò)調(diào)整頂點(diǎn)位置來(lái)實(shí)現(xiàn)變化,那么如何調(diào)整頂點(diǎn)就是一個(gè)關(guān)鍵的問(wèn)題,我們想要的某個(gè)動(dòng)作效果不是對(duì)頂點(diǎn)隨機(jī)調(diào)整一下就能出來(lái)的,頂點(diǎn)的移動(dòng)需要遵循預(yù)設(shè)好的一套軌跡,才能達(dá)成我們要的效果。這樣問(wèn)題就變成了預(yù)設(shè)的動(dòng)畫軌跡如何表示和保存,以及如何應(yīng)用到頂點(diǎn)上。
任何問(wèn)題的思考和解決都需要一個(gè)基準(zhǔn)點(diǎn),一般來(lái)說(shuō),這個(gè)基準(zhǔn)點(diǎn)就是我們最直觀(一般也是最野蠻)的想法:第一版方案出爐:假設(shè)模型的某個(gè)動(dòng)畫有30幀,那么只要把每一幀模型的所有頂點(diǎn)位置記錄下來(lái),然后在動(dòng)畫運(yùn)行時(shí)根據(jù)之前記錄的每幀模型頂點(diǎn)位置進(jìn)行頂點(diǎn)位置更新即可實(shí)現(xiàn)動(dòng)畫效果。這個(gè)方法確實(shí)可以工作,并且直觀便于理解。當(dāng)然缺點(diǎn)也很明顯:一個(gè)模型除了其紋理之外,頂點(diǎn)數(shù)據(jù)是最耗費(fèi)存儲(chǔ)空間的(越復(fù)雜的模型頂點(diǎn)越多,占的空間也越大),上面提到的保存每一幀模型的所有頂點(diǎn)位置,最終會(huì)導(dǎo)致模型文件變的非常龐大,進(jìn)一步導(dǎo)致加載后占用的內(nèi)存和顯存也非常龐大(后兩者是非常寶貴的資源)。最極端的情況下,一個(gè)動(dòng)畫多一些的復(fù)雜模型要求的存儲(chǔ)甚至可能超過(guò)設(shè)備提供的內(nèi)存容量。這個(gè)方案在性價(jià)比和擴(kuò)展性上都比較糟糕,需要進(jìn)一步優(yōu)化。
一個(gè)明顯的優(yōu)化方向是嘗試減少因?yàn)閯?dòng)畫而引入的額外信息(主要是頂點(diǎn)數(shù)據(jù)),先觀察上面那個(gè)頭盔動(dòng)畫的每幀軌跡:
可以觀察到第1幀和第10幀之間的8幀是遵循一定運(yùn)動(dòng)規(guī)律的(勻速的向下合)。似乎可以從第1幀和第10幀,即動(dòng)畫的起點(diǎn)和終點(diǎn)推導(dǎo)出中間某個(gè)時(shí)間點(diǎn)的模型頂點(diǎn)位置信息,這就引入了第一個(gè)優(yōu)化手段:關(guān)鍵幀和插值計(jì)算,改進(jìn)方案出爐了:首先,不再保存動(dòng)畫每一幀的模型頂點(diǎn)信息,取而代之的則是預(yù)先指定一系列關(guān)鍵幀,關(guān)鍵幀的數(shù)量視動(dòng)畫的復(fù)雜程度和插值需要而定,分散在整個(gè)動(dòng)畫的不同進(jìn)度點(diǎn)上,動(dòng)畫在每個(gè)關(guān)鍵幀的頂點(diǎn)信息會(huì)被保存,當(dāng)動(dòng)畫運(yùn)行到某個(gè)時(shí)間節(jié)點(diǎn)時(shí),取該時(shí)間節(jié)點(diǎn)前后兩個(gè)關(guān)鍵幀的頂點(diǎn)信息進(jìn)行線性插值計(jì)算(或者其他插值方式,不過(guò)一般是線性),得到的結(jié)果就是在動(dòng)畫在這個(gè)節(jié)點(diǎn)時(shí)的模型頂點(diǎn)信息。以上面序列例,我們只需要保存兩個(gè)關(guān)鍵幀數(shù)據(jù)(第1幀和第10幀),其他幀的數(shù)據(jù)都可以根據(jù)時(shí)間進(jìn)度結(jié)合這兩個(gè)關(guān)鍵幀推導(dǎo)出來(lái)。
這個(gè)優(yōu)化方案在大多數(shù)情況下比初始方案要節(jié)省很多的內(nèi)存空間,以上面序列為例,可以節(jié)省80%的空間,以時(shí)間換取空間(插值是需要計(jì)算時(shí)間的),但是當(dāng)前設(shè)備的計(jì)算能力遠(yuǎn)遠(yuǎn)大于插值計(jì)算的計(jì)算需求,可以接受。這種實(shí)現(xiàn)方案其實(shí)就是“頂點(diǎn)動(dòng)畫”,現(xiàn)在仍然在一些動(dòng)畫場(chǎng)景中得到應(yīng)用。
剛性階層動(dòng)畫
上面推導(dǎo)出的頂點(diǎn)動(dòng)畫方案似乎已經(jīng)優(yōu)化的比較充分了,但是優(yōu)化之路還沒(méi)有結(jié)束。考慮下頂點(diǎn)動(dòng)畫的短板,觀察下面這個(gè)動(dòng)畫以及其相對(duì)的序列幀,一個(gè)小狗晃動(dòng)著身體:
顯然這個(gè)動(dòng)畫我們很難找到可以被插值求出來(lái)的幀,因?yàn)樾」返膭?dòng)作相對(duì)之前的頭盔來(lái)說(shuō),沒(méi)有運(yùn)動(dòng)規(guī)律可循。如果要使用頂點(diǎn)動(dòng)畫,就不得不將每一幀都做為關(guān)鍵幀,完全退化為了第一版方案(就像某些計(jì)算機(jī)算法,在一定的計(jì)算場(chǎng)景下復(fù)雜度退化很嚴(yán)重),頂點(diǎn)動(dòng)畫不適用這種應(yīng)用場(chǎng)景,需要探索新的優(yōu)化方案。先總結(jié)下這個(gè)動(dòng)畫場(chǎng)景的特點(diǎn):模型由多個(gè)部件和關(guān)節(jié)構(gòu)成,部件之間通過(guò)關(guān)節(jié)鉸接。關(guān)節(jié)使得了每個(gè)部件可以有獨(dú)立的運(yùn)動(dòng)軌跡,同時(shí)部件之間有可以通過(guò)關(guān)節(jié)進(jìn)行聯(lián)動(dòng)影響,最終復(fù)合起來(lái)形成了上面的動(dòng)畫效果。
從上面的場(chǎng)景分析可以得出一種新思路:模擬關(guān)節(jié)體系(某種意義上是仿生學(xué))。關(guān)節(jié)可以生效的前提是,原來(lái)的總體模型按照動(dòng)作需求被拆分為子模型,接著用關(guān)節(jié)鏈接子模型。為了實(shí)現(xiàn)總體關(guān)節(jié)聯(lián)動(dòng),子模型和關(guān)節(jié)一起構(gòu)成一顆驅(qū)動(dòng)樹,在驅(qū)動(dòng)樹中,父節(jié)點(diǎn)通過(guò)關(guān)節(jié)驅(qū)動(dòng)子節(jié)點(diǎn)運(yùn)動(dòng),子節(jié)點(diǎn)進(jìn)一步驅(qū)動(dòng)更下級(jí)的節(jié)點(diǎn),最終實(shí)現(xiàn)了上面場(chǎng)景的動(dòng)畫效果。這種方案被稱為“剛性階層動(dòng)畫”,“剛性”指的是子模型本身不會(huì)形變,只會(huì)被關(guān)節(jié)帶動(dòng)做移動(dòng)旋轉(zhuǎn)等動(dòng)作,因此子模型也被稱做”剛體”。”階層”指的則是上面提到的驅(qū)動(dòng)樹模型代表的層級(jí)關(guān)系,有了層級(jí)關(guān)系才能進(jìn)行整體聯(lián)動(dòng)。到了這一步,可以看出來(lái),我們構(gòu)造的這棵樹其實(shí)近似于是一棵“骨骼樹”了,剛體就是骨骼,關(guān)節(jié)則連接和驅(qū)動(dòng)骨骼。下圖就是一個(gè)簡(jiǎn)單的剛體階層模型的示意圖,可以看出,模型被拆分為了若干的子模型,通
過(guò)關(guān)節(jié)連接構(gòu)成驅(qū)動(dòng)樹:
新驅(qū)動(dòng)模型下不需要保存每個(gè)頂點(diǎn)的動(dòng)畫信息了。頂點(diǎn)在這個(gè)模型中被按需組織整合為骨骼,只需要移動(dòng)骨骼就可以實(shí)現(xiàn)想要的動(dòng)畫效果。換而言之,頂點(diǎn)的動(dòng)作軌跡被取代為了骨骼的運(yùn)動(dòng)軌跡。很顯然,骨骼的數(shù)量要比頂點(diǎn)數(shù)量少幾個(gè)數(shù)量級(jí)(舉個(gè)不太恰當(dāng)?shù)谋扔?#xff0c;模型的頂點(diǎn)就如同人體的細(xì)胞,模型的骨骼對(duì)應(yīng)人體的骨骼,顯然骨骼要比細(xì)胞少很多),這就克服了保存巨量頂點(diǎn)信息的缺點(diǎn),取而代之的是只需要維護(hù)骨骼體系和每個(gè)骨骼在關(guān)鍵幀的變換矩陣即可,運(yùn)算量也從對(duì)每個(gè)頂點(diǎn)做插值計(jì)算減少到對(duì)骨骼樹遍歷矩陣變換。
骨骼動(dòng)畫
到了這一步,似乎已經(jīng)接近終點(diǎn),剛性階段動(dòng)畫看上去可以很好的滿足關(guān)節(jié)聯(lián)動(dòng)的動(dòng)畫場(chǎng)景。遺憾是,還不夠,剛性階段動(dòng)畫通過(guò)引入關(guān)節(jié)連接剛體骨骼的概念在宏觀粗粒度上滿足了關(guān)節(jié)聯(lián)動(dòng)的需求,但是也恰恰是這種實(shí)現(xiàn)導(dǎo)致了剛性階段動(dòng)畫的一個(gè)瑕疵:觀察上圖紅圈標(biāo)記的部分,你會(huì)發(fā)現(xiàn)兩個(gè)剛體骨骼之間有著明顯的“空隙”,究其原因,是剛體本身沒(méi)有被形變,而剛體是通過(guò)關(guān)節(jié)連接的,有連接就會(huì)有空隙。對(duì)于某些模型,比如機(jī)器人或者機(jī)械/節(jié)肢類物體,空隙的存在是符合現(xiàn)實(shí)觀察結(jié)果的。但是呢,對(duì)于有表皮的生物體來(lái)說(shuō),比如人體,這就顯得非常不真實(shí),人體的骨骼關(guān)節(jié)在扭動(dòng)時(shí),會(huì)有皮膚包裹,不會(huì)有視覺(jué)上的空隙,只有從X光機(jī)觀察時(shí),才能看到骨骼之間的空隙。
上述應(yīng)用場(chǎng)景的特色是“表皮”,整個(gè)模型都被一層柔性表皮包裹,這樣在內(nèi)部剛體骨骼扭動(dòng)時(shí),關(guān)節(jié)處的表皮被拉伸,從而避免了視覺(jué)上空隙的出現(xiàn)。那么問(wèn)題就變成了如何通過(guò)程序和建模模擬這層表皮?先回顧剛體骨骼導(dǎo)致空隙的原因是剛體骨骼本身在扭動(dòng)時(shí)沒(méi)有形變,導(dǎo)致關(guān)節(jié)處的空隙不能被覆蓋,如果有辦法把剛體在關(guān)節(jié)處的頂點(diǎn)進(jìn)行形變擬合,就可以模擬這層表皮。其中的關(guān)鍵點(diǎn)是,關(guān)節(jié)處的這些頂點(diǎn),將不再只屬于某個(gè)剛體骨骼,而是該關(guān)節(jié)處所有剛體骨骼在這個(gè)點(diǎn)位置的共同部分。獨(dú)立的剛體骨骼模型已經(jīng)不能滿足這個(gè)需求了,因?yàn)楠?dú)立剛體各自的頂點(diǎn)都是專屬的,不能被共享。
這樣就需要一種新的模型組織形式,新的組織形式既要能保持剛性階層動(dòng)畫的層級(jí)和關(guān)節(jié)特性,又要能體現(xiàn)出關(guān)節(jié)處頂點(diǎn)是被多個(gè)剛體骨骼共同影響的結(jié)果,前者限定了新的表述形式還是骨骼驅(qū)動(dòng)樹加關(guān)節(jié),后者要求我們打破剛體的物理限制,否則還是不能實(shí)現(xiàn)頂點(diǎn)的“共享”。矛盾的焦點(diǎn)就集中在了剛體骨骼上,在打破其物理限制的同時(shí)又要保留其概念,解決這個(gè)問(wèn)題的常用的手法就是“虛擬化”:往深一層看,剛體骨骼在我們方案中扮演的是一個(gè)“頂點(diǎn)包裹”的統(tǒng)合性角色, 以前包裹的實(shí)現(xiàn)形式是建模時(shí)的模型拆分(比如分拆為多個(gè)Mesh), 屬于物理分割。這次換一種實(shí)現(xiàn)方式: 把每個(gè)頂點(diǎn)屬于哪個(gè)包裹(骨骼)都記錄下來(lái),那么在內(nèi)存中我們完全可以以此信息構(gòu)造出一個(gè)虛擬的骨骼,而因?yàn)檫@次模型本身沒(méi)有拆分,因此頂點(diǎn)之間是沒(méi)有界限的,一個(gè)頂點(diǎn)可以歸屬(依附)于復(fù)數(shù)個(gè)骨骼,這就達(dá)成了上面提到了頂點(diǎn)共享的目的。涉及到動(dòng)畫骨骼驅(qū)動(dòng),頂點(diǎn)只被共享還不夠,還要體現(xiàn)出“共同影響”這一點(diǎn),同一個(gè)頂點(diǎn)被復(fù)數(shù)根骨骼影響,每根骨骼對(duì)其會(huì)有不一樣的影響力度,這個(gè)信息也需要被記錄下來(lái),體現(xiàn)為權(quán)重值。下圖就顯示了新的骨骼樹模型,可以看到,模型本身沒(méi)有被拆分,在其內(nèi)部虛擬化了若干根骨骼(藍(lán)色部分):
通過(guò)這個(gè)新的表現(xiàn)方式,關(guān)節(jié)處的頂點(diǎn)在扭動(dòng)過(guò)程中將被關(guān)節(jié)的所有骨骼綜合影響,最終移動(dòng)到一個(gè)合適的新位置來(lái)避免間隙的出現(xiàn),就像之前的提到的柔性表皮的作用一樣。下圖就展示了模擬表皮的效果,可以看到,模型的關(guān)節(jié)部分沒(méi)有出現(xiàn)空隙:
這也就是骨骼動(dòng)畫為什么全名被稱為“骨骼蒙皮動(dòng)畫”的原因,“蒙皮”指的就是上述解決方案。骨骼蒙皮動(dòng)畫如其名,擅長(zhǎng)的就是有骨骼關(guān)節(jié)參與的動(dòng)畫過(guò)程,因此也有一定的局限性。比如下圖的人類面部表情動(dòng)畫,骨骼蒙皮就不太適用,因?yàn)槿祟惸槻康募∪鈹?shù)量很多,層級(jí)也復(fù)雜,每塊肌肉都需要一根骨骼對(duì)應(yīng),最終的計(jì)算量會(huì)比較龐大,骨骼的變換矩陣調(diào)整對(duì)建模師要求也較高。相對(duì)的頂點(diǎn)動(dòng)畫則更適合這種場(chǎng)景。
動(dòng)畫方案總結(jié)
至此,我們的方案探討基本完畢,總結(jié)來(lái)看,在動(dòng)畫優(yōu)化的過(guò)程中引入了關(guān)鍵幀,插值,關(guān)節(jié),骨骼驅(qū)動(dòng)樹,虛擬化等手段。除了從模型操作層面理解這幾種優(yōu)化手段外,還可以從數(shù)據(jù)壓縮的角度進(jìn)行理解,整個(gè)動(dòng)畫的優(yōu)化過(guò)程實(shí)質(zhì)是一個(gè)數(shù)據(jù)壓縮的過(guò)程:
- 最初方案中每一幀保存所有的頂點(diǎn)數(shù)據(jù),數(shù)據(jù)量最龐大,但形變自由度也是最高的,沒(méi)有任何約束,任意一個(gè)頂點(diǎn)的位置可以任意調(diào)整。但很多時(shí)候動(dòng)畫并不需要這種高自由度,而是多少遵循一些限制或者規(guī)則,這種情況下最初方案引入的全額數(shù)據(jù)就顯得冗余,需要進(jìn)行壓縮。
- 頂點(diǎn)動(dòng)畫的關(guān)鍵幀技術(shù)實(shí)質(zhì)就是頂點(diǎn)數(shù)據(jù)壓縮,通過(guò)插值求中間結(jié)果這一規(guī)則限制,將原來(lái)保存每幀頂點(diǎn)數(shù)據(jù)壓縮到只需要保存幾個(gè)關(guān)鍵幀的頂點(diǎn)信息。
- 骨骼動(dòng)畫同理,為自己施加了骨骼驅(qū)動(dòng)樹和只能調(diào)整關(guān)節(jié)等限制,限制力度在大多時(shí)候比頂點(diǎn)動(dòng)畫還要強(qiáng),因此取得了更高的動(dòng)畫數(shù)據(jù)壓縮率。
骨骼動(dòng)畫的實(shí)現(xiàn)
下面簡(jiǎn)述骨骼動(dòng)畫的落地實(shí)現(xiàn),不涉及太多細(xì)節(jié),知曉了機(jī)理之后,實(shí)現(xiàn)即是水到渠成。
首先從骨骼動(dòng)畫的機(jī)制推導(dǎo)出驅(qū)動(dòng)骨骼動(dòng)畫需要的數(shù)據(jù):
- 模型骨骼樹的結(jié)構(gòu)數(shù)據(jù),描述模型都有哪些骨骼,以及骨骼之間的連接關(guān)系。
- 每個(gè)頂點(diǎn)需要這些額外數(shù)據(jù): 該頂點(diǎn)依附于哪些骨骼(即被哪些骨骼影響),以及每根骨骼的影響權(quán)重。
- 骨骼動(dòng)畫的關(guān)鍵幀數(shù)據(jù),每個(gè)關(guān)鍵幀數(shù)據(jù)會(huì)保存每個(gè)骨骼在這個(gè)關(guān)鍵幀時(shí)間節(jié)點(diǎn)時(shí)相對(duì)父骨骼節(jié)點(diǎn)的變換矩陣, 每個(gè)關(guān)鍵幀還會(huì)保存自己對(duì)應(yīng)的時(shí)間點(diǎn)。
- 動(dòng)畫通用數(shù)據(jù): 名稱, 持續(xù)時(shí)間等。
上述數(shù)據(jù)就足以驅(qū)動(dòng)一個(gè)骨骼動(dòng)畫了,下面是在OpenGL環(huán)境下驅(qū)動(dòng)骨骼動(dòng)畫的大致流程:
下面貼出上述流程使用的示例頂點(diǎn)著色器源碼,該示例限定了模型最多有50根骨骼(MAX_BONES), 一個(gè)頂點(diǎn)最多被4根骨骼影響(通過(guò)vec4屬性類型體現(xiàn))。
// attribute attribute vec3 attPosition; attribute vec2 attUV; attribute vec4 attBoneIds; // 該頂點(diǎn)被哪些骨骼所影響 attribute vec4 attBoneWeights; // 每根骨骼的影響權(quán)重// uniform const int MAX_BONES = 50; // 模型最多有50根骨骼 uniform mat4 bonesMat[MAX_BONES]; // 骨骼變換矩陣數(shù)據(jù) uniform mat4 mvpMat;void main() {// 基于每根骨骼的權(quán)重和變換矩陣求出在這些骨骼的綜合影響下的骨骼變換矩陣mat4 boneTransform = bonesMat[int(attBoneIds.x)] * attWeights.x;boneTransform += bonesMat[int(attBoneIds.y)] * attWeights.y;boneTransform += bonesMat[int(attBoneIds.z)] * attWeights.z;boneTransform += bonesMat[int(attBoneIds.w)] * attWeights.w;gl_Position = mvpMat * boneTransform * vec4(attPosition, 1.0);textureCoords = attUV; }結(jié)語(yǔ)
至此,3D領(lǐng)域動(dòng)畫論述基本結(jié)束,一個(gè)概括性結(jié)論:3D動(dòng)畫的本質(zhì)還是操作數(shù)據(jù),各種動(dòng)畫類型對(duì)應(yīng)了不同的數(shù)據(jù)操作理念和手法。本文涉及到的只是一些基本的3D動(dòng)畫類型,在工業(yè)級(jí)應(yīng)用中,會(huì)出現(xiàn)更多的專業(yè)細(xì)分領(lǐng)域和動(dòng)作驅(qū)動(dòng)機(jī)制。不過(guò)對(duì)于相對(duì)輕量簡(jiǎn)單的應(yīng)用場(chǎng)景,比如手機(jī)攝像頭特效之類的應(yīng)用,上述動(dòng)畫類型基本可以覆蓋大部分需求。
總結(jié)
以上是生活随笔為你收集整理的3D动画概述暨骨骼动画实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 血压计模块|臂式血压计方案
- 下一篇: MySQL数据库的MNA集群环境配置