#VRML V2.0 utf8 # #エレベータの開閉式のドアのサンプル # #視点位置の設定 Viewpoint { position 0.9 1 5 } #背景の設定 Background{ skyColor 0.2 0.2 0.7 } SpotLight{ color 1 1 1 } #開くドア(左) # Transform{ translation 0 0 0 children [ DEF DOOR Transform{ children[ DEF DOORA Shape{ appearance Appearance{ material DEF setei_1 Material{ diffuseColor 0.7 0.7 0.7 } } geometry IndexedFaceSet{ coord Coordinate{ point [ 0 0 0 , 1 0 0 , 1 2 0 , 0 2 0 , ] } coordIndex [ 0 1 2 3 -1, ] solid FALSE } } ] }, #ここで指定した範囲の位置に視点が入ったらドアを開く #この場合はこの物体から x軸:7m y軸2m z軸6m の範囲に #入ったら発動 DEF PROX_SENSOR1 ProximitySensor{ size 7 2 6 } ] } #開くドア(右) # Transform{ translation 2.01 0 0 rotation 0 1 0 3.14 children [ USE DOOR ] } #壁(左) # DEF WALL Transform{ translation -2.01 1 -0.05 children [ Shape{ appearance Appearance{ material DEF setei_2 Material{ diffuseColor 0.5 0.5 0.5 } } geometry Box{ size 4 2 0.25 } } ] } #壁(右) # Transform{ translation 6.02 0 0 rotation 5 0 0 0 children [ USE WALL ] } #ボタン # Transform{ translation 0 -0.2 0 children [ Shape{ appearance Appearance{ material DEF setei_3 Material{ diffuseColor 1 1 1 } } geometry IndexedFaceSet{ coord DEF suichi Coordinate{ point [ 2.15 1.25 0.2 , 2.3 1.25 0.2 , 2.3 1.4 0.2 , 2.15 1.4 0.2 , ] } coordIndex [ 0 1 2 3 -1, ] solid FALSE } }, #マウスを左クリックしたらセンサ発動 DEF TS TouchSensor{} ] } #タイムセンサー設定 DEF DOOR_OPEN_TIME1 TimeSensor{ cycleInterval 8 } #場所移動の設定 DEF DOOR_OPEN_INTP1 PositionInterpolator{ key[0,0.015,, 0.4, 0.65, 1] keyValue[0 0 0, -0.05 0 0, -1.0 0 0, -1.0 0 0, 0 0 0] } #スクリプト呼び出し(今回はJava) DEF ColorScript Script{ # Javaのクラスファイル呼び出し url "AutomaticDoor.class" #タッチセンサーが反応したらJavaを呼び出す eventIn SFTime touched #Javaから帰ってくる値を受けとる eventOut SFColor newColor #範囲位置に視点が移動してセンサーが発動したらJavaを呼び出す eventIn SFTime enterArea #Javaから帰ってくる値を受けとる eventOut SFTime openDoor } #ルート制御 #タッチセンサーが反応したらScriptノードに渡す ROUTE TS.touchTime TO ColorScript.touched #スクリプトノードからの返値を、物体に適応する。 ROUTE ColorScript.newColor TO setei_3.set_diffuseColor #範囲指定の中に視点が移動したらScriptノードに渡す ROUTE PROX_SENSOR1.enterTime TO ColorScript.enterArea #スクリプトノードからの返値で、タイマーセンサーは発動 ROUTE ColorScript.openDoor TO DOOR_OPEN_TIME1.set_startTime #タイマーイベントが発動したら、物体移動の値をセットする ROUTE DOOR_OPEN_TIME1.fraction_changed TO DOOR_OPEN_INTP1.set_fraction #物体移動の値がセットされたら物体の変更を実行する ROUTE DOOR_OPEN_INTP1.value_changed TO DOOR.set_translation