黃兆銘,儲 穎
(深圳大學 計算機與軟件學院,深圳 518060)
如今的電子游戲,不僅僅是由代碼編寫的單純軟件,更承載了開發者的內心世界[1].正因如此,電子游戲的題材與玩法也愈加豐富.相比傳統電子游戲中固定的游戲角色,如今的開發者和玩家對游戲角色的期望值越來越高,希望在游戲中獲得更多的自由感(如:自定義游戲角色模型).換裝系統,正是游戲開發人員和游戲玩家追求自由的體現.
如果一款游戲搭載了優秀的換裝系統,對于開發者,有可能大大降低開發難度;對于玩家,則有機會升級游戲體驗.舉例來說,著名的裝扮類游戲《閃耀暖暖》[2]、模擬經營類游戲《模擬人生》[3]、大型多人在線角色扮演游戲《魔獸世界》[4]等,都內置優秀的換裝系統,且換裝系統已成為這些游戲不可或缺的一部分.
然而,獨立游戲開發者想要實現具備換裝功能的游戲,是相當有挑戰性的.原因在于,大型商業游戲工作室基本自研換裝系統,一般不會公開相關技術細節,而國內也沒有成熟的文獻資料供參考.因此,利用換裝系統插件完成換裝功能,成為眾多獨立游戲開發者和小型游戲工作室的首選.
設計換裝系統插件給開發人員帶來以下挑戰:
(1)由于插件的使用者多為美工,所設計插件應使無編程基礎的使用者也能快速上手;
(2)設計換裝系統插件涉及大量建模和圖形學知識,這就要求開發人員對美工職能有較為深刻的理解.
因此,游戲開發者要設計并實現換裝系統插件是有一定難度的.國內學者的研究工作有涉及換裝技術的,例如:楊靜[5]基于HTC VIVE 設計實現了虛擬換裝游戲,李俊等[6]基于人物替換技術實現了模擬試衣間,徐康熙等[7]基于物理方式實現了虛擬換衣系統.然而,這些換裝、試衣系統的功能較為單一,僅能實現特定環境下的基礎裝扮更換,不能稱為真正的換裝系統插件.
目前,市面上開源、開放使用的換裝系統插件寥寥無幾.少量可供使用的換裝系統插件中,功能較為強大的是國外開發者基于Unity3D[8]設計的Unity Multipurpose Avatar (UMA)系統.UMA 系統的特點是開源、易用和功能豐富,但也有缺點,例如:時間、空間復雜度較高;更適用于制作美術模型,而不適合運行時的角色動態合成.
為填補以上空白,論文設計并實現了一個基于Unity3D 平臺的國產、開源換裝系統插件,命名為方舟角色創建器(Ark Avatar Customization,AAC).AAC 插件采用改進的貼圖集生成、編輯器擴展和預制件優化技術,集成換裝、捏臉和換色功能,配合圖形化擴展工具,能夠充分滿足開發者游戲開發過程中的動態、個性化換裝需求.
首先,從軟件工程思想出發,AAC 系統設計時需兼顧功能性、可維護性與可擴展性.同時,依據設計模式所倡導的單一職責原則[9],各個系統模塊應盡量獨立.因此,AAC 插件系統定義了一系列新的、功能獨立的概念,包括:裝扮、種族、角色、基因和染料.各概念具體含義如表1所示.

表1 AAC 插件系統概念定義
AAC 系統規定,以裝扮為基本單位進行角色的合成,并使用字符串標識裝扮所屬的插槽類型.裝扮用以裝備在角色身上,每個插槽同一時間只能裝備一個裝扮.當為角色裝備插槽重復的裝扮時,舊的裝扮將會被替換掉.
裝扮代表了美術模型,可以是上衣、飾品或身體部位(取決于使用者的目的).通常,使用者會將完整模型按照不同部位切分為局部模型,如:頭發、上衣、下衣、鞋子等,再分別制作成裝扮.
系統實現方面,由于模型包含骨骼、網格和貼圖數據,因此裝扮需要存儲它們作為角色合成時的數據依據.為符合單一職責原則,AAC 系統定義了兩個概念分別存儲美術模型數據,它們是:槽位資源和布局資源.槽位資源負責存儲模型的骨骼和網格,布局資源負責存儲模型貼圖,如圖1所示.

