程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> X3D實戰基礎講座之十一

X3D實戰基礎講座之十一

編輯:關於JAVA

我們知道,對於Visual C++而言,交互的實現是通過消息映射來進行的。同樣,X3D的交互實現也是通過類似的映射機制。用戶事件的產生是通過相應的傳感器產生的,而ROUTE語句就是相當於事件的映射,它映射到另一個輸入事件中。

X3D中,用戶事件的傳感器有:KeySensor(鍵盤傳感器) 、StringSensor(字符串傳感器)、TouchSensor(觸摸傳感器)、PlaneSensor(平移傳感器) 、SphereSensor(繞點旋轉感器)和CylinderSensor(Y軸旋轉傳感器)等。由於BS浏覽插件對X3D新增的KeySensor和StringSensor節點的支持不夠好,故這裡暫不討論。

一、TouchSensor(觸摸傳感器)節點

TouchSensor(觸摸傳感器)節點產生基於定點輸入設備(通常是鼠標)的事件。這些事件表明用戶是否正在點選某個幾何體和用戶在什麼地方,以及在什麼時候按了定點設備的鍵。它的主要域或事件有:

description -- 這個節點功能的文字提示。

enabled -- 設置傳感器節點是否有效。默認值為True。

isActive -- 當點擊或移動鼠標(指點設備時)發送事件。按下鼠標主鍵時isActive=True, 放開時

isActive=False。

isOver -- 當指點設備移動過傳感器表面時發送事件。

hitPoint_changed -- 事件輸出在子節點局部坐標系統點擊點的定位。

hitNormal_changed -- 事件輸出了點擊點的表面的法線向量。

hitTexCoord_changed -- 事件輸出了點擊點的表面的紋理坐標。

touchTime -- 當傳感器被指點設備點擊時產生時間事件。

需要說明的是:

(1) 若定點設備未指向傳感器的兄弟幾何體,而用戶開始將定點設備移到傳感器的兄弟幾何體時,傳感器將產生一個isOver事件,並將其值設置為True;相反,若定點設備已經指向傳感器的兄弟幾何體,此時用戶將定點設備移出傳感器的兄弟幾何體,傳感器將產生一個isOver事件,並將其值設置為False。

(2) 當用戶將定點設備從幾何體的一點移動到另一點時,傳感器將發送一系列事件: hitPoint_changed、hitNormal_changed、hitTexCoord_changed,分別表明用戶所指的位置、該點的法向量和紋理坐標。

(3) 當用戶點擊被TouchSensor監視的對象時,傳感器將產生值為True的isActive事件;而當用戶釋放定點設備的鍵時,傳感器將產生isActive為False的事件。

(4) 若用戶在指向幾何體時按下鼠標鍵,然後在仍然指向這個幾何體(或又回到這個幾何體)時釋放鼠標鍵,傳感器將要發送一個touchTime事件,表明鍵被釋放的時間。可以使用這一事件來模擬許多常用的用戶接口(如只有在用戶點擊和釋放定點設備按鍵時才產生的動作)。

下面舉兩個例子來說明:

示例1:當鼠標處在立方體的時候,就會有一個小球跟隨鼠標移動。

示例代碼如下:

示例的結果如下圖所示:

說明:需要將觸摸傳感器節點和要觸摸的形體節點放在同一個父節點處。

示例2:當單擊中間小球時,將打開點光源,照亮周圍的兩個球。

示例代碼如下:

示例的結果如下圖所示:

二、PlaneSensor(平移傳感器)節點

PlaneSensor 傳感器節點用於指點設備在平行於Z=0平面上的動作,只要用戶點按、拖動該傳感器的兄弟幾何體,此節點均將拖動(如用戶使用鼠標進行的拖動)解釋為在傳感器的局部xy平面上的變換。其主要域或事件如下:

description -- 這個節點功能的文字提示。

enabled -- 設置傳感器節點是否有效。默認值為True。

minPosition -- 在xy平面內限制當前點向上和向右的translation事件。

maxPosition -- 在xy平面內限制當前點向下和向左的translation事件。

offset -- 該域指出相關幾何體被移動後相對於初始點的位置。

