劉鑫,張昕
(中國傳媒大學(xué)計算機(jī)學(xué)院,北京100024)
隨著3D游戲引擎的發(fā)展,游戲的畫面質(zhì)量幾乎可以和電影相媲美?,F(xiàn)如今,游戲制作和電影大片的界限也逐漸模糊。游戲中的虛擬攝像機(jī)和日益強(qiáng)大的游戲引擎使游戲和電影的結(jié)合成為了可能[1],游戲電影[2]的前景十分可觀。
國外已經(jīng)生產(chǎn)出許多成熟的游戲電影作品。由《魔獸世界》衍生的《遠(yuǎn)古傳說3》就是十分出色的游戲電影之一,它在玩家中掀起了很大反響并被譽(yù)為《魔獸世界》游戲電影的史詩般作品。由動作劇本改編的《復(fù)仇者聯(lián)盟》在視覺上也有一定的沖擊力??梢赃@么說,該電影無論是在熒幕色彩,劇情設(shè)計還是配音和字幕等方面都做得非常好。在國內(nèi)也已經(jīng)涌現(xiàn)出比如由石頭熊游戲視頻工作室出品的《誅仙》系列游戲電影,夢羅浮的《天堂2-英雄時代》和其他熱門的游戲電影[3]。
虛擬攝像機(jī)在游戲電影的制作中扮演著十分重要的角色,如何對虛擬攝像機(jī)進(jìn)行控制是有待解決的首要問題。有三種方式去控制一個虛擬攝像機(jī):手動控制、全自動控制和半自動控制。
人工控制是最方便的一種控制方式,利用這種方式使用者只需要利用鼠標(biāo)或者鍵盤就可以輕松控制他的虛擬攝像機(jī)。然而,手動控制虛擬攝像機(jī)也有許多的缺點:攝像機(jī)可能會顫動或搖擺,攝像機(jī)的視角可能變化的不均勻,或者攝像機(jī)可能會沿著一個不準(zhǔn)確的路線移動等等。例如,在《遠(yuǎn)古傳說3》和《復(fù)仇者聯(lián)盟》中偶爾會出現(xiàn)屏幕抖動,《天堂2-英雄時代》和《誅仙》的畫面看起來略生硬、有時會抖動并且攝像機(jī)缺乏速度控制等。
在游戲引擎中,電影工作者可以通過編寫腳本來確定一個虛擬攝像機(jī)的移動,然后讓這些腳本自動控制攝像機(jī)。全自動控制方式避免了上述手動控制的缺點,并能讓攝像機(jī)拍攝穩(wěn)定準(zhǔn)確和高效。但是這種控制方式通常利用人工智能算法[4-6]去設(shè)計攝像機(jī)的移動軌跡[7],因此它拍攝出來的鏡頭可能并不是游戲電影導(dǎo)演所期望的。
第三種方式半自動控制方式既能保留全自動控制的優(yōu)點,同時又能給予游戲電影導(dǎo)演更多的創(chuàng)作自由。它的主要原理是:讓攝像機(jī)控制算法參數(shù)化,讓游戲電影導(dǎo)演可以設(shè)定并調(diào)整這些參數(shù)來實現(xiàn)攝像機(jī)的運(yùn)動。然而,編寫一系列的控制腳本并為每個鏡頭逐個調(diào)整參數(shù)的工作量巨大。
本篇論文從參數(shù)角度把攝像機(jī)的控制算法進(jìn)行分離,抽象出一個通用的攝像機(jī)控制腳本(GCCS)。有了這個通用的控制腳本,游戲電影制作者不再需要為不同的鏡頭逐個編寫腳本了。除此之外,論文還介紹了電影視聽語言的理論知識來確定攝像機(jī)的運(yùn)動模式,它也是GCCS的參數(shù)之一。因此,無限的攝像機(jī)運(yùn)動方式被歸納為一個有限的攝像機(jī)語言集合,它可以被電影導(dǎo)演反復(fù)的使用。論文在最后總結(jié)了在Unity3D游戲引擎中的數(shù)據(jù)物體集,其中的每一個都代表著一種通用的攝像機(jī)語言(在后面也被稱作“電影語言預(yù)置件”或“CLP”)。利用這套技術(shù),工程師只需要復(fù)用一個CLP并把它作為參數(shù)傳給GCCS就可以完成一個游戲電影的鏡頭,這樣大大減少了半自動游戲電影拍攝的工作量。
正如電影利用攝像機(jī)引導(dǎo)觀眾去了解故事一樣,游戲引擎里的虛擬攝像機(jī)用來給玩家展現(xiàn)游戲中的世界。人們可以通過控制虛擬攝像機(jī)來拍攝他們想要的游戲場景。
通用的游戲引擎具備創(chuàng)造一個虛擬世界的全部條件,它可以模擬重力和其他基本的物理原理,可以決定物體的運(yùn)動方式并能讓智能物體對環(huán)境做出響應(yīng)。在游戲引擎中,游戲電影導(dǎo)演可以像操作真實攝像機(jī)一樣操作虛擬攝像機(jī)進(jìn)行自由運(yùn)動并改變視角。
真實的攝像機(jī)可以被安放在場景中的任何位置并可以輕松調(diào)整參數(shù)去獲得滿意的畫面,虛擬攝像機(jī)亦如此[8]。在游戲引擎里,虛擬攝像機(jī)是一個特殊的物體,它可以被放置在場景中的任何角落。你可以設(shè)置它的位置、旋轉(zhuǎn)角度、景別、投影和其他參數(shù)去獲得你想要的鏡頭。
由虛擬攝像機(jī)拍攝出來的視頻可以在計算機(jī)顯示器上渲染。利用視頻錄制軟件,如 Camtasia Studio、KKCapture等來錄下顯示器上的視頻,然后把它保存成合適的視頻格式。這些視頻文件可以被用作可編輯的游戲電影素材的一部分。因此,在錄制前需要設(shè)定好合適的屏幕尺寸和視頻錄制方式。
半自動虛擬攝像機(jī)控制技術(shù)是基于Unity3D引擎實現(xiàn)的。游戲引擎是游戲的開發(fā)平臺,Unity3D是現(xiàn)在廣泛利用的一個游戲引擎。Unity3D有許多顯著的特點,包括完整的編輯器、跨平臺發(fā)布功能、地形編輯器、材質(zhì)編輯器、腳本模塊、網(wǎng)絡(luò)模塊、物理模塊、版本控制和其他特點等。
在Unity3D游戲引擎中,游戲場景中的所有物體都是GameObject(游戲物體)的實例。一個游戲物體上可以附加許多組件,這些組件描述了游戲物體的不同屬性。被附加到游戲物體的組件繼承于Component Class(組件類)。程序員寫的腳本繼承于MonoBehavior類,它是組件類的一個特殊的子類。圖1用UML語言描述了在Unity3D游戲引擎中GameObject、Component和 MonoBehavior的關(guān)系。
圖1 在Unity3D游戲引擎中GameObject、Component和MonoBehavior的關(guān)系
在Unity3D游戲引擎里,Camera(攝像機(jī))是個特殊的游戲物體??梢酝ㄟ^編寫腳本并把它們作為組件附加到攝像機(jī)上來進(jìn)行控制。
幾乎所有的游戲引擎都可以為游戲電影制作提供支持,Unity3D也不例外。最重要的是,我們可以在運(yùn)行時給攝像機(jī)添加Unity腳本或是去掉它,這使得操控攝像機(jī)變得更加靈活方便。Unity攝像機(jī)的屬性繁多,這些屬性可以在在設(shè)計期通過游戲編輯器去進(jìn)行設(shè)置,并且可以在運(yùn)行期通過腳本去調(diào)整和改變。圖2展示了Unity3D游戲編輯器中的攝像機(jī)屬性。
Unity攝像機(jī)最重要的屬性是視野,裁剪平面,透視和消隱遮罩。在游戲電影制作過程中,攝像機(jī)的某些屬性會在運(yùn)行時因為腳本的控制而發(fā)生相應(yīng)改變。
圖2 在Unity3D游戲編輯器中攝像機(jī)的屬性
一般來說,要使虛擬攝像機(jī)按照一定的方式自動運(yùn)動進(jìn)行拍攝的話,首先需要為這個虛擬攝像機(jī)寫一個控制腳本。然而在游戲電影制作時,有大量的攝像機(jī)運(yùn)動方式需要具體確定,顯然為每一個鏡頭單獨(dú)編寫腳本是如此冗繁的工作。因此減少編寫代碼的工作量是游戲電影制作的關(guān)鍵任務(wù)。
通過對大量攝像機(jī)控制算法的觀察,發(fā)現(xiàn)這些算法的不同之處在于一些參數(shù)數(shù)據(jù),也就是攝像機(jī)運(yùn)動和改變方式。因此可以把屬性從攝像機(jī)控制腳本中分離出來并抽象出一個通用的腳本。有了這個通用攝像機(jī)控制腳本,游戲電影制作者不再需要為鏡頭逐個寫腳本。他們所要做的就是為每一個腳本確定不同的攝像機(jī)運(yùn)動參數(shù)。
利用通用攝像機(jī)控制腳本,可以將游戲電影的半自動鏡頭拍攝歸納為以下步驟:
1.準(zhǔn)備虛擬攝像機(jī):把通用攝像機(jī)腳本附加到攝像機(jī)物體上。
2.為攝像機(jī)準(zhǔn)備“攝像機(jī)運(yùn)動路徑”(CMP):為了使攝像機(jī)自動運(yùn)動,我們需要為它確定一個運(yùn)動路徑,也就是說在設(shè)計時,我們需要在游戲場景里手動放置一系列的結(jié)點來確定這條路徑。
3.為攝像機(jī)準(zhǔn)備“目標(biāo)運(yùn)動路徑”(LTMP):為了讓攝像機(jī)可以在正確的視角拍攝,我們也需要為攝像機(jī)的目標(biāo)物體確定一個運(yùn)動路徑。路徑上的結(jié)點也是需要在設(shè)計時在游戲場景中手動添加。
4.為攝像機(jī)準(zhǔn)備“屬性改變路徑”(CPCP):攝像機(jī)的位置和視線會隨著已定義好的路徑改變,攝像機(jī)的屬性也會同時相應(yīng)地發(fā)生改變。因此,需要依照拍攝時通用攝像機(jī)控制腳本對攝像機(jī)屬性的改變而配置一組屬性值。通常在運(yùn)行時刻攝像機(jī)的兩個屬性會改變:視野和裁剪平面。
5.為攝像機(jī)準(zhǔn)備觸發(fā)器:鏡頭觸發(fā)器的作用是確定一些條件,當(dāng)條件滿足時,虛擬攝像機(jī)開始自動拍攝。碰撞機(jī)制通常被用來觸發(fā)自動攝像機(jī):把一個會對碰撞事件發(fā)生響應(yīng)的特殊物體放置到游戲場景中,當(dāng)攝像機(jī)碰到這個物體,通用攝像機(jī)控制腳本便會附加到被觸發(fā)的攝像機(jī)上。攜帶通用攝像機(jī)控制腳本的一些屬性,如上面提到的 CMP、LTMP和CPCP,是觸發(fā)物體的另一個職責(zé)。當(dāng)攝像機(jī)碰到觸發(fā)器時,觸發(fā)器所攜帶的屬性便會傳送到通用攝像機(jī)控制腳本中。
在上述過程中,步驟(1)和(5)比較簡單。為了完成不同的鏡頭,必須為通用攝像機(jī)控制腳本準(zhǔn)備不同的參數(shù),這個過程就是步驟(2)、(3)和(4)。為通用攝像機(jī)控制腳本準(zhǔn)備參數(shù)是十分繁重的工作,因為這需要仔細(xì)地用手動去一一確定這些路徑。這樣的話,減少為通用腳本準(zhǔn)備參數(shù)的工作量是游戲電影制作的關(guān)鍵任務(wù)。
在電影藝術(shù)里,鏡頭是組成電影的元素,它是由攝像機(jī)從開機(jī)到關(guān)機(jī)所拍攝下來的一段連續(xù)畫面。電影是由鏡頭按照次序排列組成的[9]。攝像機(jī)語言(CL)是以一種特殊固定的運(yùn)動模式來定義的鏡頭序列,它可以用CMP、LTMP和CPCP進(jìn)行描述。事實上,電影導(dǎo)演常用的鏡頭語言數(shù)目是有限的,例如推拉鏡頭、搖移鏡頭、俯仰鏡頭、跟鏡頭等等[10]。因此無限的攝像機(jī)運(yùn)動可以被分類成一個有限的集合,集合里的元素都可以被電影語言所描述。因此攝像機(jī)運(yùn)動的參數(shù)集合便從無限減變成為有限。
因為攝像機(jī)語言可以被CMP、LTMP和CPCP所描述,那么便可以抽象出一個三元組來表示一個攝像機(jī)語言:
{CMP,LTMP,CPCP}
在Unity3D里,可以用一個特殊的游戲物體來裝載上面描述的三元組信息,然后將這個游戲物體裝載到一個“預(yù)制件”中(Unity3D的一種機(jī)制),它可以被存儲,分享和復(fù)用。電影語言在預(yù)制品中的結(jié)構(gòu)可以如圖3表示。
如圖3,“攝像機(jī)語言”,“攝像機(jī)運(yùn)動路徑”,“視野目標(biāo)運(yùn)動路徑”和“路徑結(jié)點”都是Unity3D中GameObject的實例。在這個圖示中,尾部帶有菱形形狀的線在UML語言中表示聚合關(guān)系,這表示“攝像機(jī)語言”包含“攝像機(jī)運(yùn)動路徑”和“視野目標(biāo)運(yùn)動路徑”,而“攝像機(jī)運(yùn)動路徑”和“視野目標(biāo)運(yùn)動路徑”也擁有它們自己的子物體“路徑結(jié)點”?!皵z像機(jī)屬性改變路徑”以特殊的格式保存在配置文件里。
圖3 攝像機(jī)語言的三元組機(jī)構(gòu)
在Unity3D里,復(fù)用一個預(yù)制件是十分容易的。你可以在設(shè)計時把它拖到游戲場景中或在運(yùn)行時提到它。為了簡化準(zhǔn)備參數(shù)的工作,我們?yōu)槊恳粋€攝像機(jī)語言都配置一個預(yù)制件,這些預(yù)制件可以被電影制作者反復(fù)使用然后構(gòu)建出一個電影語言預(yù)制件集(CLP)。有了這個集合,當(dāng)游戲電影導(dǎo)演想到實現(xiàn)一個攝像機(jī)語言的時候,他僅僅只要從這個集合中挑選相應(yīng)的CLP而無須再從零開始地準(zhǔn)備攝像機(jī)運(yùn)動參數(shù)了。導(dǎo)演在使用CLP時,他可能會做一些細(xì)微調(diào)整來保持個性或者去適應(yīng)復(fù)雜的拍攝環(huán)境等等。
最近我們開發(fā)了一個基于Unity3D引擎的3D游戲“中國航母瓦良格”。為了宣傳,我們?yōu)檫@款3D游戲制作了游戲電影。在這個游戲電影里,我們用虛擬攝像機(jī)搖攝整個畫面(圖4),用推拉鏡頭來拍攝瓦良格甲板上的武器(圖5),用俯視鏡頭鳥瞰瓦良格全景。我們還使用這些技術(shù)對其他移動的物體拍攝了鏡頭,例如飛機(jī)和導(dǎo)彈等。該游戲電影中的所有鏡頭都是基于通用攝像機(jī)語言腳本和CLP庫來完成的。
在制作游戲電影時如何準(zhǔn)確、高效又自由地控制虛擬攝像機(jī)是本文討論的重點。為此本文提出了一種新的技術(shù)來滿足這個需求。這項技術(shù)的核心思想包括三點:(1)把參數(shù)從攝像機(jī)控制算法中分離出來并得到一個通用的算法;(2)無限的攝像機(jī)運(yùn)動參數(shù)可以被分類成一系列有限的攝像機(jī)語言集合;(3)為每一個攝像機(jī)語言配置一個可以被電影制作者反復(fù)使用的可復(fù)用的預(yù)制件。第一點避免了電影制作者為每一個鏡頭逐個編寫腳本。第二和第三點為游戲電影制作者想要描述攝像機(jī)的運(yùn)動方式時提供了一個自由且高效的方式。
圖7 跟鏡頭
[1]曹淵杰,李亦中.現(xiàn)代電影與電子游戲的交互趨勢[J].當(dāng)代電影,2008:122-126.
[2]Christian J,Callum M.Using Machinima to Promote Computer Science Study[J].In Proc Tenth Australasian User Interface Conference,Wellington,New Zealand,2009.
[3]李晉林.游戲電影給電影行業(yè)帶來新的挑戰(zhàn)和機(jī)遇[J].當(dāng)代電影,2009:126-128.
[4]R E Korf.Depth-First Iterative Deepening:An Optimal Admissible Tree Search[J].Artificial Intelligence,vol 27,97-109,1985.
[5]P Burelli,G N Yannakakis.Global Search for Occlusion Minimisation in Virtual Camera Control[J].IEEE Congress on Evolutionary Computation,Barcelona,2010.
[6]史紅兵,張毅彬,童若鋒,董金祥.虛擬場景自動漫游的路徑規(guī)劃算法[J].計算機(jī)輔助設(shè)計與圖形學(xué)學(xué)報,2006:592-597.
[7]J Blinn.Where Am I?What Am I Looking At?[J].Computer Graphics and Applications,IEEE,vol 8,76-81,1988.
[8]JR Silva,T T Santos,C H Morimoto.Virtual Reality in Brazil:Automatic camera control in virtual environments augmented using multiple sparse videos[J].Compuetr and Graphics,vol 35,April,2011.
[9]Wang Daiming.Machinima,the Fusion of Computer Game and Movie[J].Film Art Contents,vol 314,123-125,2007.
[10]SD Katz.Film Directing Shot by Shot:Visualizing from Concept to Screen[J].Studio City,CA:Michael Weise Productions,1991.