第6章交互功能的實現(xiàn)_第1頁
第6章交互功能的實現(xiàn)_第2頁
第6章交互功能的實現(xiàn)_第3頁
第6章交互功能的實現(xiàn)_第4頁
第6章交互功能的實現(xiàn)_第5頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第六章、交互功能的實現(xiàn)對于VRML場景來說,有了動畫功能,能夠讓瀏覽者感受到一種生動、逼真的效果,但是對于瀏覽者而言,還是有不足,因為瀏覽者還是被動的接受信息。如果瀏覽者能夠控制場景,那么動畫、光照以及聲音等效果才能更逼真。實現(xiàn)用戶和場景的交互有很多的方法,最常見的是通過檢測、感知等傳感器節(jié)點的使用,使瀏覽者和虛擬對象能夠?qū)崿F(xiàn)交互的功能。傳感器可以分為兩大類,一類是接觸型的傳感器,另一類是感知型的傳感器。傳感器主要用來檢測瀏覽者在虛擬場景中的動作。所謂動作,廣義的看可以分為兩類:一類是用戶的輸入設(shè)備對于對象的操作。用戶在瀏覽場景的時候,主要輸入設(shè)備就是鼠標,這時候傳感器實際上就是檢測用戶對鼠標的各種操作動作,如鼠標單擊、指向和拖動等動作,從而對場景作出相應(yīng)的反應(yīng)。檢測這類動作的傳感器是接觸型傳感器。另一類是用戶和場景中某對象接近的程度,對象作出響應(yīng),從而在用戶和虛擬對象之間形成交互。檢測用戶和對象接近程度的傳感器是感知傳感器。描述接觸型傳感器的節(jié)點有:接觸傳感器(TouchSensor)平面移動型(PlaneSensor)球面?zhèn)鞲衅鳎⊿phereSensor)柱面?zhèn)鞲衅鳎–ylinderSensor)描述感知型傳感器的節(jié)點有:可見傳感器(VisiblitySensor)接近傳感器(ProximitySensor)碰撞傳感器(Collision)一、接觸型傳感器接觸傳感器節(jié)點TouchSensor主要用于檢測用戶基于指點設(shè)備(鼠標、操縱桿等)的動作,并將其轉(zhuǎn)換后以各種形式的事件輸出。TouchSensor節(jié)點可以作為任何編組節(jié)點的子節(jié)點使用,并感知用戶對該編組節(jié)點中所以造型的指點動作。注意,TouchSensor本身并不創(chuàng)建任何幾何造型或其他可視對象,因此如果不將該傳感器和某個與它同屬一個層次的造型節(jié)點捆綁在一起,該傳感器節(jié)點將無法發(fā)揮其應(yīng)有的作用。1、接觸傳感器TouchSensor{ enabled TRUE #SFBool hitNormal_changed eventOut #SFVec3f hitPoint_changed eventOut #SFVec3f hitTexCoord_changed eventOut #SFVec2f isActive eventOut #SFBool isOver eventOut #SFBool touchTime eventOut #SFTime}enabled:表明是否激活該傳感器,為TRUE,表示激活,能夠?qū)χ更c輸入設(shè)備的動作作出反應(yīng)并產(chǎn)生各種事件輸出。isOver:指點設(shè)備當前是否正位于對象上,當在對象上,引發(fā)該事件,事件值為TRUE;當離開對象時,也引發(fā)該事件,事件值為FALSE。isActive:指點設(shè)備是否點擊對象,當設(shè)備為點擊狀態(tài)時,引發(fā)該事件,事件值為TRUE;當釋放設(shè)備點擊狀態(tài)后,也引發(fā)該事件,事件值為FALSE。touchTime:當指點設(shè)備點擊并釋放后,即isOver為TRUE且isActive為FALSE時,引發(fā)該事件,事件值是釋放指點設(shè)備時的系統(tǒng)時間。當指點設(shè)備選取對象并點擊設(shè)備時,即isOver為TRUE且isActive為TRUE時,TouchSensor會進一步跟蹤以下三個事件:hitPoint_changed:輸出指定點的位置坐標;hitNormal_changed:輸出指定點的法向量;hitTexCoord_changed:指定點的造型表面的紋理坐標。例6-1,6-22、平面移動型傳感器平面移動型傳感器(PlainSensor)節(jié)點檢測輸入指點設(shè)備拖動對象的動作,對象在XY平面移動,但是其方位并不發(fā)生變化。PlaneSensor{

minPosition 00 #SFVec2f maxPosition -1-1 #SFVec2f enabled TRUE #SFBool offset 000 #SFVec3f autoOffset TRUE #SFBool isActive eventOut #SFBool trackPoint_changed eventOut #SFVector3f translation_changed eventOut #SFVector3f}minPosition、maxPosition:設(shè)置對象被指點設(shè)備移動時在x軸和y軸方向上的最小和最大平移位置。minPosition的默認值為x=0,y=0;maxPosition的默認值為x=-1,y=-1。如果minPosition域中的x或者y大于maxPosition域中相應(yīng)分量,則對象的移動將不會受到限制;如果minPosition域中的x或者y等于maxPosition域中相應(yīng)分量,則對象將只在一維方向上運動。enabled:傳感器是否響應(yīng)指點設(shè)備的動作,為TRUE表示傳感器打開,F(xiàn)ALSE表示關(guān)閉。offset:對象被移動后相對于初始點的最遠位置autoOffset:指明對象被移動后,再次移動對象時開始的位置。為TRUE,則每次移動對象后,對象會停留在新位置,若開始下一次移動,則視前一次移動的終點位置為其初始位置而開始新的移動。為FALSE,則每一次新的移動開始之前,對象自動先復位到原始位置。isActive:指點設(shè)備點擊時引發(fā)該事件。trackPoint_changed:對象移動后引發(fā),事件值是XY平面上點擊點的坐標位置。該事件忽略minPosition和maxPosition的限制。translation_changed:對象移動過程中鼠標在XY平面上的暫時位置,這個事件要受minPosition和maxPosition的限制。例6-3,6-43、球面?zhèn)鞲衅髑蛎鎮(zhèn)鞲衅鳎⊿phereSensor)用來檢測用戶操縱指點設(shè)備的動作,并將該動作轉(zhuǎn)換成對象在圍繞某一點為中心的一個球體表面上所產(chǎn)生的旋轉(zhuǎn),使瀏覽者像是在一個轉(zhuǎn)動的球體上進行觀察,該中心點為SphereSensor節(jié)點所在坐標系的原點。SphereSensor{ enabled TRUE #SFBool offset 0.01.0000.0 #SFRotation autoOffset TRUE #SFBool isActive eventOut #SFBool trackPoint_changed eventOut #SFVector3f rotation_changed eventOut #SFRotation}

enabled:設(shè)置場景中是否激活該球面?zhèn)鞲衅?。offset:設(shè)置對象被指點設(shè)備初始觸發(fā)時的缺省旋轉(zhuǎn)量,前三個分量(x、y、z)確定一個點,當前坐標系的原點與該點的連線為旋轉(zhuǎn)軸,第四個分量為旋轉(zhuǎn)角度。缺省值為(0.01.00.00.0)。autoOffset:是否在旋轉(zhuǎn)中自動記憶上次旋轉(zhuǎn)的終點朝向。為TRUE,自動記憶。isActive:指點設(shè)備是否點擊對象,當設(shè)備為點擊狀態(tài)時,引發(fā)該事件,事件值為TRUE;當釋放設(shè)備點擊狀態(tài)后,也引發(fā)該事件,事件值為FALSE。用戶在瀏覽器窗口移動指點設(shè)備到對象上并單擊,將在單擊位置建立一個虛擬的空間球體表面,并且將當前空間坐標系的原點作為該球體的球心,將單擊點與原點之間的距離作為球體的半徑。對象將在這個軌跡球體表面上隨指點設(shè)備產(chǎn)生旋轉(zhuǎn)。trackPoint_changed:指點設(shè)備單擊對象后引發(fā)該事件,事件值是球體表面上當前單擊點的坐標位置。rotation_changed:指點設(shè)備在對象上、單擊、或拖動引發(fā)該事件,事件值是球體表面上當前對象旋轉(zhuǎn)的空間角度。注意:球面?zhèn)鞲衅髟诩せ顮顟B(tài)下,其他指點設(shè)備傳感器將失效,不產(chǎn)生任何輸出事件。例6-5,7-304、柱面?zhèn)鞲衅髦鎮(zhèn)鞲衅鳎–ylinderSensor)用來檢測用戶操縱指點設(shè)備的動作,并將該動作轉(zhuǎn)換成對象在圍繞某根軸為旋轉(zhuǎn)軸的一個柱面上所產(chǎn)生的旋轉(zhuǎn),使瀏覽者像是在圍繞著一根軸旋轉(zhuǎn)的圓柱體上進行觀察,該旋轉(zhuǎn)軸為CylinderSensor節(jié)點所在坐標系的y軸。CylinderSensor{ enabled TRUE #SFBool offset 0.0 #SFFloat autoOffset TRUE #SFBool minAngle 0.0 #SFFloat maxAngle -1.0 #SFFloat diskAngle 0.262 #SFFloat isActive eventOut #SFBool trackPoint_changed eventOut #SFVector3f rotation_changed eventOut #SFRotation}enabled:設(shè)置場景中是否激活該柱面?zhèn)鞲衅?。offset:設(shè)置對象被指點設(shè)備初始觸發(fā)時的缺省旋轉(zhuǎn)量,該域為一個旋轉(zhuǎn)角度。缺省值0.0。autoOffset:是否在旋轉(zhuǎn)中自動記憶上次旋轉(zhuǎn)的終點朝向。為TRUE,自動記憶。minAngle、maxAngle:設(shè)置對象被指點設(shè)備移動時最小和最大的旋轉(zhuǎn)角度。若minAngle大于maxAngle,則旋轉(zhuǎn)無限制。diskAngle:設(shè)置柱面?zhèn)鞲衅髟趫A盤行為和圓柱行為之間的切換角度。該域值決定對象的動作是像一個圓盤還是像一個圓柱在繞y軸旋轉(zhuǎn)。缺省值0.262。注意:當用戶移動指點設(shè)備到對象上并單擊,瀏覽器將產(chǎn)生一個繞當前y軸旋轉(zhuǎn)的虛擬圓柱,該圓柱底面和側(cè)面之間的大小關(guān)系有diskAngle域值確定。可以把diskAngle域看做是一個虛擬圓柱體內(nèi)部包含的圓錐的頂角,該圓錐的底面圓盤即為所在圓柱的頂面。如果用戶選取圓柱體的頂或底面,則拖曳動作被解釋為對象繞一個平面圓盤所發(fā)生的旋轉(zhuǎn);如果用戶選取圓柱體的側(cè)面部分,則拖曳動作被解釋為對象繞一個圓柱所發(fā)生的旋轉(zhuǎn)。isActive:指點設(shè)備是否點擊對象,當設(shè)備為點擊狀態(tài)時,引發(fā)該事件,事件值為TRUE;當釋放設(shè)備點擊狀態(tài)后,也引發(fā)該事件,事件值為FALSE。trackPoint_changed:指點設(shè)備單擊對象后引發(fā)該事件,事件值是圓柱體表面上當前單擊點的坐標位置。rotation_changed:指點設(shè)備在對象上、單擊、或拖動引發(fā)該事件,事件值是圓柱體表面上當前對象旋轉(zhuǎn)的空間角度。例6-6二、感知型傳感器可視傳感器VisibleSensor節(jié)點用來從瀏覽者所在方位感知一個立方體區(qū)域在當前場景中何時可見、何時不可見,并產(chǎn)生多種輸出事件。VisibleSensor{

enabled TRUE #SFBool

center 0.00.00.0 #SFVec3f

size 0.00.00.0 #SFVec3f

isActive eventOut #SFBool

enterTime eventOut #SFTime

exitTime eventOut #SFTime}1、可視傳感器enabled:設(shè)置場景中是否激活可視傳感器。center:設(shè)置當前局部坐標系中一個被感知區(qū)域的中心點的三維坐標,缺省值為原點。size:設(shè)置當前局部坐標系中一個被感知區(qū)域的大小,缺省值為原點一個點的區(qū)域。注意:當size為(0.00.00.0)時,可視傳感器將不產(chǎn)生任何事件輸出。功能上相當于將其enabled域的值設(shè)置為FALSE。enterTime:輸出用戶由不可見區(qū)域到可見被感知區(qū)域的時間。exitTime:輸出用戶由可見區(qū)域到不可見被感知區(qū)域的時間。isActive:指示用戶視場中是否可見該節(jié)點所設(shè)置的被感知區(qū)域。若用戶可見該被感知立方體區(qū)域,則isActive產(chǎn)生輸出事件,且事件值為TRUE;若用戶不可見該被感知立方體區(qū)域,則isActive產(chǎn)生輸出事件,且事件值為FALSE。例6-72、接近傳感器接近感知器ProximitySensor節(jié)點,也稱親近度傳感器節(jié)點,這個節(jié)點也設(shè)定了一個長方體區(qū)域,用來感知用戶何時進入、退出和移動于這個區(qū)域。檢測這個對象的接近程度,與預(yù)先設(shè)定檢測數(shù)據(jù)比較,滿足條件的時候輸出事件,從而控制對象的行為。ProximitySensor{

enabled TRUE #SFBool

center 0.00.00.0 #SFVec3f

size 0.00.00.0 #SFVec3f

isActive eventOut #SFBool position_changed eventOut #SFBool orientation_changed eventOut #SFRotation

enterTime eventOut #SFTime

exitTime eventOut #SFTime}enabled:設(shè)置場景中是否激活接近傳感器。center:檢測區(qū)域的中心,默認值為原點。size:檢測區(qū)域的大小。isActive:TRUE表示瀏覽者是否進入檢測區(qū)域,F(xiàn)ALSE表示瀏覽者是否離開檢測區(qū)域。position_changed:瀏覽者當前的位置,隨著瀏覽者進入或在檢測區(qū)域里移動而隨時修改。orientation_changed:瀏覽者當前的朝向,隨著瀏覽者進入或在檢測區(qū)域里移動而隨時修改。enterTime:輸出瀏覽者進入檢測區(qū)域的時間。exitTime:輸出瀏覽者離開檢測區(qū)域的時間。例6-83、碰撞傳感器碰撞傳感器Collsion節(jié)點用來檢測何時瀏覽者和虛擬空間中造型發(fā)生碰撞。該節(jié)點是一個群節(jié)點,它類似Group節(jié)點,可以有多個子節(jié)點在Children域中,但它又具有傳感器節(jié)點的特性。碰撞傳感器節(jié)點的功能是使瀏覽者看到虛擬空間物體與造型之間發(fā)生碰撞的現(xiàn)象。

Collision{ children [] #MFNode collide TRUE #SFBool proxy NULL #SFNode bboxcenter 0.00.00.0 #SFVec3f bboxSize -1.0-1.0-1.0 #SFVec3f collideTime eventOut #SFTime addChildren eventIn #MFNode removeChildren eventIn #MFNode}children:設(shè)置進行碰撞檢測的子節(jié)點列表。collide:表示碰撞檢測是否有效。proxy:域值為一“代理”,定義了一個可選造型,用來取代children域中的對象進行碰撞檢測bboxCenter:包圍Collision節(jié)點的所有子節(jié)點的包圍盒的中心。其默認值為(0,0,0)。bboxSize:包圍Collision節(jié)點的所有子節(jié)點的包圍盒在x、y、z方向上的尺寸,其默認值為(-1,-1,-1)。addChildren:用于增加一個特別的子節(jié)點到Collision節(jié)點的子節(jié)點列表中。removeChildren:用于刪除Collision節(jié)點的子節(jié)點列表中某個節(jié)點。collideTime:發(fā)送檢測到的碰撞發(fā)生的時間。例6-9三、Script腳本節(jié)點Script腳本節(jié)點可以描述一些由用戶自定義制作的檢測器和插補器,能接受事件,對其處理,并輸出處理后和結(jié)果。該節(jié)點又定義了一個包含程序腳本節(jié)點的域、事件出口和事件入口及描述用戶自定義制作的檢測器和插補器所做的事情。Script節(jié)點可以出現(xiàn)在文件的頂層或作為成組節(jié)點的子節(jié)點。Script{ url [] #MFString directOutput FALSE #SFBool mustEvaluate FALSE #SFBool #anynumbero

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論