圖1 AAC 布局資源和上下文示意圖
需要指出的是,槽位資源為裝扮合成提供骨骼和網格依據,而布局資源的功能不限于提供原模型貼圖.類似Photoshop 的圖層疊加原理,假如將原模型貼圖定義為第1 組上下文,AAC 系統規定:布局資源可以包含一組以上的上下文(見圖1(a)).進行裝扮合成時,從第2 組開始,依次將各上下文疊加至第1 組上下文,最終得到目標貼圖組(見圖1(b)).
這樣設計的好處在于:能夠實現類似“紋身”的裝扮效果.僅需更換“紋身貼圖”,就可以在不破壞、不冗余原模型貼圖的情況下,生成新的目標貼圖.此外,由于“紋身貼圖”一般來說精度不高,系統可以使用較低的分辨率存儲它們以節省空間.結合染料的概念,“紋身貼圖”還可以起到遮罩圖層的作用,即:僅改變“紋身貼圖”中非透明區域的顏色.
圖1中,第2 組上下文的“吃豆人紋身”的有效區域只有很小一部分,但為了與第一組上下文中左邊背心的中心對齊,貼圖預留了很多“黑邊”.為進一步優化內存空間,可以縮小“吃豆人紋身”的貼圖大小,采用記錄偏移值的方式,將“紋身”移動到背心中間.
AAC 定義種族的目的,是為創建角色提供依據.與現實生活類似,具有相同特征的個體被劃分至同一種族.換言之,種族描述了這些特征的共性.種族的基礎數據定義如下:
(1)骨架描述和人類描述;
(2)裝扮類型描述;
(3)基因描述和基因作用器描述;
(4)染料描述.
其中,骨架描述用來重建角色的初始骨架,人類描述用來創建Unity3D 動畫系統中的標準人類骨架.它們都可以從導入至Unity3D 的模型數據中獲取.
裝扮類型描述定義了某種族可接受的插槽類型.AAC 系統規定,只有處于裝扮類型描述中的裝扮才是有效的、能夠參與角色合成的裝扮.通過配置不同的裝扮類型描述,可以實現為游戲主角(或者其種族)裝備更多部位裝扮、而為NPC (Non-Player Character)裝備較少裝扮的效果.
基因描述和染料描述的含義,將分別在1.4和1.5節中詳細介紹.
進一步地,為了區分種族中每個單獨作用的個體,AAC 系統提出角色的概念.角色在種族中創建得到,但每個角色可以有各自不同的表現(如:裝備的裝扮不同).系統需要為每個角色單獨存儲以下數據:
(1)裝扮集合;
(2)骨架和Avatar;
(3)基因數據和染料數據;
(4)渲染數據.
其中,裝扮集合存儲了角色當前裝備的裝扮.骨架、Avatar、基因數據和染料數據分別從種族的骨架描述、基因描述、染料描述中創建得到.
和現實生活中生物的特性由基因決定類似,AAC系統中的基因特指那些能夠影響角色參數的屬性.例如:命名為身高的基因影響角色的身高,命名為肥胖程度的基因影響角色的肚子、手臂和臉等部位.基因作用器則負責產生這些影響.
換言之,基因負責定義角色有哪些受影響因素,基因作用器則定義了這些影響因素如何影響角色.之所以分別定義基因和基因作用器,原因在于:
(1)基因影響的功能十分豐富,如:影響骨骼、影響染料顏色、給角色裝卸裝扮等.為了支持這種靈活性,AAC 系統定義了不同類型的作用器以匹配相對應的功能;
(2)某些基因的改變需要多個基因作用器共同作用才能實現.最直觀的例子,肥胖程度基因需要修改肚子、手臂、臉等多個部位,分別對應著多個不同的基因作用器.
圖2展示了基因和基因作用器的工作原理.當角色從種族中創建時,會讀取并包裝基因,成為基因數據.當基因數據中的數值發生改變時,AAC 系統會將與此基因相關的基因作用器應用至角色身上.

圖2 基因和基因作用器工作原理圖
AAC 系統定義了染料的概念以實現換色功能.和基因的定義原理類似,染料指那些能夠改變裝扮顏色的名稱.例如,上衣的裝扮中有上衣顏色染料,通過修改染料,可以修改上衣裝扮的顏色.
換色的原理本質上與圖1布局資源中多組上下文合并的原理是一樣的.區別在于,此時第二套上下文中的貼圖是純色的,而非“紋身”.
具體實現方式為:當角色從種族創建時,會讀取并包裝其為染料數據.增加兩個顏色參數(乘性因子Multiple和加性因子Additive),分別作為乘法因子乘以貼圖顏色和作為加法因子加在貼圖顏色上,以獲取換色后的目標顏色,見式(1).

