黃兆銘,儲 穎
(深圳大學(xué) 計算機(jī)與軟件學(xué)院,深圳 518060)
如今的電子游戲,不僅僅是由代碼編寫的單純軟件,更承載了開發(fā)者的內(nèi)心世界[1].正因如此,電子游戲的題材與玩法也愈加豐富.相比傳統(tǒng)電子游戲中固定的游戲角色,如今的開發(fā)者和玩家對游戲角色的期望值越來越高,希望在游戲中獲得更多的自由感(如:自定義游戲角色模型).換裝系統(tǒng),正是游戲開發(fā)人員和游戲玩家追求自由的體現(xiàn).
如果一款游戲搭載了優(yōu)秀的換裝系統(tǒng),對于開發(fā)者,有可能大大降低開發(fā)難度;對于玩家,則有機(jī)會升級游戲體驗(yàn).舉例來說,著名的裝扮類游戲《閃耀暖暖》[2]、模擬經(jīng)營類游戲《模擬人生》[3]、大型多人在線角色扮演游戲《魔獸世界》[4]等,都內(nèi)置優(yōu)秀的換裝系統(tǒng),且換裝系統(tǒng)已成為這些游戲不可或缺的一部分.
然而,獨(dú)立游戲開發(fā)者想要實(shí)現(xiàn)具備換裝功能的游戲,是相當(dāng)有挑戰(zhàn)性的.原因在于,大型商業(yè)游戲工作室基本自研換裝系統(tǒng),一般不會公開相關(guān)技術(shù)細(xì)節(jié),而國內(nèi)也沒有成熟的文獻(xiàn)資料供參考.因此,利用換裝系統(tǒng)插件完成換裝功能,成為眾多獨(dú)立游戲開發(fā)者和小型游戲工作室的首選.
設(shè)計換裝系統(tǒng)插件給開發(fā)人員帶來以下挑戰(zhàn):
(1)由于插件的使用者多為美工,所設(shè)計插件應(yīng)使無編程基礎(chǔ)的使用者也能快速上手;
(2)設(shè)計換裝系統(tǒng)插件涉及大量建模和圖形學(xué)知識,這就要求開發(fā)人員對美工職能有較為深刻的理解.
因此,游戲開發(fā)者要設(shè)計并實(shí)現(xiàn)換裝系統(tǒng)插件是有一定難度的.國內(nèi)學(xué)者的研究工作有涉及換裝技術(shù)的,例如:楊靜[5]基于HTC VIVE 設(shè)計實(shí)現(xiàn)了虛擬換裝游戲,李俊等[6]基于人物替換技術(shù)實(shí)現(xiàn)了模擬試衣間,徐康熙等[7]基于物理方式實(shí)現(xiàn)了虛擬換衣系統(tǒng).然而,這些換裝、試衣系統(tǒng)的功能較為單一,僅能實(shí)現(xiàn)特定環(huán)境下的基礎(chǔ)裝扮更換,不能稱為真正的換裝系統(tǒng)插件.
目前,市面上開源、開放使用的換裝系統(tǒng)插件寥寥無幾.少量可供使用的換裝系統(tǒng)插件中,功能較為強(qiáng)大的是國外開發(fā)者基于Unity3D[8]設(shè)計的Unity Multipurpose Avatar (UMA)系統(tǒng).UMA 系統(tǒng)的特點(diǎn)是開源、易用和功能豐富,但也有缺點(diǎn),例如:時間、空間復(fù)雜度較高;更適用于制作美術(shù)模型,而不適合運(yùn)行時的角色動態(tài)合成.
為填補(bǔ)以上空白,論文設(shè)計并實(shí)現(xiàn)了一個基于Unity3D 平臺的國產(chǎn)、開源換裝系統(tǒng)插件,命名為方舟角色創(chuàng)建器(Ark Avatar Customization,AAC).AAC 插件采用改進(jìn)的貼圖集生成、編輯器擴(kuò)展和預(yù)制件優(yōu)化技術(shù),集成換裝、捏臉和換色功能,配合圖形化擴(kuò)展工具,能夠充分滿足開發(fā)者游戲開發(fā)過程中的動態(tài)、個性化換裝需求.
首先,從軟件工程思想出發(fā),AAC 系統(tǒng)設(shè)計時需兼顧功能性、可維護(hù)性與可擴(kuò)展性.同時,依據(jù)設(shè)計模式所倡導(dǎo)的單一職責(zé)原則[9],各個系統(tǒng)模塊應(yīng)盡量獨(dú)立.因此,AAC 插件系統(tǒng)定義了一系列新的、功能獨(dú)立的概念,包括:裝扮、種族、角色、基因和染料.各概念具體含義如表1所示.
表1 AAC 插件系統(tǒng)概念定義
AAC 系統(tǒng)規(guī)定,以裝扮為基本單位進(jìn)行角色的合成,并使用字符串標(biāo)識裝扮所屬的插槽類型.裝扮用以裝備在角色身上,每個插槽同一時間只能裝備一個裝扮.當(dāng)為角色裝備插槽重復(fù)的裝扮時,舊的裝扮將會被替換掉.
裝扮代表了美術(shù)模型,可以是上衣、飾品或身體部位(取決于使用者的目的).通常,使用者會將完整模型按照不同部位切分為局部模型,如:頭發(fā)、上衣、下衣、鞋子等,再分別制作成裝扮.
系統(tǒng)實(shí)現(xiàn)方面,由于模型包含骨骼、網(wǎng)格和貼圖數(shù)據(jù),因此裝扮需要存儲它們作為角色合成時的數(shù)據(jù)依據(jù).為符合單一職責(zé)原則,AAC 系統(tǒng)定義了兩個概念分別存儲美術(shù)模型數(shù)據(jù),它們是:槽位資源和布局資源.槽位資源負(fù)責(zé)存儲模型的骨骼和網(wǎng)格,布局資源負(fù)責(zé)存儲模型貼圖,如圖1所示.
圖1 AAC 布局資源和上下文示意圖
需要指出的是,槽位資源為裝扮合成提供骨骼和網(wǎng)格依據(jù),而布局資源的功能不限于提供原模型貼圖.類似Photoshop 的圖層疊加原理,假如將原模型貼圖定義為第1 組上下文,AAC 系統(tǒng)規(guī)定:布局資源可以包含一組以上的上下文(見圖1(a)).進(jìn)行裝扮合成時,從第2 組開始,依次將各上下文疊加至第1 組上下文,最終得到目標(biāo)貼圖組(見圖1(b)).
這樣設(shè)計的好處在于:能夠?qū)崿F(xiàn)類似“紋身”的裝扮效果.僅需更換“紋身貼圖”,就可以在不破壞、不冗余原模型貼圖的情況下,生成新的目標(biāo)貼圖.此外,由于“紋身貼圖”一般來說精度不高,系統(tǒng)可以使用較低的分辨率存儲它們以節(jié)省空間.結(jié)合染料的概念,“紋身貼圖”還可以起到遮罩圖層的作用,即:僅改變“紋身貼圖”中非透明區(qū)域的顏色.
圖1中,第2 組上下文的“吃豆人紋身”的有效區(qū)域只有很小一部分,但為了與第一組上下文中左邊背心的中心對齊,貼圖預(yù)留了很多“黑邊”.為進(jìn)一步優(yōu)化內(nèi)存空間,可以縮小“吃豆人紋身”的貼圖大小,采用記錄偏移值的方式,將“紋身”移動到背心中間.
AAC 定義種族的目的,是為創(chuàng)建角色提供依據(jù).與現(xiàn)實(shí)生活類似,具有相同特征的個體被劃分至同一種族.換言之,種族描述了這些特征的共性.種族的基礎(chǔ)數(shù)據(jù)定義如下:
(1)骨架描述和人類描述;
(2)裝扮類型描述;
(3)基因描述和基因作用器描述;
(4)染料描述.
其中,骨架描述用來重建角色的初始骨架,人類描述用來創(chuàng)建Unity3D 動畫系統(tǒng)中的標(biāo)準(zhǔn)人類骨架.它們都可以從導(dǎo)入至Unity3D 的模型數(shù)據(jù)中獲取.
裝扮類型描述定義了某種族可接受的插槽類型.AAC 系統(tǒng)規(guī)定,只有處于裝扮類型描述中的裝扮才是有效的、能夠參與角色合成的裝扮.通過配置不同的裝扮類型描述,可以實(shí)現(xiàn)為游戲主角(或者其種族)裝備更多部位裝扮、而為NPC (Non-Player Character)裝備較少裝扮的效果.
基因描述和染料描述的含義,將分別在1.4和1.5節(jié)中詳細(xì)介紹.
進(jìn)一步地,為了區(qū)分種族中每個單獨(dú)作用的個體,AAC 系統(tǒng)提出角色的概念.角色在種族中創(chuàng)建得到,但每個角色可以有各自不同的表現(xiàn)(如:裝備的裝扮不同).系統(tǒng)需要為每個角色單獨(dú)存儲以下數(shù)據(jù):
(1)裝扮集合;
(2)骨架和Avatar;
(3)基因數(shù)據(jù)和染料數(shù)據(jù);
(4)渲染數(shù)據(jù).
其中,裝扮集合存儲了角色當(dāng)前裝備的裝扮.骨架、Avatar、基因數(shù)據(jù)和染料數(shù)據(jù)分別從種族的骨架描述、基因描述、染料描述中創(chuàng)建得到.
和現(xiàn)實(shí)生活中生物的特性由基因決定類似,AAC系統(tǒng)中的基因特指那些能夠影響角色參數(shù)的屬性.例如:命名為身高的基因影響角色的身高,命名為肥胖程度的基因影響角色的肚子、手臂和臉等部位.基因作用器則負(fù)責(zé)產(chǎn)生這些影響.
換言之,基因負(fù)責(zé)定義角色有哪些受影響因素,基因作用器則定義了這些影響因素如何影響角色.之所以分別定義基因和基因作用器,原因在于:
(1)基因影響的功能十分豐富,如:影響骨骼、影響染料顏色、給角色裝卸裝扮等.為了支持這種靈活性,AAC 系統(tǒng)定義了不同類型的作用器以匹配相對應(yīng)的功能;
(2)某些基因的改變需要多個基因作用器共同作用才能實(shí)現(xiàn).最直觀的例子,肥胖程度基因需要修改肚子、手臂、臉等多個部位,分別對應(yīng)著多個不同的基因作用器.
圖2展示了基因和基因作用器的工作原理.當(dāng)角色從種族中創(chuàng)建時,會讀取并包裝基因,成為基因數(shù)據(jù).當(dāng)基因數(shù)據(jù)中的數(shù)值發(fā)生改變時,AAC 系統(tǒng)會將與此基因相關(guān)的基因作用器應(yīng)用至角色身上.
圖2 基因和基因作用器工作原理圖
AAC 系統(tǒng)定義了染料的概念以實(shí)現(xiàn)換色功能.和基因的定義原理類似,染料指那些能夠改變裝扮顏色的名稱.例如,上衣的裝扮中有上衣顏色染料,通過修改染料,可以修改上衣裝扮的顏色.
換色的原理本質(zhì)上與圖1布局資源中多組上下文合并的原理是一樣的.區(qū)別在于,此時第二套上下文中的貼圖是純色的,而非“紋身”.
具體實(shí)現(xiàn)方式為:當(dāng)角色從種族創(chuàng)建時,會讀取并包裝其為染料數(shù)據(jù).增加兩個顏色參數(shù)(乘性因子Multiple和加性因子Additive),分別作為乘法因子乘以貼圖顏色和作為加法因子加在貼圖顏色上,以獲取換色后的目標(biāo)顏色,見式(1).
其中,Cold為目標(biāo)顏色,Cols為原貼圖顏色.
綜上,AAC 系統(tǒng)概要設(shè)計圖如圖3所示.由圖3可見,基于Unity3D 的編輯器擴(kuò)展技術(shù),AAC 插件通過提供圖形化界面和擴(kuò)展工具,使零編程基礎(chǔ)的使用者也能輕松上手,完成自定義游戲角色的換裝功能.
圖3 AAC 插件系統(tǒng)概要設(shè)計圖
AAC 插件以裝扮為單位進(jìn)行角色的合成,包括骨骼合成、網(wǎng)格合成和貼圖合成.貼圖的合成結(jié)果稱為貼圖集,又名紋理集.盡管Unity3D 平臺提供了紋理集合成的接口函數(shù),AAC 系統(tǒng)卻無法調(diào)用.原因在于,角色合成過程中需要用到染料,而Unity3D 并不支持這一AAC 系統(tǒng)自定義概念.因此,需要自行設(shè)計并實(shí)現(xiàn)貼圖合并算法.
貼圖集生成是計算機(jī)圖形學(xué)中提高計算機(jī)生成貼圖利用率的技術(shù)[9].在貼圖集生成、優(yōu)化方面,國內(nèi)外已有大量的研究工作.例如,Maillot 等[10]提出交互式紋理映射方法,Lévy 等[11]提出基于最小二乘保角映射的方法,Purnomo 等 [12]提出無縫紋理圖集的概念,宋歌等[13]提出基于動態(tài)空間合并的算法,詹勇[14]提出針對重復(fù)紋理的合并算法,戴雪峰等[15]提出基于貪心算法和退火算法的混合算法.論文在現(xiàn)有研究成果的基礎(chǔ)上,針對AAC 系統(tǒng)對時間空間敏感、游戲模型貼圖尺寸通常等于2 的整數(shù)次冪的特點(diǎn),實(shí)現(xiàn)了一種基于切割擴(kuò)展的貼圖集合并算法,主要包含兩個過程:
(1)切割過程:以空閑空間(Free Room,FR)表示貼圖集中的空白區(qū)域;向其插入一張貼圖將會切割得到若干個更小的FR;不斷地將貼圖插入這些FR 并進(jìn)行合并(見圖4(a)至圖4(c));
(2)擴(kuò)展過程:當(dāng)貼圖較大,無法插入任一現(xiàn)有FR 時,放入更大的FR 進(jìn)行擴(kuò)展(見圖4(d)).
圖4 AAC 貼圖集生成、切割與擴(kuò)展示意圖
AAC 系統(tǒng)貼圖合并算法的關(guān)鍵代碼如代碼1 所示.其中,FRL 代表空閑空間鏈表,Stex代表待合并的貼圖集合,Srect代表貼圖集上的矩形集合,CAW和CAH分別代表當(dāng)前圖集的寬度和高度.
為了使美工和程序開發(fā)人員都能方便地使用,AAC系統(tǒng)設(shè)計了圖形化操作界面,使用者無需編寫代碼即可調(diào)用相關(guān)API.通過Unity3D 平臺提供的編輯器擴(kuò)展功能,用戶甚至能制作出無需編寫代碼就能開發(fā)游戲的開發(fā)套件[16].此外,Unity3D 開源了C#引擎和編輯器代碼[17],二者均為實(shí)現(xiàn)編輯器擴(kuò)展的利器.
具體來說,與圖形界面軟件開發(fā)原理類似,AAC系統(tǒng)通過Unity3D 提供的繪制組件接口,在窗口內(nèi)逐個繪制組件,并響應(yīng)用戶輸入,以及執(zhí)行不同的邏輯操作,包括:
(1)裝扮制作:提供裝扮快捷制作擴(kuò)展工具;
(2)種族制作:提供裝扮類型編輯器、基因編輯器、基因作用編輯器、染料編輯器;
(3)角色快速編輯擴(kuò)展工具:包括修改角色種族、裝卸裝扮、修改基因、修改染料、修改紋理集大小、序列化和反序列化、保存為預(yù)制件等.
代碼1.AAC 系統(tǒng)貼圖合并算法關(guān)鍵代碼開始//初始化FRL,放入適當(dāng)大小的FR Init FRL with a appropriate_size_FR// 設(shè)置CAW和CAH與此FR 的寬高一致CAW=appropriate_size_FR.w CAH=appropriate_size_FR.h// 對按照面積從大到小排序Sort S_tex by area from largest to smallest For tex in S_tex// 循環(huán)直到從FRL 中找到合適的FR S tex
While( !FindFirstBestFit( tex,out FR) )// 若沒找到,則進(jìn)行擴(kuò)展Expand()// 向S_r 中添加此貼圖所處的矩形S_r.Add( Rect(FR.x,FR.y,tex.w tex.h))// 切割此FR,并添加進(jìn)FRL 中FRL.Add( FR.Sqlit( tex ) )return S_r,CAW,CAH結(jié)束?
圖5展示了AAC 系統(tǒng)編輯器擴(kuò)展示例圖,包括:槽位資源編輯器、布局資源編輯器、裝扮資源編輯器、基因作用器編輯器、燃料編輯器、裝扮類型編輯器、基因描述編輯器、種族編輯器、裝扮制作擴(kuò)展工具和角色快速編輯擴(kuò)展工具.
圖5 AAC 編輯器擴(kuò)展圖
AAC 換裝系統(tǒng)中,每個游戲角色是獨(dú)立的.因此,系統(tǒng)會為每個角色分配獨(dú)立的內(nèi)存.但是,假如兩個角色的數(shù)據(jù)完全相同,例如:擁有相同的裝扮、基因和染料,系統(tǒng)仍然得為它們維護(hù)兩份獨(dú)立內(nèi)存,從而產(chǎn)生數(shù)據(jù)冗余.
傳統(tǒng)方法利用Unity3D 提供的預(yù)制件技術(shù)來減少這部分?jǐn)?shù)據(jù)冗余.預(yù)制件是一種可重復(fù)利用的游戲?qū)ο筚Y源類型[18],所有從預(yù)制件實(shí)例化得到的游戲?qū)ο蠖加信c預(yù)制件相同的對象數(shù)據(jù).換言之,若將游戲角色制作為預(yù)制件,通過預(yù)制件實(shí)例化,這些對象實(shí)例將共享相同的網(wǎng)格和紋理集,從而減少冗余數(shù)據(jù)(原理見圖6).
圖6 Unity 3D 預(yù)制件技術(shù)原理圖
然而,由圖6可見,基于Unity3D 的預(yù)制件方法在制作過程中僅保留了渲染數(shù)據(jù)中的網(wǎng)格、貼圖集和骨架信息,丟失了裝扮、基因數(shù)據(jù)、染料數(shù)據(jù)和種族信息.也就是說,該方法不具備換裝功能.
為了既減少空間開銷又保留換裝功能,AAC 系統(tǒng)設(shè)計了保留換裝功能的預(yù)制件,具體實(shí)現(xiàn)方式如下:
(1)生成預(yù)制件的同時,將角色的種族及附屬資源一并寫入預(yù)制件中;
(2)當(dāng)從此預(yù)制件實(shí)例化時,將會加載這些資源,從而獲得所有的系統(tǒng)功能.
實(shí)際應(yīng)用時,建議開發(fā)者通過以上方式制作一個類似“素體”且保留換裝功能的預(yù)制件.所謂“素體”,是指只有基本裝扮(如軀干),沒有修改過基因和染料的角色.在此開發(fā)模式下,只有額外的裝扮才會產(chǎn)生渲染數(shù)據(jù),“素體”部分的空間占用是共享的.因此,與不使用AAC 預(yù)制件優(yōu)化技術(shù)的情形相比,此方法將大幅度減少冗余空間,提高換裝速度.
我們設(shè)計和開發(fā)了一個能調(diào)用AAC 插件的換裝示例程序以展示換裝效果.程序建模工作流包括:(1)制作模型;(2)在線綁定骨骼和蒙皮;(3)對模型進(jìn)行加工處理.
由圖7可見,添加AAC 插件后,換裝示例程序具備了捏臉、換裝、換色等功能.其中,捏臉功能不局限于臉部基因的改變,也包括身體各部位的變化;換色功能既包括裝扮(如帽子、上衣等)顏色的改變,也包括基因(如膚色、眼球)顏色的變化.
圖7 AAC 插件換裝功能展示
3.2.1 時間開銷
本節(jié)對不同裝扮數(shù)量下AAC與UMA 系統(tǒng)的時間開銷進(jìn)行比較(見表2),結(jié)論如下:
表2 不同換裝系統(tǒng)、不同裝扮數(shù)量情況下時間開銷比較(單位:ms)
(1)對于不同的裝扮數(shù)量,游戲角色進(jìn)行換裝合成所消耗的時間是不同的.無論哪種系統(tǒng),時間開銷均隨裝扮數(shù)量的增長呈正比例增長.
(2)大部分情況下(更換裝扮數(shù)量少于7 件),AAC系統(tǒng)比UMA 系統(tǒng)的時間開銷小;當(dāng)裝扮數(shù)量接近上限,AAC 系統(tǒng)性能與UMA 系統(tǒng)性能持平.
3.2.2 空間開銷
本節(jié)比較的是隨機(jī)裝扮數(shù)量下AAC與UMA 系統(tǒng)的空間性能(見表3).實(shí)驗(yàn)條件:創(chuàng)建相同數(shù)量、隨機(jī)裝扮的角色;觀察對象:創(chuàng)建前后系統(tǒng)內(nèi)存的使用情況.
表3 不同換裝系統(tǒng)空間開銷比較(單位:MB)
需要說明的是,由于網(wǎng)格和貼圖集占用內(nèi)存的比例最高,因此僅以網(wǎng)格和貼圖的內(nèi)存空間占用量作為代表進(jìn)行比較.本實(shí)驗(yàn)中,網(wǎng)格頂點(diǎn)數(shù)不少于25 000 個,貼圖集尺寸約為2–4 KB.
實(shí)驗(yàn)結(jié)論如下:
(1)相同內(nèi)存占用下,AAC 系統(tǒng)容納角色的數(shù)量接近UMA 的4 倍.
(2)相比UMA 系統(tǒng),AAC 系統(tǒng)的時間空間復(fù)雜度更低,更適合用于運(yùn)行時的角色動態(tài)生成任務(wù).
本文設(shè)計并實(shí)現(xiàn)了一個基于Unity3D 平臺的換裝系統(tǒng)插件:方舟角色創(chuàng)建器,簡稱AAC 系統(tǒng).該系統(tǒng)具備游戲角色換裝、捏臉、換色等功能.通過編輯器擴(kuò)展技術(shù),該插件可提供圖形化操作界面,令使用者無需具備編程基礎(chǔ)也能輕松掌握.再結(jié)合預(yù)制件優(yōu)化技術(shù),AAC 系統(tǒng)在完整保留系統(tǒng)換裝功能的同時,還可進(jìn)一步提高系統(tǒng)的時間和空間利用率,使換裝系統(tǒng)適用于運(yùn)行時角色動態(tài)生成的應(yīng)用場景.
需要指出的是,AAC 系統(tǒng)也存在一些不足,如:(1)與UMA 系統(tǒng)相比,缺少高級功能;(2)未設(shè)計資源管理組件.進(jìn)一步完善AAC 插件功能,將是未來的研究工作重點(diǎn).