VRMLとJavaの組み合わせその1

前回、VRMLのみでのアニメーションを行いましたが、
VRMLだけでは、どうしても、ループ、もしくは1回のみの動きしかできないため、

・止めた位置アニメーションを再開する
・多段スイッチを駆使したアニメーションは難しい

等が上げられます。
そこで今回はJavaもつかってみたいと思います。
今回はJavaの知識も必要になるので、ちょっと難しいですが見てみましょう。

・機能の説明

機能としては、簡単ですが、通常ボタンを押してない状態の時は扉を開かず、
ボタンを押したときのみ指定した範囲に視点が入ると、扉が開く仕組みです。
また、扉は一定時間たつか範囲外に出ると自動的に閉まります。
 

これが、視点の最初の位置です
ボタンを押さない(白い状態)ときは、
近づいても何も反応しません
(Javaで制御しています)
ボタンを押した場合は、ボタンが赤くなり
(Javaで制御しています)
近づくと扉が開く(Javaで制御しています)
 
 
このような感じで、動きます。
そうしたら、一部Javaファイルを見てみましょう
(変数設定等はソースを見てください)
動作的には凄く単純な構造で、2つのスイッチが反応したときのみ
動作するようにしてあります。
ただ、こんな単純なことですがVRMLだけでは出来ないのです
 
//☆if分の中の意味は、VRMLから””で囲まれた
// メッセージがわたされた場合以下の処理を
// しろという意味です

//タッチセンサーが反応した
//(ボタンが押された)とき
//ボタンを赤色に変更するようにVRMLの送信する
if(e.getName().equals("touched") == true)
{

onOff = true;
newColor.setValue(red);

}

//範囲指定エリアに視点が移動したとき
else if(e.getName().equals("enterArea")
 == true)
{

 // ボタンが押されているか?
 if(onOff == true){

  //押されていた場合、ボタンを赤から
  //白にして扉を開くようにVRMLに送信する
  onOff = false;
  openDoor.setValue
   (((ConstSFTime)e.getValue())
   .getValue());
  newColor.setValue(white);
  sw = true;
 }
}

//エリア外に出たとき
else if(e.getName().equals("exitArea")
  == true)
{

 //ボタンが押されていた場合扉を閉じる
  if(sw == true){
  closeDoor.setValue
    (((ConstSFTime)e.getValue()).getValue());
  sw = false;
 }
}
基本的に、bool型の変数をJava内部で
駆使して、VRMLでは別々であった
スイッチを連結させています。

スイッチを押して扉を開くだけの
処理はVRMLだけでも出来ますが、

スイッチが押されてから色が変わり
そしてかつ、範囲指定の中に
視点が入ったら扉を開く
もしくは、扉が開いていたときのみ
範囲外に移動したとき扉を閉める

という処理は、JavaかJavaScript
を使わないと、実現できません
 

では以下にソースとwrlファイルをおきますので、見てください。
今回ソースをlzhで起きましたのでやってみたい方は落としてください。
lzhファイルを解凍するとvrmlというフォルダが作られますが、
これはJavaからVRMLを制御するのに必要なものなので、ソースファイルと同じ
ディレクトリにそのまま置いてjavaのコンパイルをしてください。
 
  ソース1 ソース2 表示 全ソースの
圧縮ファイル
VRML+Javaによる
簡易エレベータの
ドアの実現
doordemo.txt
AutomaticDoor.java
doordemo.wrl
door.lzh



戻る