autoOffset -- 指示是否在拖動結束時將當前位置保存在offset中來實現在兩次拖動之間跟蹤當前位置(True表示跟蹤)。若autoOffset值為False,則用戶每次開始新一輪拖動時,被拖動的幾何體都自動先復位到初始位置。

isActive -- 指示定點設備當前按鈕是否按下。此事件僅當按鈕被按下或釋放時才發出,拖動期間則不生成。

isOver -- 當指點設備移動過傳感器表面時發送事件。

trackPoint_changed -- 拖動期間任何給定時刻用戶的定點設備在xy平面上的實際點(忽略 minPosition和 maxPosition)。

translation_changed -- 拖動期間任何給定時刻用戶的定點設備在xy平面上的鎖定點(受限於minPosition和 maxPosition)。

示例如下:

結果如下:

說明:當拖動小立方體的時候,無論如何也出不了白色的矩形框。

三、SphereSensor(繞點旋轉感器)節點

SphereSensor節點將二維的拖動解釋為三維空間中繞局部原點的旋轉。若在該節點的兄弟幾何體處按下鼠標,浏覽器會以點擊鼠標的點到原點的距離為半徑作一個想象中的球。隨後的拖動將解釋為旋轉球體。它的主要域或事件如下:

description -- 這個節點功能的文字提示。

enabled -- 設置傳感器節點是否有效。默認值為True。

offset -- 在一次拖動後,相關幾何體相對於初始位置的旋轉角度。

autoOffset -- 設置為True,表示在拖動結束時,將當前的方位值存儲到offset中,若autoOffset設置為False,在用戶每次開始一個新的托動時,幾何體復位到初始值。

isActive -- 當點擊或移動鼠標(指點設備時)發送事件。按下鼠標主鍵時isActive=True, 放開時isActive=False。

isOver -- 當指點設備移動過傳感器表面時發送事件。

trackPoint_changed -- 用戶在拖動過程中任意時刻定點設備在假想的球體表面上的實際位置。

rotation_changed -- 用戶在拖動過程中任意時刻假想球體的當前朝向。

示例如下:

結果如下:

四、CylinderSensor(Y軸旋轉傳感器)節點

CylinderSensor節點把二維的拖曳輸入(如拖曳鼠標)轉變為三維空間中沿y軸的旋轉。其主要域或事件如下:

description -- 這個節點功能的文字提示。

enabled -- 設置傳感器節點是否有效。默認值為True。

minAngle -- 允許旋轉的最小角度(旋轉角小於此范圍時,仍被限制在這一范圍內)。

maxAngle -- 允許旋轉的最大角度(旋轉角大於此范圍時,仍被限鉗制在這一范圍內)。

diskAngle -- 決定節點動作是像一個圓柱或像磁碟繞y軸旋轉。若用戶在圓柱軸附近點擊,傳感器的兄弟幾何體的動作像磁碟轉動,否則像圓柱一樣轉動。

offset -- 指出從初始方向轉動的角度值。

autoOffset -- 指出是否在每次拖動完成後將當前的方向角存入offset域,以達到跟蹤當前方位的目的。如果autoOffset是False,每當用戶開始一個新的拖動動時,被拖動幾何體恢復至最初的方位。

isActive -- 當點擊或移動鼠標(指點設備時)發送事件。按下鼠標主鍵時isActive=True, 放開時isActive=False。

isOver -- 當指點設備移動過傳感器表面時發送事件。

說明:

如果用戶點中圓柱的頂或低面,拖曳動作就會被解釋為和旋轉一個平面圓盤一樣。如果用戶點中圓柱的側面部分,拖曳動作就會被解釋為旋轉這個圓柱。如果僅僅對特殊的旋轉范圍有興趣,可以通過設置minAngle和maxAngle的值把旋轉限制在那一范圍內。如果minAngle大於maxAngle,就沒有任何限制了。

在上述代碼中,只要將SphereSensor節點改成CylinderSensor節點就可以了,因此這裡不再舉例。

除了上述傳感器外,X3D還有VisibilitySensor、ProximitySensor等感知傳感器,這裡不再介紹。在下一講中,我們將討論X3D的嵌入腳本編程技術。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved