「マウスセンサ」の編集履歴(バックアップ)一覧はこちら
「マウスセンサ」(2010/11/18 (木) 22:50:10) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
我々は、ChangeTransフィールドとしてctを定義している我々のルートにscrollUpとscrollDownています。
H3Dではマウス機能を備えたMouseSensorノードとインターフェースが提供されています。ここの例では、その内の4つのフィールドについて理解が必要です。
-マウス左ボタンがクリックされればTrue、そうでなければFalseを返す &italic(){&bold(){leftButton}}
-マウス左ボタンがクリックされればTrue、そうでなければFalseを返す &italic(){&bold(){rightButton}}
-上向きにホイールが動作すればイベントを送信 &italic(){&bold(){scrollUp}}
-下向きにホイールが動作すればイベントを送信 &italic(){&bold(){scrollDown}}
なお全てのフィールドについては&u(){[[H3D::MouseSensor class reference page>http://www.h3dapi.org/uploads/api/H3DAPI_20/docs/H3DAPI/html/classH3D_1_1MouseSensor.html]]}を参照してください
&bold(){学習目的}
-MouseSensorノードの利用
*&bold(){シーングラフ}
赤い球形を表示し、クリックで色の変更、ホイールの動作で透明度の変更を行う例を作成します。
<!!-- the X3D file -->
<Group>
<Group DEF="G" />
<PythonScript url="mouse.py">
<Group USE="G" containerField="references" />
</PythonScript>
</Group>
この例ではPythonを使ってシーンオブジェクトを描画するため、最小限のコードで書かれています。
<Group>に含まれるのは、Groupノードと、参照を行うPytonScriptです。後に、このスクリプトを利用して、全てのノードに参照を行います。
# mouse.py
from H3DInterface import *
root, d = createX3DNodeFromString("\
<Group> \
<NavigationInfo type=\"NONE\" /> \
<Shape> \
<Appearance> \
<Material DEF=\"M\" diffuseColor=\"1 0 0\"/> \
</Appearance> \
<Sphere radius=\"0.1\"/> \
</Shape> \
<MouseSensor DEF=\"S\" /> \
</Group>");
references.getValue()[0].addChildren.setValue( [root] )
trans = d['M'].transparency
color = d['M'].diffuseColor
mouse = d['S']
mouse.pyではcreateX3DNodeFromString関数を利用しており、まずNavigationinfoノードのタイプ(MouseSensorとShapeが含まれる)を無効にします。
createX3DNodeFromString関数では、変数rootに最上位グループのノードを、変数dには文字列内のすべての定義済みノードのハッシュへの参照を格納する。
ハッシュにはキーとしてDEFの値を使用します。
したがってd['M']とd['S']には、それぞれMaterialノードとMouseSensorノードが返ってきます。
そして、私たちが「reference」としてスクリプトに渡したGroupノードにそれを追加することによって、シーングラフにノードを追加します。
また、透明度とdiffuseColorフィールドを取得、「trans」「color」でそれらを格納し、MouseSensorを照会して「mouse」を定義します。
*&bold(){相互作用}
# mouse.py
class ChangeTrans( AutoUpdate( TypedField(SFBool, (SFBool, SFBool)) ) ):
def update( self, event ):
up, down = self.getRoutesIn()
t = trans.getValue()
if event == up and t < 1:
trans.setValue( t+0.03 )
if event == down and t > 0:
trans.setValue( t-0.03 )
return True
class ChangeColor( TypedField(SFColor, (SFBool, SFBool)) ):
def update( self, event ):
ri = self.getRoutesIn()
if ri[0].getValue():
return RGB(0, 0.8, 0.1)
if ri[1].getValue():
return RGB(0, 0.5, 0.8)
return RGB(1, 0, 0)
このスクリプトでは二つのクラスを定義しています。
ChangeTransで定義されたクラスは、球の透明度を調整します。SFBoolの2つの入力フィールドは、後でscrollUpとscrollDownにルーティングされます。
それらを「up」「down」という名で参照し、getRoutesInメソッドを使用して、入力ルートを取得します。tは球の透明度を保存します。
マウスのスクロールされた場合、イベントが送信され「up」イベントを受信したとき、透明度をsetValueメソッドを使用して、1未満増加させます。
同様に「down」イベントを受信すると、透明度をゼロ以上小さくします。
ChangeColorフィールドのクラスは、マウスのクリックイベントによって球の色を変更します。これはleftButtonとrightButtonによってルーティングされます。
updateメソッドは、色をそれぞれのイベントの値に対応させて返します。
# mouse.py
ct = ChangeTrans()
mouse.scrollUp.routeNoEvent( ct )
mouse.scrollDown.route( ct )
cc = ChangeColor()
mouse.leftButton.route( cc )
mouse.rightButton.route( cc )
cc.route( color )
ここでは適切なルートを設定する相互作用を作成します。
まずChangeTransフィールドとして定義しているctに、scrollUpとscrollDownをルーティングしています。
次に、leftButtonとrightButtonのccフィールドをルーティングすることで、マウスのクリックで色が変化するようになります。
ccフィールドはcolorにルーティングされています。
H3Dではマウス機能を備えたMouseSensorノードとインターフェースが提供されています。ここの例では、その内の4つのフィールドについて理解が必要です。
-マウス左ボタンがクリックされればTrue、そうでなければFalseを返す &italic(){&bold(){leftButton}}
-マウス左ボタンがクリックされればTrue、そうでなければFalseを返す &italic(){&bold(){rightButton}}
-上向きにホイールが動作すればイベントを送信 &italic(){&bold(){scrollUp}}
-下向きにホイールが動作すればイベントを送信 &italic(){&bold(){scrollDown}}
なお全てのフィールドについては&u(){[[H3D::MouseSensor class reference page>http://www.h3dapi.org/uploads/api/H3DAPI_20/docs/H3DAPI/html/classH3D_1_1MouseSensor.html]]}を参照してください
&bold(){学習目的}
-MouseSensorノードの利用
*&bold(){シーングラフ}
赤い球形を表示し、クリックで色の変更、ホイールの動作で透明度の変更を行う例を作成します。
<!!-- the X3D file -->
<Group>
<Group DEF="G" />
<PythonScript url="mouse.py">
<Group USE="G" containerField="references" />
</PythonScript>
</Group>
この例ではPythonを使ってシーンオブジェクトを描画するため、最小限のコードで書かれています。
<Group>に含まれるのは、Groupノードと、参照を行うPytonScriptです。後に、このスクリプトを利用して、全てのノードに参照を行います。
# mouse.py
from H3DInterface import *
root, d = createX3DNodeFromString("\
<Group> \
<NavigationInfo type=\"NONE\" /> \
<Shape> \
<Appearance> \
<Material DEF=\"M\" diffuseColor=\"1 0 0\"/> \
</Appearance> \
<Sphere radius=\"0.1\"/> \
</Shape> \
<MouseSensor DEF=\"S\" /> \
</Group>");
references.getValue()[0].addChildren.setValue( [root] )
trans = d['M'].transparency
color = d['M'].diffuseColor
mouse = d['S']
mouse.pyではcreateX3DNodeFromString関数を利用しており、まずNavigationinfoノードのタイプ(MouseSensorとShapeが含まれる)を無効にします。
createX3DNodeFromString関数では、変数rootに最上位グループのノードを、変数dには文字列内のすべての定義済みノードのハッシュへの参照を格納する。
ハッシュにはキーとしてDEFの値を使用します。
したがってd['M']とd['S']には、それぞれMaterialノードとMouseSensorノードが返ってきます。
そして、私たちが「reference」としてスクリプトに渡したGroupノードにそれを追加することによって、シーングラフにノードを追加します。
また、透明度とdiffuseColorフィールドを取得、「trans」「color」でそれらを格納し、MouseSensorを照会して「mouse」を定義します。
*&bold(){相互作用}
# mouse.py
class ChangeTrans( AutoUpdate( TypedField(SFBool, (SFBool, SFBool)) ) ):
def update( self, event ):
up, down = self.getRoutesIn()
t = trans.getValue()
if event == up and t < 1:
trans.setValue( t+0.03 )
if event == down and t > 0:
trans.setValue( t-0.03 )
return True
class ChangeColor( TypedField(SFColor, (SFBool, SFBool)) ):
def update( self, event ):
ri = self.getRoutesIn()
if ri[0].getValue():
return RGB(0, 0.8, 0.1)
if ri[1].getValue():
return RGB(0, 0.5, 0.8)
return RGB(1, 0, 0)
このスクリプトでは二つのクラスを定義しています。
ChangeTransで定義されたクラスは、球の透明度を調整します。SFBoolの2つの入力フィールドは、後でscrollUpとscrollDownにルーティングされます。
それらを「up」「down」という名で参照し、getRoutesInメソッドを使用して、入力ルートを取得します。tは球の透明度を保存します。
マウスのスクロールされた場合、イベントが送信され「up」イベントを受信したとき、透明度をsetValueメソッドを使用して、1未満増加させます。
同様に「down」イベントを受信すると、透明度をゼロ以上小さくします。
ChangeColorフィールドのクラスは、マウスのクリックイベントによって球の色を変更します。これはleftButtonとrightButtonによってルーティングされます。
updateメソッドは、色をそれぞれのイベントの値に対応させて返します。
# mouse.py
ct = ChangeTrans()
mouse.scrollUp.routeNoEvent( ct )
mouse.scrollDown.route( ct )
cc = ChangeColor()
mouse.leftButton.route( cc )
mouse.rightButton.route( cc )
cc.route( color )
ここでは適切なルートを設定する相互作用を作成します。
まずChangeTransフィールドとして定義しているctに、scrollUpとscrollDownをルーティングしています。
次に、leftButtonとrightButtonのccフィールドをルーティングすることで、マウスのクリックで色が変化するようになります。
ccフィールドはcolorにルーティングされています。