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