丁亞峰+姜保慶



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