潘光洋 王雪鳳
(廣東商學(xué)院 華商學(xué)院,廣州 511300)
虛擬現(xiàn)實(shí)技術(shù)的發(fā)展,為三維虛擬展示、虛擬設(shè)計(jì)和虛擬教學(xué)等提供了非常好的發(fā)展平臺(tái)。Web3d虛擬現(xiàn)實(shí)技術(shù)是虛擬現(xiàn)實(shí)技術(shù)和網(wǎng)絡(luò)技術(shù)的結(jié)合,隨著web3d技術(shù)的發(fā)展,web3d聯(lián)盟發(fā)布了X3d標(biāo)準(zhǔn)。X3d標(biāo)準(zhǔn)是web3d技術(shù)的核心,是vrml的發(fā)展,通過有限的已定義節(jié)點(diǎn)構(gòu)建三維虛擬現(xiàn)實(shí)場(chǎng)景,提供了開發(fā)者自定義模型節(jié)點(diǎn)的功能,擁有強(qiáng)大的交互設(shè)計(jì)能力,X3d場(chǎng)景能在網(wǎng)絡(luò)上快速傳輸。X3D標(biāo)準(zhǔn)規(guī)定了X3D場(chǎng)景文件格式,其包括X3D classic、X3D binary和XML。PHP(Hypertext Preprocessor,超文本預(yù)處理器),是一種腳本編程語言,主要用于編寫服務(wù)端腳本、命令行腳本和客戶端的GUI應(yīng)用程序[1],其在動(dòng)態(tài)網(wǎng)頁設(shè)計(jì)和開發(fā)中得到廣泛應(yīng)用。
本文是在構(gòu)建X3D虛擬美術(shù)館的項(xiàng)目基礎(chǔ)上研究X3D的編碼格式和PHP動(dòng)態(tài)生成XML文檔,最終提出基于PHP的X3D場(chǎng)景動(dòng)態(tài)生成技術(shù)的應(yīng)用方法。
Web3d聯(lián)盟的發(fā)布了X3D編碼格式文件ISO/IEC 19776。此標(biāo)準(zhǔn)文檔規(guī)定了X3d的編碼格式包括:X3D classic、X3D binary和XML,相應(yīng)的MIME類型分別是model/X3d+VRML、model/X3d+binary和model/X3d+xml,其中X3d binary格式是X3D文件的壓縮格式。X3D classic和XML格式是X3D文檔編寫的格式。使用X3D classic編碼格式的X3D文檔必須以“#X3D V3.0 utf8”字符串開頭,而使用XML編碼格式的X3D文檔則以“<?xml version="1.0"encoding="utf-8"?>”字符串開頭。本文在研究PHP動(dòng)態(tài)生成X3D場(chǎng)景技術(shù)中應(yīng)用XML編碼格式。接下來,介紹X3D中XML編碼格式的文件語法結(jié)構(gòu)。
X3d文件語法結(jié)構(gòu)由文件結(jié)構(gòu)、文件頭、文件體和注釋組成[2]。X3d的文件結(jié)構(gòu)包含了文件頭和主程序概貌,在主程序概貌中包括頭文檔和場(chǎng)景。在場(chǎng)景中利用基本幾何節(jié)點(diǎn)、復(fù)雜節(jié)點(diǎn)、組節(jié)點(diǎn)、紋理節(jié)點(diǎn)、效果節(jié)點(diǎn)、組件節(jié)點(diǎn)和交互節(jié)點(diǎn)等創(chuàng)建虛擬現(xiàn)實(shí)的三維模型和場(chǎng)景。X3D的XML文件結(jié)構(gòu)如圖1所示。
文件的節(jié)點(diǎn)編寫方式符合XML標(biāo)準(zhǔn),即每個(gè)節(jié)點(diǎn)都以“<節(jié)點(diǎn)名稱>”開始,以“</節(jié)點(diǎn)名稱>”結(jié)束或“<節(jié)點(diǎn)名稱 />”,如主程序概貌節(jié)點(diǎn)“<X3D>…</X3D>”和“<ImageTexture/>”。構(gòu)建虛擬美術(shù)館,本文使用了PHP動(dòng)態(tài)生成X3d場(chǎng)景使用的節(jié)點(diǎn)包括:Transform、ImageTexture、Anchor等,使用了節(jié)點(diǎn)屬性DEF和USE等。
圖1 X3D的XML文件結(jié)構(gòu)
1)節(jié)點(diǎn)屬性DEF和USE X3D的XML編碼格式標(biāo)準(zhǔn)中規(guī)定DEF用來定義節(jié)點(diǎn)在場(chǎng)景中的標(biāo)識(shí)名稱,USE表示在場(chǎng)景中應(yīng)用了某個(gè)使用DEF定義的標(biāo)識(shí)名稱。如在文檔中添加了一個(gè)標(biāo)識(shí)名稱為shape1的Transform節(jié)點(diǎn),則其代碼如下:
<Transform DEF=”shape1” > </Transform>
若場(chǎng)景中出現(xiàn)多個(gè)與“shape1”模型,可以使用USE進(jìn)行引用,代碼如下:
<Transform USE=”shape1” > </Transform>
2)Transform節(jié)點(diǎn)Transform節(jié)點(diǎn)是X3D的組節(jié)點(diǎn),它創(chuàng)建一個(gè)相對(duì)于已有坐標(biāo)系的新坐標(biāo)系,該節(jié)點(diǎn)所包含的空間都是在這個(gè)新坐標(biāo)系的基礎(chǔ)上創(chuàng)建的。其節(jié)點(diǎn)的屬性包括translation、rotation、scale、children等。translation域指定了新坐標(biāo)系原點(diǎn)在父坐標(biāo)系中的XYZ的坐標(biāo),缺省值為0.0 0.0 0.0,表示新坐標(biāo)系的原點(diǎn)與父坐標(biāo)系的重合,也表示組中的模型在父坐標(biāo)系中的位置。在虛擬美術(shù)館的構(gòu)建中,translation屬性用來表示畫框的位置信息。
3)ImageTexture節(jié)點(diǎn)ImageTexture節(jié)點(diǎn)指明了一個(gè)紋理圖和將該紋理圖映射至幾何體表面時(shí)需要指定的參數(shù),作為Appearance外觀節(jié)點(diǎn)的子節(jié)點(diǎn)出現(xiàn)。其重要節(jié)點(diǎn)屬性是url,此屬性中虛擬美術(shù)館中用來展示展品圖片,代碼如下:
<ImageTexture url=’/works/1.jpg’/>
4)Anchor節(jié)點(diǎn)Anchor節(jié)點(diǎn)即超級(jí)銜接組節(jié)點(diǎn),它的作用是銜接X3D三維立體空間中各個(gè)不同場(chǎng)景和與網(wǎng)頁進(jìn)行交互。其重要節(jié)點(diǎn)屬性包括:description和url。description域:指定一個(gè)文本字符串提示,當(dāng)移動(dòng)光標(biāo)到描點(diǎn)而不點(diǎn)擊它時(shí),瀏覽器現(xiàn)實(shí)該提示字符串文件;url域:指定需裝入文件的路徑或網(wǎng)絡(luò)導(dǎo)航器地址URL。單擊錨節(jié)點(diǎn)的子節(jié)點(diǎn),可以跳轉(zhuǎn)到其他網(wǎng)址。本文的研究中使用description屬性顯示展品圖片的作者和展品名稱信息,使用url屬性傳遞展品信息與網(wǎng)頁進(jìn)行交互執(zhí)行網(wǎng)頁上定義的javascript函數(shù)。
PHP是一個(gè)操作簡(jiǎn)單、功能強(qiáng)大的動(dòng)態(tài)網(wǎng)站開發(fā)語言,是一種HTML內(nèi)嵌式的語言,是一種在服務(wù)器端執(zhí)行的嵌入HTML文檔的腳本語言,用PHP開發(fā)的網(wǎng)站,開發(fā)過程簡(jiǎn)單,用戶維護(hù)方便,而且具有很好的安全性[3]。PHP有良好的跨平臺(tái)性,非常容易進(jìn)行移植,能夠得到IIS和Apache等WEB服務(wù)器的支持,因此它廣泛的運(yùn)行在Windows、Unix、Linux等操作系統(tǒng)上。當(dāng)前PHP的開發(fā)大部分是在Apache服務(wù)器下進(jìn)行,由于PHP是開放源代碼的開發(fā)語言,其擁有龐大的開發(fā)者支持,擁有各種功能的類可供開發(fā)者進(jìn)行二次開發(fā)。PHP生來就能對(duì)mysql數(shù)據(jù)庫進(jìn)行數(shù)據(jù)操作,方便、安全地讀寫mysql數(shù)據(jù)庫。因此Apache+PHP+Mysql的開發(fā)組合是眾多網(wǎng)站開發(fā)者的首選。
網(wǎng)頁上的PHP代碼編寫格式如下:
<?php…….?>
PHP是一種嵌入HTML文檔的腳本語言,那它能夠在HTML文檔中直接編寫代碼,能夠與javascript代碼進(jìn)行信息傳遞,也就是說,在編寫網(wǎng)頁代碼時(shí)可以將PHP代碼和HTML代碼混合。X3D的XML編碼也是一種標(biāo)記語言,所以可以在XML文檔中嵌入PHP代碼。在動(dòng)態(tài)生成X3D場(chǎng)景時(shí)使用了如下幾個(gè)PHP系統(tǒng)函數(shù):
1)Header()函數(shù)header函數(shù)向客戶端發(fā)送原始的HTTP報(bào)頭。HTTP的報(bào)頭可以包含了文檔的類型、文檔的位置、文檔的編碼等。
2)echo()函數(shù)echo函數(shù)表示在網(wǎng)頁中輸出一個(gè)或多個(gè)字符串。其作用是用于輸出PHP變量、字符串、常量和html等,使得PHP能與HTML完美地結(jié)合在一起,能給javascript傳遞信息。
PHP在4.0版本之后完善了對(duì)面向?qū)ο缶幊蹋璒OP的支持。PHP使用關(guān)鍵字class來聲明一個(gè)類,后面緊跟類的名字,主體用 {}符號(hào)括起來。通過在類定義中使用關(guān)鍵字var來聲明變量,即創(chuàng)建了類的屬性,也叫類的成員屬性;通過在類定義中聲明函數(shù),即創(chuàng)建了類的方法[4]。在開發(fā)項(xiàng)目過程中,使用一個(gè)訪問數(shù)據(jù)庫的類封裝讀寫數(shù)據(jù)庫的方法,可以提高了PHP程序的重用性。
虛擬美術(shù)館項(xiàng)目所涉及的數(shù)據(jù)庫表比較多,本文針對(duì)動(dòng)態(tài)生成X3D場(chǎng)景所需的數(shù)據(jù)庫表進(jìn)行討論??紤]到數(shù)據(jù)庫保存數(shù)據(jù)的容量和訪問數(shù)據(jù)庫的頻率,在設(shè)計(jì)數(shù)據(jù)庫時(shí)要把握兩點(diǎn):(1)確定模型中哪些數(shù)據(jù)是不變的,哪些是變化的;(2)確定X3D模型文檔中哪些是數(shù)據(jù)才是主要數(shù)據(jù)、關(guān)鍵數(shù)據(jù)。本文的研究中涉及了3個(gè)數(shù)據(jù)表:展覽表gallery、展品表images和位置信息表positioninfo。展覽表保存了現(xiàn)實(shí)美術(shù)館舉辦的每一次展覽的信息,包括展覽的主題、展覽的海報(bào)、展覽舉辦時(shí)間等;展品表保存相應(yīng)展覽中的展品信息,包括展品的圖片路徑、展品作者、展品名稱和展品的簡(jiǎn)介等;位置信息表保存了展品放置在虛擬場(chǎng)景中的位置信息,包括位置名稱、位置的三維坐標(biāo)和展品放置在墻的正反面信息等。
PHP動(dòng)態(tài)生成X3D場(chǎng)景的方法是將原有的X3D場(chǎng)景文檔進(jìn)行處理,變化的數(shù)據(jù)保存在數(shù)據(jù)庫中,不變的數(shù)據(jù)保存在PHP文檔中;并且能過PHP將變化的數(shù)據(jù)從數(shù)據(jù)庫中讀取出來,結(jié)合不變的數(shù)據(jù)形成X3D場(chǎng)景文檔;最后通過X3D瀏覽器顯示出來,其邏輯過程如圖2所示。
圖2 PHP動(dòng)態(tài)生成X3D場(chǎng)景邏輯圖
PHP動(dòng)態(tài)生成X3D場(chǎng)景的部分代碼和解釋如下:
1)向?yàn)g覽器說明此文檔的編碼格式是X3D的XML編碼格式。
header('Content- type:model/x3d+xml');
2)數(shù)據(jù)庫中通過左聯(lián)接的方式聯(lián)接展品信息表、展覽表和位置信息表,查詢指定展覽中各位置的展品信息。
$sql="SELECT p.positionid,p.positionname,p.type,p.positioninfo,i.path,i.filename,i.author,i.title,i.imageid FROM position as p left outer join(select* from images where actived=1 and galleryid=".$vgallery_id.")as i on p.positionid=i.positionid";
3)生成展品的信息節(jié)點(diǎn)Anchor。此節(jié)點(diǎn)顯示展品的作者和展品名稱信息,通過javascript:showInfo()函數(shù)為瀏覽展覽的用戶提供了添加展品和修改展品的功能。
<Anchor url= 'javascript:showInfo(”".(!isset($image ["imageid"])?"addimage":"editimage|".$image["imageid"])." |".$image ["positionid"]."”);'description= '作者:".$image ["author"].",標(biāo)題:".$image ["title"]." '>
4)生成展品圖片貼圖節(jié)點(diǎn)。
< ImageTexture url= '”".BASEURL.'MyWebsiteImages/'.$image ["path"].'_ '.WEBSITE_KEY.$imgsize.$image["filename"]."”'/>
生成的X3D文檔顯示在X3D播放器中,還應(yīng)該在其他網(wǎng)頁文檔中添加如下代碼:
<embed id=ContactFrame name=ContactFrame height="600"width="800"src="gallery.php?vgallery_id='.$galleryid.'" > < /embed>
虛擬美術(shù)館的“2010屆美術(shù)專業(yè)畢業(yè)優(yōu)秀作品展”展覽俯視圖如圖3所示。圖中有些展區(qū)的展品相同,那是因?yàn)檎箙^(qū)還沒添加展品,應(yīng)用了默認(rèn)展品。第一幅圖旁邊有顯示了“作者:,標(biāo)題:ximiling”白色信息欄,那是Anchor節(jié)點(diǎn)的description屬性決定的。
圖3 X3D場(chǎng)景的俯視圖
單擊場(chǎng)景中的第二展區(qū)的默認(rèn)展品,即可添加展品信息。保存展品信息后,瀏覽界面回到場(chǎng)景如圖4所示。
虛擬美術(shù)館的構(gòu)建實(shí)例證明PHP動(dòng)態(tài)生成X3D場(chǎng)景技術(shù)的可行性和實(shí)用性。PHP動(dòng)態(tài)生成X3D場(chǎng)景技術(shù)可以應(yīng)用在虛擬實(shí)驗(yàn)教學(xué)系統(tǒng)和虛擬圖書館系統(tǒng)等網(wǎng)上虛擬現(xiàn)實(shí)系統(tǒng),也可以用于構(gòu)建一個(gè)擁有虛擬場(chǎng)景的虛擬社區(qū)。
圖4 添加展品后的俯視圖
[1]Bisson S.An introduction to PHP[J].Application Development Advisor,2002,6(4):38 -41.
[2]張金釗.X3D虛擬現(xiàn)實(shí)設(shè)計(jì)-第二代立體網(wǎng)絡(luò)程序設(shè)計(jì)語言[M].北京:電子工業(yè)出版社,2007.
[3]杜闖.PHP在動(dòng)態(tài)網(wǎng)站開發(fā)中的優(yōu)勢(shì)[J].電腦知識(shí)與技術(shù),2010,6(13):3342-3344.
[4]PHP5權(quán)威編程[M].簡(jiǎn)張桂,譯.北京:電子工業(yè)出版社,2008.