マウスセンサ


※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

H3Dではマウス機能を備えたMouseSensorノードとインターフェースが提供されています。ここの例では、その内の4つのフィールドについて理解が必要です。
  • マウス左ボタンがクリックされればTrue、そうでなければFalseを返す   leftButton
  • マウス左ボタンがクリックされればTrue、そうでなければFalseを返す   rightButton
  • 上向きにホイールが動作すればイベントを送信   scrollUp
  • 下向きにホイールが動作すればイベントを送信   scrollDown
なお全てのフィールドについてはH3D::MouseSensor class reference pageを参照してください

学習目的
  • MouseSensorノードの利用

シーングラフ

赤い球形を表示し、クリックで色の変更、ホイールの動作で透明度の変更を行う例を作成します。

<!!-- 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」を定義します。

相互作用

# 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にルーティングされています。