其中,Cold為目標顏色,Cols為原貼圖顏色.
綜上,AAC 系統概要設計圖如圖3所示.由圖3可見,基于Unity3D 的編輯器擴展技術,AAC 插件通過提供圖形化界面和擴展工具,使零編程基礎的使用者也能輕松上手,完成自定義游戲角色的換裝功能.

圖3 AAC 插件系統概要設計圖
AAC 插件以裝扮為單位進行角色的合成,包括骨骼合成、網格合成和貼圖合成.貼圖的合成結果稱為貼圖集,又名紋理集.盡管Unity3D 平臺提供了紋理集合成的接口函數,AAC 系統卻無法調用.原因在于,角色合成過程中需要用到染料,而Unity3D 并不支持這一AAC 系統自定義概念.因此,需要自行設計并實現貼圖合并算法.
貼圖集生成是計算機圖形學中提高計算機生成貼圖利用率的技術[9].在貼圖集生成、優化方面,國內外已有大量的研究工作.例如,Maillot 等[10]提出交互式紋理映射方法,Lévy 等[11]提出基于最小二乘保角映射的方法,Purnomo 等 [12]提出無縫紋理圖集的概念,宋歌等[13]提出基于動態空間合并的算法,詹勇[14]提出針對重復紋理的合并算法,戴雪峰等[15]提出基于貪心算法和退火算法的混合算法.論文在現有研究成果的基礎上,針對AAC 系統對時間空間敏感、游戲模型貼圖尺寸通常等于2 的整數次冪的特點,實現了一種基于切割擴展的貼圖集合并算法,主要包含兩個過程:
(1)切割過程:以空閑空間(Free Room,FR)表示貼圖集中的空白區域;向其插入一張貼圖將會切割得到若干個更小的FR;不斷地將貼圖插入這些FR 并進行合并(見圖4(a)至圖4(c));
(2)擴展過程:當貼圖較大,無法插入任一現有FR 時,放入更大的FR 進行擴展(見圖4(d)).

圖4 AAC 貼圖集生成、切割與擴展示意圖
AAC 系統貼圖合并算法的關鍵代碼如代碼1 所示.其中,FRL 代表空閑空間鏈表,Stex代表待合并的貼圖集合,Srect代表貼圖集上的矩形集合,CAW和CAH分別代表當前圖集的寬度和高度.
為了使美工和程序開發人員都能方便地使用,AAC系統設計了圖形化操作界面,使用者無需編寫代碼即可調用相關API.通過Unity3D 平臺提供的編輯器擴展功能,用戶甚至能制作出無需編寫代碼就能開發游戲的開發套件[16].此外,Unity3D 開源了C#引擎和編輯器代碼[17],二者均為實現編輯器擴展的利器.
具體來說,與圖形界面軟件開發原理類似,AAC系統通過Unity3D 提供的繪制組件接口,在窗口內逐個繪制組件,并響應用戶輸入,以及執行不同的邏輯操作,包括:
(1)裝扮制作:提供裝扮快捷制作擴展工具;
(2)種族制作:提供裝扮類型編輯器、基因編輯器、基因作用編輯器、染料編輯器;
(3)角色快速編輯擴展工具:包括修改角色種族、裝卸裝扮、修改基因、修改染料、修改紋理集大小、序列化和反序列化、保存為預制件等.

代碼1.AAC 系統貼圖合并算法關鍵代碼開始//初始化FRL,放入適當大小的FR Init FRL with a appropriate_size_FR// 設置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// 循環直到從FRL 中找到合適的FR S tex

While( !FindFirstBestFit( tex,out FR) )// 若沒找到,則進行擴展Expand()// 向S_r 中添加此貼圖所處的矩形S_r.Add( Rect(FR.x,FR.y,tex.w tex.h))// 切割此FR,并添加進FRL 中FRL.Add( FR.Sqlit( tex ) )return S_r,CAW,CAH結束?
圖5展示了AAC 系統編輯器擴展示例圖,包括:槽位資源編輯器、布局資源編輯器、裝扮資源編輯器、基因作用器編輯器、燃料編輯器、裝扮類型編輯器、基因描述編輯器、種族編輯器、裝扮制作擴展工具和角色快速編輯擴展工具.

