版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、虛擬現(xiàn)實(shí)技術(shù) vrml 篇一、vrml 介紹1. 什么是vrml ?vrml 是“ virtual reality modeling language ”的縮寫(xiě)形式,意思是“虛擬現(xiàn)實(shí)造型語(yǔ)言”。第一代web 是以html 為核心的二維瀏覽技術(shù),受html 語(yǔ)言的局限性,vrml 之前的網(wǎng)頁(yè)只能是簡(jiǎn)單的平面結(jié)構(gòu),而且實(shí)現(xiàn)環(huán)境與參與者的動(dòng)態(tài)交互是非常煩瑣的。第二代web 是以vrml 為核心的三維瀏覽技術(shù)。第二代web 把vrml 與html 、java 、媒體信息流等技術(shù)有機(jī)地結(jié)合起來(lái),形成一種新的三維超媒體web 。vrml 是用來(lái)描述三維物體及其行為的,可以構(gòu)建虛擬境界( virtural
2、world), 可以集成文本、圖像、音響、mpeg 影像等多種媒體類型,還可以內(nèi)嵌用java 、ecmascript 等語(yǔ)言編寫(xiě)的程序代碼。以vrml 為核心構(gòu)建的虛擬世界中用戶如身處真實(shí)世界,可以和虛擬物體交互,人們可以以習(xí)慣的自然方式訪問(wèn)各種場(chǎng)所,在虛擬社區(qū)中“直接”交談和交往。事實(shí)上,目前采用vrml 技術(shù)取得成功的案例已經(jīng)很多,例如探路者到達(dá)火星后的信息就是利用vrml 在因特網(wǎng)上即時(shí)發(fā)布的,網(wǎng)絡(luò)用戶可以以三維方式隨探路者探索火星。2. vrml 的工作原理vrml 定義了一種把3d 圖形和多媒體集成在一起的文件格式。從語(yǔ)法角度看,vrml 文件是顯式地定義和組織起來(lái)的3d 多媒體對(duì)象
3、集合;從語(yǔ)義角度看,vrml 文件描述的是基于時(shí)間的交互式3d 多媒體信息的抽象功能行為vrml 文件描述的基于時(shí)間的3d 空間稱為虛擬境界(virtual world) ,簡(jiǎn)稱境界,所包含的圖形對(duì)象和聽(tīng)覺(jué)對(duì)象可通過(guò)多種機(jī)制動(dòng)態(tài)修改。vrml 文件可以包含對(duì)其他標(biāo)準(zhǔn)格式文件的引用??梢园裫peg 、png 和mpeg 文件用于對(duì)象紋理映射,把wav 和midi 文件用于在境界中播放的聲音。另外,還可以引用包含java 或ecmascript 代碼的文件,從而實(shí)現(xiàn)對(duì)象的編程行為。vrml 使用場(chǎng)景圖 ( scene graph ) 數(shù)據(jù)結(jié)構(gòu)來(lái)建立3d 實(shí)境,vrml 的 場(chǎng)景圖是一種代表所有3d
4、 世界靜態(tài)特征的節(jié)點(diǎn)等級(jí):幾何關(guān)系、質(zhì)材、紋理、幾何轉(zhuǎn)換、光線、視點(diǎn)以及嵌套結(jié)構(gòu)。幾乎所有生產(chǎn)廠商,無(wú)論是cad 、建模、動(dòng)畫(huà)、vr,還是vrml,他們的結(jié)構(gòu)核心都有場(chǎng)景圖。境界中的對(duì)象及其屬性用節(jié)點(diǎn)(node) 描述,節(jié)點(diǎn)按照一定規(guī)則構(gòu)成場(chǎng)景圖(scene graph) ,也就是說(shuō),場(chǎng)景圖是境界的內(nèi)部表示。場(chǎng)景圖中的第一類節(jié)點(diǎn)用于從視覺(jué)和聽(tīng)覺(jué)角度表現(xiàn)對(duì)象,它們按照層次體系組織起來(lái),反映了境界的空間結(jié)構(gòu)。另一類節(jié)點(diǎn)參與事件產(chǎn)生和路由機(jī)制,形成路由圖(route graph) ,確 定境界隨時(shí)間的推移如何動(dòng)態(tài)變化。vrml 文件的解釋、執(zhí)行和呈現(xiàn)通過(guò)瀏覽器實(shí)現(xiàn),這與利用瀏覽器顯示html 文件的
5、機(jī)制完全相同。瀏覽器把場(chǎng)景圖中的形態(tài)和聲音呈現(xiàn)給用戶,這種視聽(tīng)覺(jué)呈現(xiàn)即所謂的虛擬世界(境界)。用戶通過(guò)瀏覽器獲得的視聽(tīng)覺(jué)效果如同從某個(gè)特定方位體驗(yàn)到的,境界中的這種位置和朝向稱為取景器(viewer) 。3. vrml 的應(yīng)用vrml 在電子商務(wù)、教育、工程技術(shù)、建筑、娛樂(lè)、藝術(shù)等領(lǐng)域有廣泛的應(yīng)用例如在教育上,vrml 不僅僅是html 功能更強(qiáng)的替代品,其潛在意義在于突破上述基于www 的教學(xué)模型建立更自然、更真實(shí)的虛擬教育環(huán)境。在這種環(huán)境中學(xué)生可以以瀏覽探索的方式汲取知識(shí),如進(jìn)入虛擬太空學(xué)習(xí)天文知識(shí),利用虛擬地球?qū)W習(xí)地理知識(shí),穿過(guò)歷史長(zhǎng)廊與歷史人物交流,進(jìn)入分子世界游歷化學(xué)殿堂等等,這些曾
6、經(jīng)是夢(mèng)想中的學(xué)習(xí)方式都可以逐步實(shí)現(xiàn)。在這個(gè)虛擬教育世界中,甚至可以有利用vrml 制作的動(dòng)畫(huà)人物扮演教師,其面部表情和形體動(dòng)作利用動(dòng)作跟蹤系統(tǒng)捕捉下來(lái),這樣得到的講課節(jié)目將是三維的。如果把這種方式擴(kuò)大到教學(xué)雙方,則可實(shí)現(xiàn)具有實(shí)時(shí)交互性的虛擬教學(xué)教師控制的虛擬教師和學(xué)生控制的虛擬學(xué)生就可以在一個(gè)虛擬教室中相互交流。4. vrml 的工作組及其研究目標(biāo)為了推動(dòng)vrml 技術(shù)的發(fā)展,vrml 協(xié)會(huì)組織了很多工作組,每個(gè)工作組都是自愿組織、自我約束、并經(jīng)vrml 協(xié)會(huì)認(rèn)可的技術(shù)委員會(huì),負(fù)責(zé)某個(gè)與vrml 有關(guān)的專題技術(shù)的研究和實(shí)現(xiàn)工作。人性動(dòng)畫(huà)工作組(humanoid animation wg) 利用
7、vrml 表現(xiàn)人類行為特性。色彩保真工作組(color fidelity wg) 確保采用任何平臺(tái)的觀眾所看到的效果都和創(chuàng)作者的原始作品一樣,顏色應(yīng)相當(dāng)一致。元形式工作組(meta forms wg) 針對(duì)利用形式文法生成的作品,提出一般性的方法論和一般性規(guī)范,使之能夠映射為某種特定形式。首要目標(biāo)是能夠表示數(shù)字生命格式( digital life-forms) 結(jié)構(gòu)和增長(zhǎng)。面向?qū)ο髷U(kuò)展工作組(object-oriented extensions wg) 探討和推動(dòng)對(duì)vrml 進(jìn)行面向?qū)ο髷U(kuò)展的方法。數(shù)據(jù)庫(kù)工作組(database wg) 推進(jìn)基于vrml 商業(yè)應(yīng)用的創(chuàng)建,利用數(shù)據(jù)庫(kù)維護(hù)vrml
8、 內(nèi)容的持久性、升級(jí)能力和安全傳輸能力。外部創(chuàng)作接口工作組(external authoring interface wg) 在vrml 境界 和外部環(huán)境之間建立標(biāo)準(zhǔn)接口。界面組件工作組(widgets wg) 為開(kāi)發(fā)者和用戶提供一套基礎(chǔ)性的、可自由使用的標(biāo)準(zhǔn)用戶界面組件集,并提供支持基本組件集和所有vrml 組件的理論框架。二進(jìn)制壓縮格式工作組(compressed binary format wg) 探討并開(kāi)發(fā)vrml 文件的二進(jìn)制編碼方法,重點(diǎn)是研究為了快速傳送目的而盡量縮小文件尺寸,同時(shí)為了快速解碼目的而盡量簡(jiǎn)化文件結(jié)構(gòu)。通用媒體庫(kù)工作組(universal media librari
9、es wg) 為了提高vrml 境界的真實(shí)感,同時(shí)減少網(wǎng)絡(luò)的下載量,而定義一種由駐留本地的媒體元件(紋理、聲音和vrml 對(duì)象)組成的小型跨平臺(tái)媒體庫(kù)。同時(shí)定義一種統(tǒng)一機(jī)制,通過(guò)這種機(jī)制,vrml 內(nèi)容創(chuàng)作者可以在自己的境界中使用這些媒體元件?;顒?dòng)境界工作組(living worlds wg)為多用戶(包括多個(gè)開(kāi)發(fā)者)應(yīng)用的產(chǎn)生和進(jìn)化定義概念框架,并確定一組界面。鍵盤(pán)輸入工作組(keyboard in put wg)為了使內(nèi)容創(chuàng)作者能夠在自己的境界中訪問(wèn)鍵盤(pán)輸入,定義一個(gè)或多個(gè)擴(kuò)充節(jié)點(diǎn)。一致性工作組(conformanee wg)為與一致性測(cè)試有關(guān)的問(wèn)題提供一個(gè)討論場(chǎng)所,特別地,本組將辨別vr
10、ml 實(shí)現(xiàn)發(fā)生分歧的地方以及相應(yīng)的動(dòng)作序列。生物圈工作組(biota wg) 為生命系統(tǒng)(living system) 的研究和學(xué)習(xí)建立、配備數(shù)字式工具和環(huán)境。分布式交互仿真工作組(distributed interactive simulation wg) 有多廣播能力(multicast-capable) 的大規(guī)模虛擬環(huán)境(large-scale virtual environments ,lsves) 確立初始網(wǎng)絡(luò)約定。vrml 腳本工作組(vrml script wg)向vrml 監(jiān)查組(vrml review board ,vrb) 提供有關(guān)java 和javascript 的問(wèn)題列
11、表、修改建議和評(píng)論。自然語(yǔ)言處理和動(dòng)畫(huà)工作組(nlp & animations wg) 為了使用戶能使用自然語(yǔ)言和vrml 動(dòng)畫(huà)形象進(jìn)行交流,從而使交互更自然,增強(qiáng)用戶和動(dòng)畫(huà)形象之間的信息流動(dòng),研究如何使用“問(wèn)題/ 回答”、“命令/ 響應(yīng)”式的對(duì)話以及基于操作系統(tǒng)命令和字符控制的自然語(yǔ)言。vrml-dhtml 集成工作組(vrml-dhtml integration wg)為vrml 和dhtml 為建立在文檔對(duì)象模型、組件(component) 接口和繪制等三個(gè)層次的緊密集成開(kāi)發(fā)一種概念模型。6.研究現(xiàn)狀vrml97 發(fā)布后,互聯(lián)網(wǎng)上的3d 圖形幾乎都使用了vrml 。由于技術(shù)的局限
12、性,如帶寬不夠,需要下栽插件瀏覽,文件量大,真實(shí)感、交互性需要進(jìn)一步加強(qiáng)等原因,最近一二年,許多制作web3d 圖形的軟件公司的產(chǎn)品,并沒(méi)有完全遵循vrml97 標(biāo)準(zhǔn),而是使用了專用的文件格式和瀏覽器插件,開(kāi)發(fā)了比較實(shí)用的vr 軟件。這些軟件有些比vrml 有了進(jìn)步,在渲染速度、圖像質(zhì)量、造型技術(shù)、交互性以及數(shù)據(jù)的壓縮與優(yōu)化上,都有勝過(guò)vrml 之處。比如,cult3d 、viewpoint 、gl4java 、pulse3d 、flatland 、flash 、jpeg2000 等。cult3d 、viewpoint 、360 度環(huán)視等技術(shù)正被應(yīng)用。以blaxxun 和parallelgra
13、phics 公司為代表,它們都有各自的vr 瀏覽器插件,并各自開(kāi)發(fā)基于vrml 標(biāo)準(zhǔn)的擴(kuò)展節(jié)點(diǎn)功能( x3d ),使3d 的效果,交互性能更加完美;支持mpeg ,mov 、avi 等視頻文件,rm 等流媒體文件,wav 、midi 、mp3 、aiff 等多種音頻文件,flash 動(dòng)畫(huà)文件,多種材質(zhì)效果,支持nurbs 曲線,粒子效果,霧化效果;支持多人的交互環(huán)境,vr 眼鏡等硬件設(shè)備;在娛樂(lè)、電子商務(wù)等領(lǐng)域都有成功的應(yīng)用,并各自為適應(yīng)x3d 的發(fā)展,以x3d 為核心,有blaxxun3d 等相關(guān)產(chǎn)品。在虛擬場(chǎng)景,尤其是大場(chǎng)景的應(yīng)用方面,以vrml 標(biāo)準(zhǔn)為核心的技術(shù)具有獨(dú)特的優(yōu)勢(shì)。二、初識(shí)v
14、rml( 一)vrml 的文件結(jié)構(gòu)1. 文件頭vrml2.0(vrml97) 開(kāi)頭如下:# vrml v2.0 utf8 vrml 是大小寫(xiě)敏感的,utf8 是指一種純文本編碼方式2. 場(chǎng)景圖 ( scene graph )由描述“對(duì)象及其屬性”的節(jié)點(diǎn)組成,節(jié)點(diǎn)是vrml 的基本單元,場(chǎng)景圖的第一類節(jié)點(diǎn)用于從視覺(jué)和聽(tīng)覺(jué)角度表現(xiàn)對(duì)象,它們是按照層次體系結(jié)構(gòu)組織的;另一類節(jié)點(diǎn),則參與事件產(chǎn)生和路由機(jī)制。3. 原型 ( prototype )用戶可以通過(guò)原型擴(kuò)充vrml 的節(jié)點(diǎn)類型集。原型的定義可以包含在使用該原型的文件中,也可以在外部定義4. 事件路由(route )有些vrml 節(jié)點(diǎn)能通過(guò)產(chǎn)生事
15、件響應(yīng)環(huán)境變化或用戶交互。事件一旦產(chǎn)生,就按時(shí)間順序向路由目標(biāo)節(jié)點(diǎn)發(fā)送。目標(biāo)節(jié)點(diǎn)接收后進(jìn)行相應(yīng)處理,可改變節(jié)點(diǎn)狀態(tài),產(chǎn)生其他事件,或者修改場(chǎng)景圖的結(jié)構(gòu)。利用腳本節(jié)點(diǎn)script ,作者可以java 或javascript 語(yǔ)言自定義任意事件處理。(二)vrkl 節(jié)點(diǎn)和數(shù)據(jù)類型虛擬場(chǎng)景由對(duì)象構(gòu)成,對(duì)象及其屬性用節(jié)點(diǎn)(node )描述,節(jié)點(diǎn)是構(gòu)成vrml 文件的基本單元。vrml97 定義了54 種基本節(jié)點(diǎn)類型(內(nèi)部節(jié)點(diǎn)類型),用戶也可以通過(guò)原型機(jī)制定義自己的節(jié)點(diǎn)類型。節(jié)點(diǎn)由域和事件組成:1. 域(field )描述了節(jié)點(diǎn)的當(dāng)前狀態(tài)。其中外露域(exposedfield )是域和事件的統(tǒng)一體,它既
16、作為域描述節(jié)點(diǎn),又隱含著形如“set_域名”的入事件和“域名_changed 的出事件。2. 事件(event )分為入事件和出事件,入事件將導(dǎo)致節(jié)點(diǎn)狀態(tài)的改變;出事件向外報(bào)告自身狀態(tài)的變化。(三)vrml 瀏覽器blaxxun contact 3d cosmo player visvape 等microsoft vrml2.0 viewer (四)編寫(xiě)vrml 境界1. 制作第一個(gè)虛擬境界#vrml v2.0 utf8 group children shape geometry box 將它保存為simpleworld.wrl 文件,則可以用瀏覽器看到它。2. 定義外觀一一第二場(chǎng)景再定義立方
17、體的外觀,即改變shape 節(jié)點(diǎn)的appearance 域(外觀),appearance 域是一個(gè)節(jié)點(diǎn),此節(jié)點(diǎn)的material 域定義為一個(gè)material 節(jié)點(diǎn):則shape 節(jié)點(diǎn)變成了:shape appearance appearance material material geometry box 修改它的diffusecolor 域(漫射色),應(yīng)該是 1 0 0 ,3 個(gè)數(shù)字分別表示紅色、綠色和藍(lán)色,取值范圍是0 到1:material material diffusecolor 1 0 0 這樣,生成了第二個(gè)場(chǎng)景文件:#vrml v2.0 utf8 group children
18、shape appearance appearance material material diffusecolor 1 0 0 geometry box 3. 定義變換一一第三個(gè)場(chǎng)景若想移動(dòng)這個(gè)紅色的立方體,可以通過(guò)為它外套一個(gè)transform 節(jié)點(diǎn)來(lái)實(shí)現(xiàn):transform translation 5 0 0 children shape appearance appearance material material diffusecolor 1 0 0 geometry box transform 節(jié)點(diǎn)的translation 5 0 0 表示x 軸向上右移5 個(gè)單位(米)則第三個(gè)場(chǎng)景
19、完整代碼如下:# vrml v2.0 utf8 group children transform translation 5 0 0 children shape appearance appearance material material diffusecolor 1 0 0 geometry box 4. 復(fù)制節(jié)點(diǎn)一一第四個(gè)場(chǎng)景復(fù)制節(jié)點(diǎn),并將各自的幾何形狀定義為方塊、球體和圓椎group children transform translation 5 0 0 children shape . . . geometry box transform translation 0 0 0 ch
20、ildren shape . . . geometry sphere transform translation -5 0 0 children shape . . . geometry cone # end of group children 為了以后引用方便,分別給這3 個(gè)transform 節(jié)點(diǎn)指定一個(gè)名稱:def box transform . . . def sphere transform . . . def cone transform . . . 則第四個(gè)場(chǎng)景的完整代碼是:# vrml v2.0 utf8 group children def box transform tra
21、nslation 5 0 0 children shape appearance appearance material material diffusecolor 1 0 0 geometry box def sphere transform translation 0 0 0 children shape appearance appearance material material diffusecolor 0 1 0 geometry sphere def cone transform translation -5 0 0 children shape appearance appea
22、rance material material diffusecolor 0 0 1 geometry cone # end of group children 將此文件保存為firstworld.wrl ,用瀏覽器觀看,可從多個(gè)方位瀏覽自己的作品。position 14 0 20(五)交互能力的加入1. 傳感器是交互能力的基礎(chǔ),共9 種。在場(chǎng)景中,傳感器節(jié)點(diǎn)一般是以其他節(jié)點(diǎn)的子節(jié)點(diǎn)的身份存在的,它的父節(jié)點(diǎn)稱為可觸發(fā)節(jié)點(diǎn),觸發(fā)條件和時(shí)機(jī)由傳感器節(jié)點(diǎn)類型確定。接觸傳感器(touchsensor )是最常用的傳感器,先了解一下開(kāi)關(guān)節(jié)點(diǎn)lightswitch (組節(jié)點(diǎn)),并定義一個(gè)接觸傳感器作為它的
23、子節(jié)點(diǎn):def lightswitch group children 各幾何造型節(jié)點(diǎn)def touchsensor touchsensor 傳感器能引起某種變化,下面看場(chǎng)景變化。2. 視點(diǎn)當(dāng)你拖動(dòng)鼠標(biāo)或按動(dòng)箭頭鍵時(shí)(按照vrml 術(shù)語(yǔ),稱為航行),虛擬境界就會(huì)旋轉(zhuǎn)或縮放,這實(shí)際上是在調(diào)整你的視點(diǎn)位置或視角。在虛擬場(chǎng)景的重要位置可以定義視點(diǎn)節(jié)點(diǎn)(viewpoint ),它們是境界作者給用戶推薦的上佳觀賞方位,在cosmoplayer 瀏覽器中,用戶就可以通過(guò)鼠標(biāo)右鍵選擇作者推薦的各個(gè)視點(diǎn)。這里我們定義兩個(gè)視點(diǎn)節(jié)點(diǎn):def view1 viewpoint “ view1 ”是編程時(shí)引用的名字def
24、 view2 viewpoint position 5 0 20 description view2 目的是使用戶可以通過(guò)觸發(fā)開(kāi)關(guān)節(jié)點(diǎn)來(lái)切換視點(diǎn)。視點(diǎn)節(jié)點(diǎn)中的坐標(biāo)表示視點(diǎn)在場(chǎng)景中的位置,坐標(biāo)的單位是米,視點(diǎn)的名稱將會(huì)在瀏覽器菜單中提示出來(lái)供用戶選擇。把上述視點(diǎn)說(shuō)明加入helloworld2.wrl 中(放在group 節(jié)點(diǎn)之前),并把其中的方塊節(jié)點(diǎn)修改成可觸發(fā)節(jié)點(diǎn):def box tranform children shape . box . def touchbox touchsensor 定義觸發(fā)節(jié)點(diǎn)把修改過(guò)的文件另存為“ touchme.wrl ”。3. 事件傳遞下面把觸發(fā)(用鼠標(biāo)箭頭按
25、動(dòng)方塊)和場(chǎng)景變化(視點(diǎn)切換)這兩件事情聯(lián)系起來(lái),在場(chǎng)景圖中,除節(jié)點(diǎn)構(gòu)成的層次體系外,還有一個(gè)“事件體系”,事件體系由相互通訊的節(jié)點(diǎn)組成description view1 “ view1 ”是瀏覽器上顯示的名字position 5 0 20能夠接收事件的節(jié)點(diǎn)都應(yīng)具有事件入口(eventin ),如果它要接收多種類型的事件(稱為入事件),它就應(yīng)該具有多個(gè)事件入口,也就是說(shuō),事件入口象節(jié)點(diǎn)的域一樣是有類型的。同樣,發(fā)送事件的節(jié)點(diǎn)應(yīng)有事件出口(eventout ), 事件出口也是有類型的。例如viewpoint 節(jié)點(diǎn)就有一個(gè)事件入口set_bind, 當(dāng)向此事件送入一個(gè)值“true(即所謂的入事件)
26、時(shí),該viewpoi nt節(jié)點(diǎn)成為當(dāng)前視點(diǎn)。又如,接觸檢測(cè)器touchsensor 有一個(gè)事件出口isactive, 當(dāng)受到用戶觸發(fā)后它就從此出口送出一個(gè)“true(即所謂的出事件)在下一個(gè)事件發(fā)送之前,此事件一直保存在事件出口中(作為記錄)。事件出口和事件入口通過(guò)路徑相連,這就是vrml 文件中除節(jié)點(diǎn)以外的另一基本組成部分:route語(yǔ)句。route語(yǔ)句把事件出口和事件入口聯(lián)系在一起,從而構(gòu)成事件體系。在這里,我們是把接觸檢測(cè)器touchbox 的事件出口isactive 連接到視點(diǎn)節(jié)點(diǎn)view2 的事件入口set_bind:route touchbox.isactive to view2.
27、set_bind 現(xiàn)在我們得到的vrml 文件是:#vrml v2.0 utf8 def view1 viewpoint 視點(diǎn)position 0 0 20 description view1 def view2 viewpoint description view2 group children def box transform translation 5 0 0 children shape appearance appearance material material diffusecolor 1 0 0 geometry box def touchbox touchsensor de
28、f sphere transform translation 0 0 0 children shape 觸感appearance appearance material material diffusecolor 0 1 0 geometry sphere def cone transform translation -5 0 0 children shape appearance appearance material material diffusecolor 0 0 1 geometry cone #end of group children route touchbox.isactiv
29、e to view2.set_bind 傳遞把這個(gè)文件調(diào)入瀏覽器,然后把鼠標(biāo)指向方塊并按下左鈕(先別松開(kāi)?。?,可以看到視點(diǎn)已經(jīng)變?yōu)関iew2, 內(nèi)部的機(jī)制我們已經(jīng)很清楚:左鈕按下時(shí)方塊節(jié)點(diǎn)的接觸檢測(cè)器被觸發(fā),接著接觸檢測(cè)器從事件出口isactive 送出一個(gè)事件“ true” , 這 個(gè) 事 件 通 過(guò) 路 由 進(jìn) 入 視 點(diǎn) 節(jié) 點(diǎn)view2 的 事 件 入 口set_bind,view2 收到“ true后成為當(dāng)前視點(diǎn),所以在我們眼前場(chǎng)景發(fā)生了變化。當(dāng)松開(kāi)鼠標(biāo)左鍵,又回到原來(lái)的視點(diǎn),稱為視點(diǎn)回跳。因?yàn)樗砷_(kāi)鼠標(biāo)左鍵后,接觸傳感器向view2 發(fā)送了“ false 事件,這樣view2 的當(dāng)前
30、地位被解除。若不想回跳,則要自己來(lái)定義。4. 利用腳本編寫(xiě)自定義行為在vrml 中,利用script 節(jié)點(diǎn)(腳本節(jié)點(diǎn))定義用戶自定義行為,所謂定義即用腳本描述語(yǔ)言(scripting language )編寫(xiě)腳本的過(guò)程。vrml97 支持的腳本描述語(yǔ)言目前有兩種:java 和emcascript (這是javascript 標(biāo)準(zhǔn)化后的名稱),關(guān)于這兩種語(yǔ)言本身,請(qǐng)參考相應(yīng)參考書(shū),vrml97 標(biāo)準(zhǔn)中定義了它們和vrml 的接口方法。應(yīng)提請(qǐng)注意的是:vrml 是基于節(jié)點(diǎn)的語(yǔ)言,所以腳本也是封裝在script 這個(gè)特殊節(jié)點(diǎn)中的。這里我們不過(guò)多討論腳本描述語(yǔ)言的細(xì)節(jié),主要討論把腳本集成到vrml 文
31、件中的方法。上面我們?cè)呀佑|檢測(cè)器touchbox 和視點(diǎn)view2 直接通過(guò)路徑連接起來(lái),現(xiàn)在要定義我們指定的行為,就需要在二者之間插入一個(gè)腳本節(jié)點(diǎn),也就是讓路徑繞個(gè)彎:route touchbox.isactive to touchscript.touchboxisactive route touchscript.bindview2 to view2.set_bind 其中的腳本節(jié)點(diǎn)touchscript 有一個(gè)事件人口touchboxisactive 和一個(gè)事件出口bind_view2, 前者接收來(lái)自接觸檢測(cè)器touchbox 的事件,然后經(jīng)自的,其它vrml 節(jié)點(diǎn)的域和事件都是固定的。
32、(2 )這里定義的事件入口touchboxisactive (即入事件)和事件出口bindview2 (即出事件)的類型都是sfbool (單值布爾型),它們與touchbox 的 事件出口isactive 和view2 的事件入口set_bind 的類型保持一致。(3 )“ url ”是腳本節(jié)點(diǎn)的一個(gè)域,可以直接包含腳本,也可以包含一個(gè)或多個(gè)用url 地址指己的腳本處理后,把結(jié)果發(fā)送給視點(diǎn)節(jié)點(diǎn)def touchscript script eventin sfbool touchboxisactive eventout sfbool bindview2 urljavescript: funct
33、ion touchboxisactive(active) 用bindview2= true; 關(guān)于這個(gè)script 節(jié)點(diǎn),請(qǐng)注意一下幾點(diǎn):(1 )它的事件入口touchboxisactive view2: 入口出口腳本與入口同名的函數(shù)被調(diào)返回到出口和事件出口bindview2 是自定義示的腳本,若有多個(gè)地址,則按照先后次序獲取第一個(gè)可得到的腳本。(4 ) 腳本是以函數(shù) (function ) 的形式給出的,函數(shù)名touchboxisactive 與事件入口的名稱相同,這是和ecmascript 語(yǔ)言的接口約定,表示相應(yīng)事件入口收到事件后調(diào)用此函數(shù)進(jìn)行處理。5. 事件流程與小結(jié)下面我們整理一下事
34、件流程:(1 ) 用戶在方塊上按下鼠標(biāo)左鍵。(2 ) 接觸檢測(cè)器發(fā)出一個(gè)“true事件。( 3 ) 此事件進(jìn)入腳本節(jié)點(diǎn)touchscript 的事件入口touchboxisactive. ( 4 ) 調(diào)用腳本函數(shù)touchboxisactive( 注意函數(shù)并沒(méi)有判斷入事件的值)。(5)函數(shù)向touchscript 的事件出口bindview2 發(fā)送一個(gè)“ true事 件( 還可以進(jìn)行其它判斷或執(zhí)行其它事件) 。(6)view2節(jié)點(diǎn)收到“ true事件,成為當(dāng)前視點(diǎn)。按照vrml約定,“認(rèn)為 上述事件是同時(shí)發(fā)生的,也就是這些事件的時(shí)間戳相同。(7)若用戶松開(kāi)鼠標(biāo)左鍵,則接觸檢測(cè)器發(fā)出一個(gè)“fal
35、se”事件,此事件同樣引起腳本函數(shù)調(diào)用并發(fā)送“true事所以view2仍然保持為當(dāng)前視點(diǎn)。本節(jié)的完整代碼是:#vrml v2.0 utf8 def view1 viewpoint position 0 0 20 description view1 def view2 viewpoint position 5 0 20 description view2 group children def box transform translation 5 0 0 children shape appearance appearance material material diffusecolor 1 0
36、 0 geometry box def touchbox touchsensor def sphere transform translation 0 0 0 children shape appearance appearance material material diffusecolor 0 1 0 geometry sphere def cone tranform transaltion -5 0 0 children shape appearance appearance material material diffusecolor 0 0 1 geometry cone #end
37、of group children def touchscript script eventin sfbool touchboxisactive eventout sfbool bindview2 url javascript : function touchboxisactive (active) bindview2 = true; route touchbox.isactive to touchscript.touchboxisactive route touchscript.bindview2 to view2.set_bind 這里所建立的虛擬境界并不復(fù)雜,但涉及到了vrml2.0 最
38、基礎(chǔ)性的功能和概念:利用檢測(cè)器產(chǎn)生事件、利用路由傳遞事件以及利用腳本編寫(xiě)自定義行為,掌握了這些內(nèi)容也就掌握了vrml2.0 的核心。在后面的幾節(jié)中,我們將探索一些專題性的有趣功能,而本節(jié)是基礎(chǔ),因而必須透徹理解。( 六)進(jìn)一步的完善與修飾1.鄰近傳感器當(dāng)用戶進(jìn)入或離開(kāi)鄰近檢測(cè)器所劃定的區(qū)域時(shí)就會(huì)觸發(fā)它。正如你在標(biāo)準(zhǔn)中可以查到的那樣,proximitysensor 節(jié)點(diǎn)定義為:proximitysensor exposedfield sfvec3f center 0 0 0 exposedfield sfvec3f size 0 0 0 exposedfield sfbool enabled t
39、rue eventout sfbool isactive eventout sfvec3f position_changed eventout sfrotation orientation_changed eventout sftime entertime eventout sftime exittime proximitysensor 節(jié)點(diǎn)共有三個(gè)外露域( exposedfield) 和五個(gè)出事件 ( eventout ).出事件我們已經(jīng)熟悉,是節(jié)點(diǎn)狀態(tài)發(fā)生改變時(shí)用來(lái)通知其它節(jié)點(diǎn)的,這里的出事件isactive 用于proximitysensor 通報(bào)自己已被激活。entertime 和ex
40、ittime 通報(bào)用戶 (代表用戶的用戶化身或指示器 ) 進(jìn)入和退出proximitysensor 檢測(cè)區(qū)的時(shí)刻。若用戶已在檢測(cè)器之內(nèi),則當(dāng)用戶的位置或方位發(fā)生變化時(shí),送出position_changed 和orientation_changed 出事件。這五個(gè)出事件聯(lián)合起來(lái),就定義了鄰近檢測(cè)器的功能。外露域則集域( field ) 、 入事件 ( eventin ) 和出事件 ( eventout ) 三者的功能于一身,也就是說(shuō),它既象域一樣描述了節(jié)點(diǎn)的當(dāng)前狀態(tài),又可以作為入事件由其它節(jié)點(diǎn)修改這種狀態(tài),并作為出事件把這種改變通知其它節(jié)點(diǎn)。這里的enabled 外露域是布爾型的,用于proxi
41、mitysensor 的啟用和停用,center 和size 定義形為長(zhǎng)方體的鄰近檢測(cè)區(qū)。我們要在方塊、球體和圓柱這三個(gè)物體構(gòu)成的靜態(tài)世界,現(xiàn)在在球體周圍增加一個(gè)鄰近檢測(cè)區(qū):def sphere transform translation 0 0 0 children shape . def comeclose proximitysensor center 0 0 0 size 4 4 4 proximitysensor 的名字為comecloser, 鄰近區(qū)的中心和球體的球心重合,形狀為正方體,邊長(zhǎng)為4 米,是球體直徑的兩倍。當(dāng)用戶走進(jìn)球體時(shí)就會(huì)觸發(fā)這個(gè)鄰近檢測(cè)器,檢測(cè)器發(fā)出isactive
42、 事件,我們把這個(gè)事件出口通過(guò)路由指向script 節(jié)點(diǎn) ( 用來(lái)綁定視點(diǎn)2 ) :def comecloserscript script eventin sfbool enterproximitysensorisactive eventout sfbool bindview2 url javascript : function enterproximitysensorisactive (active) bindview2=true; 隨 后 , 我 們 在 鄰 近 檢 測(cè) 器 的 出 事 件isactive 和 腳 本 節(jié) 點(diǎn)comecloserscript 的入事件enterproximi
43、tysensorisactive 之間建立路由,后 者 收 到 事 件后執(zhí)行 函 數(shù)enterproximitysensroisactive, 函 數(shù) 發(fā) 出bindview2 出事件,這個(gè)出事件通過(guò)路由連接到視點(diǎn)節(jié)點(diǎn)view2:route comecloser.isactive to comecloserscript.enterproximitysensorisactive route comecloserscript.bindview2 to view2.set_bind 也就是說(shuō),一旦用戶進(jìn)入鄰近區(qū),境界的當(dāng)前視點(diǎn)將轉(zhuǎn)換成view2. 這個(gè)由兩個(gè)視點(diǎn)、三個(gè)物體、一個(gè)鄰近檢測(cè)器和一個(gè)腳本節(jié)
44、點(diǎn)組成的境界的完整代碼如下:#vrml v2.0 utf8 def view1 viewpoint position 0 0 20 description view1def view2 viewpoint position 0 0 20 description view2 group children def box transform translation 5 0 0 children shape appearance appearance material material diffusecolor 1 0 0 geometry box def sphere transform tran
45、slation 0 0 0children shape appearance appearance material material diffusecolor 0 1 0 geometry sphere def comecloser proximitrysensor center 0 0 0 size 4 4 4 def cone transform translation -5 0 0 children shape appearance appearance material material diffusecolor 0 0 1geometry cone #end of group ch
46、ildren def comecloserscript script eventin sfbool enterproximitysensorisactive eventout sfbool bindview2 url javascript : function enterproximitysensorisactive(active) bindview2=true; route comecloser.isactive to comecloserscript.enterproximitysensorisactive route comecloserscript.bindview2 to view2
47、.set_bind 啟動(dòng)vrml 瀏覽器進(jìn)入境界,面向球體一直走過(guò)去,當(dāng)你剛剛感到靠近球體時(shí),會(huì)突然感到自己后退了一大步( 或者說(shuō)物體跳到前方更遠(yuǎn)的地方) ,這表明鄰近檢測(cè)器已經(jīng)檢測(cè)到你的靠近,它把這件事通知腳本節(jié)點(diǎn),腳本節(jié)點(diǎn)把視點(diǎn)view2 綁定成當(dāng)前視點(diǎn),從而使你感到視點(diǎn)突然改變。再稍稍修改一下鄰近檢測(cè)器,把它的中心位置向右移了2 米:def comecloser proximitysensor center 2 0 0 size 4 4 4 這樣你就可以從左邊(方塊那一邊)走進(jìn)球體(視點(diǎn)不跳),但不能從右邊(圓錐那一邊)走近它(視點(diǎn)跳轉(zhuǎn))??傊?,proximitysensor 能夠檢測(cè)用
48、戶是否進(jìn)入或離開(kāi)檢測(cè)器指定的空間區(qū)域,典型用法是當(dāng)用戶走進(jìn)房間時(shí)開(kāi)啟燈光,當(dāng)用戶離開(kāi)時(shí)關(guān)閉燈光,從而建立功能豐富的“智能”空間。2.連續(xù)動(dòng)畫(huà)我們已經(jīng)使用過(guò)接觸檢測(cè)器,當(dāng)我們把鼠標(biāo)指針?lè)诺椒綁K(這個(gè)幾何節(jié)點(diǎn)包含接觸檢測(cè)器)上面時(shí),指針形狀發(fā)生變化,這意味著我們已經(jīng)進(jìn)入檢測(cè)區(qū),如果按下鼠標(biāo)左鈕,則按照我們的定義,當(dāng)前視點(diǎn)會(huì)發(fā)生變化。這一節(jié)仍然制作這樣一個(gè)對(duì)接觸有反應(yīng)的方塊,只是接觸后它會(huì)連續(xù)不斷地轉(zhuǎn)動(dòng),動(dòng)畫(huà)行為可以用時(shí)間檢測(cè)器(timesensor )驅(qū)動(dòng),而不斷變化的旋轉(zhuǎn)值可用腳本節(jié)點(diǎn)或朝向插補(bǔ)器(orientationinterpolator )給出。接觸傳感器作為開(kāi)始的基本代碼是:#vrml
49、 v2.0 utf8 def cube transform rotation 1 1 1 0 children shape appearance appearance material material diffusecolor 1 0 0 geometry box def touchs touchsensor def revolver script eventin sfbool startrevolving eventout sfrotation revolve field sffloat angle 0 url javascript : function startrevolving ()
50、 revolve0=1; revolve1=1; revolve2=1; revolve3=angle; angle+=0.1; route touchs.isover to revolver.startrevolving route revolver.revolve to cube.set_rotation 其中,方塊cube 包含兩個(gè)子節(jié)點(diǎn),前者定義了它的形態(tài)(紅色的單位立方體), 后者把它定義成接觸檢測(cè)器。注意,cube 的類型是transform 節(jié)點(diǎn),它的rotation 域是外露域,指定本組相對(duì)于上層坐標(biāo)系的旋轉(zhuǎn)值,這里指定的初始值是“ 1 1 1 0 ”,其中前三個(gè)數(shù)值定義旋轉(zhuǎn)軸
51、,最后一個(gè)值定義旋轉(zhuǎn)角。由于它是外露域,因而可以通過(guò)入事件(名為set_rotation )進(jìn)行修改,下面定義的動(dòng)態(tài)行為就是這樣實(shí)現(xiàn)的。script 節(jié)點(diǎn)revolver 的核心是內(nèi)聯(lián)的ecmascript 腳本函數(shù)。它給定一個(gè)不斷變化的旋轉(zhuǎn)值。當(dāng)鼠標(biāo)指針移動(dòng)到方塊之上時(shí),接觸檢測(cè)器發(fā)出isover, 和第一節(jié)中采用的isactive 事件不同,isover 不需鼠標(biāo)左鈕按下時(shí)即可發(fā)出。isover 事件通過(guò)路由傳遞給腳本 節(jié)點(diǎn)的事件入口startrevolving, 從而啟動(dòng)函數(shù)startrevolving, 函數(shù)將一個(gè)新的旋轉(zhuǎn)值發(fā)往事件出口revolve, 這個(gè)旋轉(zhuǎn)值通過(guò)路由進(jìn)入cube
52、的外露域rotation, 修改了方塊的旋轉(zhuǎn)角,引起它的朝向變化。鼠標(biāo)指針在cube 上面的每次方位變化都引起isover 事件發(fā)送一次,從而導(dǎo)致方塊旋轉(zhuǎn)一次時(shí)間傳感器為了使方塊能夠連續(xù)旋轉(zhuǎn),需要引進(jìn)等間隔連續(xù)發(fā)送的時(shí)間序列,這正是時(shí)間檢測(cè)器的用武之地。時(shí)間檢測(cè)器隨著時(shí)間推移不斷產(chǎn)生事件,可用于多種目的,包 括:a. 驅(qū)動(dòng)連續(xù)性的仿真和動(dòng)畫(huà)b. 控制周期性的活動(dòng)( 如每分鐘一次 ) c. 初始化單獨(dú)事件,如報(bào)警鐘下面是我們要用的時(shí)間檢測(cè)器和修改后的路由關(guān)系:def ticker timesensor cleinterval 0.1 loop true enabled false route t
53、ouchs.isover to ticker.set_enabled route ticker.cycletime to revolver.startrevolving route revolver.revolve to cube.set_rotation enabled 用于啟用和停用時(shí)間檢測(cè)器,開(kāi)始時(shí)它處于停用狀態(tài),以后由接觸檢測(cè)器的isover 事件修改這一狀態(tài)。啟用的時(shí)間檢測(cè)器每隔0.1 秒送出一個(gè)cycletime 事件,并用它來(lái)觸發(fā)revolver 的startrevolving 事件,注意,cycletime 事件的類型為sftime, 而路由兩端事件的類型必須匹配,所以盡管這里
54、我們不關(guān)心這個(gè)事件表示的具體時(shí)刻,還是把revolver 的startrevolving事件類型也改為sftime. 這樣,revolver 的函數(shù)startrevolving() 就會(huì)每0.1 秒調(diào)用一次,從而驅(qū)動(dòng)方塊連續(xù)旋轉(zhuǎn)。完整的代碼是:#vrml v2.0 utf8 def cube transform rotation 1 1 1 0 children shape appearance appearance material material diffusecolor 1 0 0 geoemtry box def touchs touchsensor def revolver scr
55、ipt eventin sftime startrevolving eventout sfrotation revolve field sffloat angle 0 url vrmlscript : function startrevolving () revolve0=1; revolve1=1; revolve2=1; revolve3=angle; angle+=0.1; def ticker timesensor cycleinterval 0.1 loop true enabled false route touchs.isover to ticker.set_enabled ro
56、ute ticker.cycletime to revolver.startrevolving route revolver.revolve to cube.set_rotation 上述腳本節(jié)點(diǎn)的功能比較簡(jiǎn)單,只是不斷送出調(diào)整的旋轉(zhuǎn)值,它是關(guān)鍵幀動(dòng)畫(huà)的一種。由于關(guān)鍵幀動(dòng)畫(huà)十分常用,故vrml 專門(mén)定義了插補(bǔ)器節(jié)點(diǎn)來(lái)實(shí)現(xiàn)它。方位插值器插補(bǔ)器節(jié)點(diǎn)可認(rèn)為是vrml 內(nèi)置的腳本節(jié)點(diǎn),它們執(zhí)行簡(jiǎn)單的動(dòng)態(tài)計(jì)算,通常和時(shí)間檢測(cè)器或者能夠使對(duì)象產(chǎn)生動(dòng)作的節(jié)點(diǎn)結(jié)合在一起使用,生成線性關(guān)鍵幀動(dòng)畫(huà)。插補(bǔ)器節(jié)點(diǎn)實(shí)際上是一個(gè)由關(guān)鍵點(diǎn)和對(duì)應(yīng)關(guān)鍵值定義的分段線形函數(shù)據(jù)插值類型的不同,vrml 共定義六個(gè)插補(bǔ)器節(jié)點(diǎn):col
57、orinterpolator (顏色插補(bǔ)器)、coordinateinterpolator (坐標(biāo)插補(bǔ)器)、normalinterpolator (法線插補(bǔ)器)、orientationinterpolator (朝向插補(bǔ)器)、positioninterpolator (位置插補(bǔ)器)、scalarinterpolator (標(biāo)量插補(bǔ)器)。 所有插補(bǔ)器的域和事件都是類似的:eventin sffloat set_fruction exposedfield mffloat key . exposedfield mftype keyvalue . eventout s|mftype keyvalue_
58、changed 關(guān) 鍵 值 域keyvalue 的 類 型 決 定 了 插 補(bǔ) 器 的 類 型 ( 例 如 ,orientationinterpolator 的keyvalue 域 的 類 型 是mffloat ). 入 事 件set_fraction 接收sffloat 型的事件,插補(bǔ)器隨即根據(jù)它進(jìn)行插值,并通過(guò)出事件value_changed 送出插值結(jié)果。這里我們把時(shí)間檢測(cè)器的fraction_changed 事件作為插補(bǔ)器的輸入,這個(gè) 事件是一個(gè)0,1 區(qū)間的值,每個(gè)時(shí)間步都送出一次,表示當(dāng)前周期內(nèi)已過(guò)去的時(shí)間相對(duì)于整個(gè)周期的比例,是插補(bǔ)器常用的輸入源之一。與此對(duì)應(yīng),我們把插補(bǔ)器關(guān)鍵幀
59、的取值也定義在0,1 范圍內(nèi)。與0 和1 這兩個(gè)關(guān)鍵幀對(duì)應(yīng)的關(guān)鍵值的旋轉(zhuǎn)軸是相同的,只是旋轉(zhuǎn)角度不同(0,3.14159 ),這樣方位插補(bǔ)器輸出的旋轉(zhuǎn)值的旋轉(zhuǎn)軸固定不變,旋轉(zhuǎn)角從0 遞增到3.14159, 然后不斷重復(fù)#vrml v2.0 utf8 def cube transform rotation 1 1 1 0 children shape appearance appearance material material diffusecolor 0 1 0 geometry box def touchs touchsensor def revolver orientationinter
60、polator key 0,1 keyvalue 0.5 0.5 0.5 0,0.5 0.5 0.5 3.14159 def ticker timesensor cycleinterval 2 loop true enabled false route touchs.isover to ticker.set_enabled route ticker.fraction_changed to revolver.set_fraction route revolver.value_changed to cube.set_rotation 小結(jié):本節(jié)實(shí)現(xiàn)連續(xù)動(dòng)畫(huà),動(dòng)畫(huà)由接觸檢測(cè)器啟動(dòng),由時(shí)間檢測(cè)器驅(qū)動(dòng),動(dòng)畫(huà)本身
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 老子學(xué)院研學(xué)課程設(shè)計(jì)
- 課程設(shè)計(jì)介紹家鄉(xiāng)特色
- 年度認(rèn)證機(jī)構(gòu)戰(zhàn)略市場(chǎng)規(guī)劃報(bào)告
- 2024版培訓(xùn)勞動(dòng)合同范本
- 二零二五年度醫(yī)療設(shè)備租賃免責(zé)責(zé)任書(shū)4篇
- 2024版真石漆購(gòu)銷合同樣本3篇
- 2025年度特種貨物運(yùn)輸合同規(guī)范8篇
- 西華大學(xué)統(tǒng)計(jì)課程設(shè)計(jì)
- 2024版鍋爐工勞動(dòng)合同
- 2025年度商業(yè)大廈物業(yè)管理與客戶關(guān)系管理合同4篇
- 火災(zāi)安全教育觀后感
- 農(nóng)村自建房屋安全協(xié)議書(shū)
- 快速康復(fù)在骨科護(hù)理中的應(yīng)用
- 國(guó)民經(jīng)濟(jì)行業(yè)分類和代碼表(電子版)
- ICU患者外出檢查的護(hù)理
- 公司收購(gòu)設(shè)備合同范例
- 廣東省潮州市2023-2024學(xué)年高二上學(xué)期語(yǔ)文期末考試試卷(含答案)
- 2024年光伏發(fā)電項(xiàng)目EPC總包合同
- 子女放棄房產(chǎn)繼承協(xié)議書(shū)
- 氧化還原反應(yīng)配平專項(xiàng)訓(xùn)練
- 試卷(完整版)python考試復(fù)習(xí)題庫(kù)復(fù)習(xí)知識(shí)點(diǎn)試卷試題
評(píng)論
0/150
提交評(píng)論