丁亞峰+姜保慶
摘 要: 為了解決古跡復(fù)原的問題,本文利用Panda3D游戲引擎重建了開封古城部分場(chǎng)景,實(shí)現(xiàn)了場(chǎng)景漫游。本文從解決三維模型中紋理無真實(shí)感的問題入手,采用Panda3D中的紋理映射增強(qiáng)了三維模型的真實(shí)感;還解決了三維場(chǎng)景中的物體之間碰撞的問題。該場(chǎng)景從開封古城示范系統(tǒng)中演變而來,用系統(tǒng)的渲染工具做出一個(gè)小模型的演示場(chǎng)景。與傳統(tǒng)的保留在紙質(zhì)書籍中的文化遺產(chǎn)相比,演示系統(tǒng)能更加立體、直觀地反應(yīng)出當(dāng)時(shí)社會(huì)的情景。
關(guān)鍵詞: 古跡復(fù)原; 紋理映射; 碰撞檢測(cè); 場(chǎng)景漫游; 文化遺產(chǎn)
中圖分類號(hào):TP317 文獻(xiàn)標(biāo)志碼:A 文章編號(hào):1006-8228(2017)07-47-04
Practice of realizing scene roaming with Panda3D
Ding Yafeng, Jiang Baoqing
(Henan University, Institute of Computer and Information Engineering, Institute of Data and Knowledge Engineering, Kaifeng, Henan 475000, China)
Abstract: To solve the problem of the restoration of monuments, this paper uses the Panda3D game engine to reconstruct the scene of the ancient city of Kaifeng, and realized the scene roaming. Starting with solving the problem of no realistic texture in 3D model, this paper uses the texture mapping of Panda3D to enhance the reality of 3D model. And also solves the problem of collision between objects in 3D scene. The scene evolved from the Kaifeng ancient city demo system, using a system rendering tool to make the small model of presentation scene. Compared with traditional cultural heritage preserved in paper books, the presentation system has the more three-dimensional, intuitive response to the social scene.
Key words: monuments restoration; texture mapping; collision detection; scene roaming; cultural heritage
0 引言
國務(wù)院在2016年“十三五”國家戰(zhàn)略性新興產(chǎn)業(yè)發(fā)展規(guī)劃通知中專欄19“數(shù)字文化創(chuàng)意技術(shù)裝備創(chuàng)新提升工程”提到了構(gòu)建數(shù)字文化創(chuàng)意產(chǎn)業(yè)創(chuàng)新平臺(tái),加強(qiáng)基礎(chǔ)技術(shù)研發(fā),大力發(fā)展虛擬現(xiàn)實(shí)、增強(qiáng)現(xiàn)實(shí),為了促進(jìn)優(yōu)秀文化資源創(chuàng)造性轉(zhuǎn)化,鼓勵(lì)對(duì)非物質(zhì)文化遺產(chǎn)等文化資源進(jìn)行數(shù)字化轉(zhuǎn)化和開發(fā)。依托地方特色文化,創(chuàng)造具有鮮明區(qū)域特點(diǎn)和民族特色的數(shù)字創(chuàng)意內(nèi)容產(chǎn)品。文物保護(hù)傳承和創(chuàng)新技術(shù)應(yīng)用研究與示范項(xiàng)目得到了國家重視,尤其是古建筑文化的傳承與保護(hù)方面,我國需要保護(hù)的古建筑頗多,古建筑文化的流失造成了我們無法傳承古代優(yōu)秀的建筑的魅力,同時(shí)也不能保護(hù)燦爛輝煌的建筑文化[1]。
我們?cè)趨⑴c國家科技支撐計(jì)劃課題的示范系統(tǒng)“開封城摞城可視化展示”的設(shè)計(jì)實(shí)現(xiàn)過程中,參考了文獻(xiàn)[2-3]先進(jìn)的設(shè)計(jì)理念和虛擬仿真技術(shù)。經(jīng)過前期素材搜集,實(shí)地測(cè)量,三維建模等一系列步驟,最終做出一個(gè)基于Panda3D的場(chǎng)景漫游系統(tǒng)。
1 古建筑虛擬再現(xiàn)的前期設(shè)計(jì)
開封地下每座城池規(guī)模隨著朝代的繁華記錄著當(dāng)時(shí)中國朝代的歷史興衰,特別是北宋時(shí)期的東京城,三層城垣,密密麻麻的城市道路和河流系統(tǒng)每時(shí)每刻都在顯示著當(dāng)時(shí)中國的繁榮和強(qiáng)盛。參考史料收集素材,對(duì)于現(xiàn)在開封城下的年代久遠(yuǎn)古建筑的資料考古發(fā)掘的文字,數(shù)據(jù)和照片進(jìn)行整理,現(xiàn)存的古跡進(jìn)行實(shí)地考察和測(cè)量。將收集的數(shù)據(jù)和圖片信息利用建模軟件制作模型,然后用3dmax制作模型,模型格式轉(zhuǎn)化,導(dǎo)入Panda3D中,最后python語言調(diào)用Panda3D設(shè)計(jì)場(chǎng)景的漫游和碰撞檢測(cè)效果,最后完成虛擬漫游系統(tǒng)的仿真再現(xiàn)。
1.1 實(shí)地考察現(xiàn)存古跡和整理收集史料
實(shí)物的具體數(shù)據(jù)一定要到古建筑所在的地方測(cè)量,對(duì)古建筑進(jìn)行各項(xiàng)數(shù)據(jù)進(jìn)行實(shí)地的測(cè)量[6]。這個(gè)過程是制作精確的古建筑模型,以及更準(zhǔn)確地復(fù)原古建筑的原來面貌所必要的。我們花費(fèi)了大量的時(shí)間和人力,走遍了開封的大街小巷,收集到很多古建筑的實(shí)際規(guī)模,尤其是到博物館和文化遺址;同時(shí)我們請(qǐng)教考古學(xué)家和考古現(xiàn)場(chǎng)的工作人員,以及他們收集和發(fā)掘的數(shù)據(jù)為我們?cè)诮酉聛淼娜蝿?wù)中起到關(guān)鍵性的作用;以及相關(guān)部門為我們提供城墻和城門精確坐標(biāo)的位置,這對(duì)我們規(guī)劃開封古城明確了方向。為了能夠精確地?cái)[放場(chǎng)景中的模型,采用OpenStreetMap來繪制開封歷朝歷代的地圖和城市道路布局。
1.2 三維模型的制作過程
利用現(xiàn)有史料和圖片整理所得到的數(shù)據(jù),使模型制作顯得簡單。3D Max的幾何建模方法主要有多邊形(Polygon)建模、非統(tǒng)一有理B樣條曲線建模(NURBS)、構(gòu)造幾何體建模(CSG)[4-5] 。以劉青霞故居某房屋為例。根據(jù)整理的資料采用3D Max建模方法生成的房屋模型。圖1是房屋模型渲染后截取的前視圖。
1.3 紋理映射
由于用建模軟件直接制作的三維模型過于粗糙,所以用紋理映射來增強(qiáng)表面細(xì)節(jié)和場(chǎng)景的真實(shí)感。紋理映射是指,確定物體表面的可見點(diǎn),以紋理模式的對(duì)應(yīng)點(diǎn)參與光照模型進(jìn)行計(jì)算,把紋理模式附加到物體表面上的過程。紋理模式在紋理空間(st坐標(biāo)系)中一般用矩陣定義;而場(chǎng)景中的物體在物體空間中一般用紋理坐標(biāo)(uv坐標(biāo)系)來定義;投影平面上的像素點(diǎn)則在像素空間中用平面坐標(biāo)系(xy坐標(biāo)系)來定義??梢杂袃煞N方法實(shí)現(xiàn)映射:一是將紋理模式映射到物體表面,然后再映射到投影平面;二是將像素區(qū)域映射到物體表面,再映射到紋理空間。如圖2所示。
由紋理空間向物體空間的映射用含參數(shù)的線性函數(shù)來表示
然而在Panda3D中的egg模型文件格式必須建立紋理坐標(biāo),模型中的每一個(gè)頂點(diǎn)和貼圖中的每個(gè)(u,v)頂點(diǎn)相關(guān)聯(lián)。紋理坐標(biāo)的每個(gè)頂點(diǎn)(u,v)在紋理中,頂點(diǎn)(x,y,z)在三維立體空間中。Pand3D中調(diào)用Texture()函數(shù)來完成一些簡單的紋理參數(shù)化,但是這種方式只適用于一般簡單的紋理映射。在Panda3D引擎中一般將紋理坐標(biāo)定義在頂點(diǎn),初始化時(shí)從模型文件中直接讀入頂點(diǎn)的紋理坐標(biāo)。
2 虛擬場(chǎng)景漫游設(shè)計(jì)
虛擬漫游是在以建立虛擬場(chǎng)景技術(shù)為基礎(chǔ),運(yùn)用虛擬漫游技術(shù)為手段,二者相互結(jié)合才是真正的虛擬漫游實(shí)現(xiàn)。而Panda3D是一個(gè)集合了圖像,音效,輸入輸出,碰撞檢測(cè)的3D的游戲引擎。運(yùn)用Python編程實(shí)現(xiàn)場(chǎng)景的虛擬漫游和碰撞檢測(cè)。
2.1 場(chǎng)景文件的導(dǎo)入
對(duì)于場(chǎng)景建模有兩種方式,一種是利用Panda3D自帶的功能建模,另一種則是從外部導(dǎo)入的模型,不同的游戲引擎都有獨(dú)特模型導(dǎo)入格式,然后Panda3D特有的格式.egg格式。以下是3dmax和panda3d模型轉(zhuǎn)換的步驟。
⑴ 先將3dmax模型轉(zhuǎn)成obj格式,把貼圖轉(zhuǎn)換成統(tǒng)一的格式(如jpg,png等)。
⑵ 其次在3dmax導(dǎo)入obj,再轉(zhuǎn)成fbx格式,格式裝換時(shí)需要修改特定的參數(shù)。
⑶ 然后由maya導(dǎo)入fbx格式,存成 maya的mb格式(保存ASCII和二進(jìn)制格式)。
⑷ 最后由panda3d的自帶的 maya2egg 轉(zhuǎn)成egg格式 ,再把obj格式文件中的jpg圖片拷貝到egg目錄,然后修改egg文件中的貼圖位置,此時(shí)模型可以轉(zhuǎn)化成Panda3D所需要的格式。圖3表示游戲引擎的特殊模型文件(egg)格式轉(zhuǎn)換的步驟。
如果使用的建模工具是maya,則可以直接生成模型轉(zhuǎn)換mb格式的文件,然后利用上述條件第⑷步,即可得到egg格式的模型。
2.2 場(chǎng)景漫游技術(shù)
在虛擬場(chǎng)景漫游中,可以設(shè)計(jì)多種漫游形式供用戶選擇,相應(yīng)的,就需要不同的視點(diǎn)控制方式來實(shí)現(xiàn)不同形式的漫游。Panda3D提供了一個(gè)默認(rèn)的相機(jī)base.camera,這個(gè)節(jié)點(diǎn)同樣是一個(gè)PandaNode,因此,它的位置等屬性可以通過set*()函數(shù)來更新。如果道路起伏不平,相機(jī)應(yīng)隨著起伏顛簸讓用戶有更真實(shí)的感受。由于相機(jī)也是一個(gè)節(jié)點(diǎn),于是可以為它創(chuàng)建一個(gè)碰撞實(shí)體來適應(yīng)道路的起伏。為適應(yīng)環(huán)境中這種顛簸狀態(tài)需要改變相機(jī)的角度。當(dāng)用戶想自由的游走,設(shè)計(jì)人員這時(shí)需要利用鍵盤的方向鍵為用戶來提供不同方向的游走,即為每個(gè)方向鍵的up down設(shè)定響應(yīng)函數(shù)就非常重要。Panda3D提供了一個(gè)事件句柄來響應(yīng)某種消息。游走的部分代碼如下:
def setAI(self):
self.accept("enter", self.setMove)
self.accept("arrow_up", self.setKey, ["up",1])
self.accept("arrow_up-up", self.setKey, ["up",0])
taskMgr.add(self.Mover,"Mover")
2.3 碰撞檢測(cè)技術(shù)
碰撞檢測(cè)是模擬現(xiàn)實(shí)環(huán)境中的人物及物體在遇到障礙物時(shí)發(fā)生的本能反應(yīng),三維場(chǎng)景的效果必須符合客觀世界的發(fā)展規(guī)律,則碰撞檢測(cè)就成為了物體仿真引擎中一個(gè)不可回避的問題。設(shè)想,如果三維場(chǎng)景的物體發(fā)生位移,就必須判斷是否與其他物體之間保持一定的距離,否則就可能碰撞。假如物體在移動(dòng)的過程中與其他物體同時(shí)出現(xiàn)在同一空間區(qū)域,就會(huì)大大降低漫游效果的真實(shí)性。然而解決此類碰撞檢測(cè)問題的方法是在被碰撞的物體(比如墻體)對(duì)應(yīng)的圖像區(qū)域設(shè)置掩碼,處理人物活動(dòng)時(shí)判斷當(dāng)前所在區(qū)域的掩碼。碰撞檢測(cè)的問題就變成了在三維場(chǎng)景中對(duì)所有物體兩兩求交判斷,算法是求物體之間的位置關(guān)系[7]。
Panda3D中CollisionNode有兩個(gè)碰撞掩碼,“from”CollisionNode中的solid和另一個(gè)CollisionNode或幾何體進(jìn)行碰撞檢測(cè)之前,會(huì)先比較兩個(gè)物體的碰撞掩碼。具體來說,就是from物體的“from”掩碼和into物體的“into”掩碼,進(jìn)行與運(yùn)算。如果結(jié)果不為零,就進(jìn)行碰撞檢測(cè),否則,不進(jìn)行檢測(cè)。碰撞檢測(cè)的掩碼是為碰撞節(jié)點(diǎn)設(shè)置“from”的碰撞掩碼,而且必須為節(jié)點(diǎn)本身設(shè)置掩碼:
nodePath.node().setFromCollideMask(BitMask32(0x10))
接下來是處理碰撞檢測(cè)的問題,Panda3D中的CollisionHandler函數(shù)可以處理復(fù)雜的程序。CollisionHandlerPusher可以處理CollisionHanderEvent處理范圍以外的邏輯事件,如果兩個(gè)物體快發(fā)生碰撞的時(shí)候,從表面上看物體撞到被撞物體以后,它會(huì)在被碰撞物體旁停下,如果物體以一個(gè)打在被碰撞物體上,物體會(huì)延被碰撞物體滑動(dòng)。這里使用Panda驅(qū)動(dòng)攝像機(jī)的移動(dòng)(或者其他節(jié)點(diǎn)),設(shè)置了pusher的驅(qū)動(dòng)節(jié)點(diǎn),通過調(diào)用pusher.addCollider。碰撞處理重要的代碼如下:
4 結(jié)束語
開封古城場(chǎng)景在Panda3D的應(yīng)用具有良好的系統(tǒng)結(jié)構(gòu),古建筑復(fù)原模型和3D Max的結(jié)合,可讓古代的建筑再次展現(xiàn)在人們的視野中。本文解決外部模型轉(zhuǎn)換問題;同時(shí)還解決在Panda3D中實(shí)現(xiàn)漫游和碰撞檢測(cè)的問題,通過Python函數(shù)調(diào)用Panda3D生成圖形展示界面,為展示具有真實(shí)感的三維模型,并可為其改變顯示效果和滿足漫游要求。目前,宋朝的開封古城已初具規(guī)模,我們下一步將著手去做開封其他歷史時(shí)期的古城場(chǎng)景,最終給出開封“城摞城”的大規(guī)模場(chǎng)景。通過參與項(xiàng)目開發(fā)來實(shí)踐其可行性,對(duì)將來的研究工作和虛擬交互發(fā)展方向進(jìn)行展望。本文所使用的方法以及現(xiàn)有的大部分方法都是針對(duì)小規(guī)模的場(chǎng)景,對(duì)于后期的大規(guī)模復(fù)雜場(chǎng)景顯然并不實(shí)用,為了解決這一問題,近年來已經(jīng)有研究者嘗試引入點(diǎn)云重建方法的三維重建,我們認(rèn)為基于點(diǎn)云重建的三維重建方法是未來的發(fā)展方向之一。
參考文獻(xiàn)(References):
[1] 劉光然.虛擬現(xiàn)實(shí)技術(shù)[M].清華大學(xué)出版社,2011.
[2] 任國棟,陳林華.基于Unity3D的虛擬博物館信息可視化系
統(tǒng)[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2013.22(9):86
[3] 高少峰.基于VRML的古代建筑動(dòng)態(tài)漫游系統(tǒng)[D].北京化工
大學(xué)碩士學(xué)位論文,2009.
[4] 羅康.基于OpenGL的3D游戲場(chǎng)景編輯器的設(shè)計(jì)與實(shí)現(xiàn)[D].
北京化工大學(xué)碩士學(xué)位論文,2009.
[5] 佟帥,徐曉剛,易成濤,邵成勇.基于視覺的三維重建技術(shù)綜述[J].
計(jì)算機(jī)應(yīng)用研究,2011.28(7):2411
[6] 郭云仲.虛擬現(xiàn)實(shí)技術(shù)在古建筑復(fù)原中的應(yīng)用研究[D].武漢
理工大學(xué)碩士學(xué)位論文,2008.
[7] http://www.panda3d.org