圖5 AAC 編輯器擴展圖
AAC 換裝系統中,每個游戲角色是獨立的.因此,系統會為每個角色分配獨立的內存.但是,假如兩個角色的數據完全相同,例如:擁有相同的裝扮、基因和染料,系統仍然得為它們維護兩份獨立內存,從而產生數據冗余.
傳統方法利用Unity3D 提供的預制件技術來減少這部分數據冗余.預制件是一種可重復利用的游戲對象資源類型[18],所有從預制件實例化得到的游戲對象都有與預制件相同的對象數據.換言之,若將游戲角色制作為預制件,通過預制件實例化,這些對象實例將共享相同的網格和紋理集,從而減少冗余數據(原理見圖6).

圖6 Unity 3D 預制件技術原理圖
然而,由圖6可見,基于Unity3D 的預制件方法在制作過程中僅保留了渲染數據中的網格、貼圖集和骨架信息,丟失了裝扮、基因數據、染料數據和種族信息.也就是說,該方法不具備換裝功能.
為了既減少空間開銷又保留換裝功能,AAC 系統設計了保留換裝功能的預制件,具體實現方式如下:
(1)生成預制件的同時,將角色的種族及附屬資源一并寫入預制件中;
(2)當從此預制件實例化時,將會加載這些資源,從而獲得所有的系統功能.
實際應用時,建議開發者通過以上方式制作一個類似“素體”且保留換裝功能的預制件.所謂“素體”,是指只有基本裝扮(如軀干),沒有修改過基因和染料的角色.在此開發模式下,只有額外的裝扮才會產生渲染數據,“素體”部分的空間占用是共享的.因此,與不使用AAC 預制件優化技術的情形相比,此方法將大幅度減少冗余空間,提高換裝速度.
我們設計和開發了一個能調用AAC 插件的換裝示例程序以展示換裝效果.程序建模工作流包括:(1)制作模型;(2)在線綁定骨骼和蒙皮;(3)對模型進行加工處理.
由圖7可見,添加AAC 插件后,換裝示例程序具備了捏臉、換裝、換色等功能.其中,捏臉功能不局限于臉部基因的改變,也包括身體各部位的變化;換色功能既包括裝扮(如帽子、上衣等)顏色的改變,也包括基因(如膚色、眼球)顏色的變化.

圖7 AAC 插件換裝功能展示
3.2.1 時間開銷
本節對不同裝扮數量下AAC與UMA 系統的時間開銷進行比較(見表2),結論如下:

表2 不同換裝系統、不同裝扮數量情況下時間開銷比較(單位:ms)
(1)對于不同的裝扮數量,游戲角色進行換裝合成所消耗的時間是不同的.無論哪種系統,時間開銷均隨裝扮數量的增長呈正比例增長.
(2)大部分情況下(更換裝扮數量少于7 件),AAC系統比UMA 系統的時間開銷小;當裝扮數量接近上限,AAC 系統性能與UMA 系統性能持平.
3.2.2 空間開銷
本節比較的是隨機裝扮數量下AAC與UMA 系統的空間性能(見表3).實驗條件:創建相同數量、隨機裝扮的角色;觀察對象:創建前后系統內存的使用情況.

表3 不同換裝系統空間開銷比較(單位:MB)
需要說明的是,由于網格和貼圖集占用內存的比例最高,因此僅以網格和貼圖的內存空間占用量作為代表進行比較.本實驗中,網格頂點數不少于25 000 個,貼圖集尺寸約為2–4 KB.
實驗結論如下:
(1)相同內存占用下,AAC 系統容納角色的數量接近UMA 的4 倍.
(2)相比UMA 系統,AAC 系統的時間空間復雜度更低,更適合用于運行時的角色動態生成任務.
本文設計并實現了一個基于Unity3D 平臺的換裝系統插件:方舟角色創建器,簡稱AAC 系統.該系統具備游戲角色換裝、捏臉、換色等功能.通過編輯器擴展技術,該插件可提供圖形化操作界面,令使用者無需具備編程基礎也能輕松掌握.再結合預制件優化技術,AAC 系統在完整保留系統換裝功能的同時,還可進一步提高系統的時間和空間利用率,使換裝系統適用于運行時角色動態生成的應用場景.
需要指出的是,AAC 系統也存在一些不足,如:(1)與UMA 系統相比,缺少高級功能;(2)未設計資源管理組件.進一步完善AAC 插件功能,將是未來的研究工作重點.