Box Chaser

#VRML V2.0 utf8

PROTO BoxChaser [
		 field SFVec3f position 0 0 0
		 field SFVec3f goal 0 0 0
		 field SFFloat speed 1
		 eventIn SFVec3f set_goal
		]
{
   Group {
      children [
	 DEF MOVEME Transform {
	    translation IS position
	    children Shape {
	       appearance Appearance { material Material {} }
	       geometry Box { size .5 .5 .5 }
	    }
	 }

	 DEF HEART TimeSensor { loop TRUE }

	 # update direction and position when receive "heartbeats"
	 DEF SCRIPT Script {
	    eventIn SFTime beat
	    eventIn SFVec3f set_goal IS set_goal
	    eventOut SFVec3f position_changed
	    field SFVec3f direction 0 0 1
	    field SFVec3f position IS position
	    field SFVec3f goal IS goal
	    field SFFloat speed IS speed
	    field SFTime lastBeat 0
	    field SFBool first TRUE
	    url "vrmlscript:

function set_goal(val) {
   goal = val;
   direction = goal.subtract(position).normalize();
}

function beat(val) {
   if(first) { first = FALSE; }  // initialize lastBeat
   else {
      timeElapsed = val - lastBeat;
      direction = goal.subtract(position).normalize();
      position = position.add(direction.multiply(speed*timeElapsed));
      position_changed = position;
   }
   lastBeat = val;
}

"
	 }
	]
   }

   ROUTE HEART.time TO SCRIPT.beat
   ROUTE SCRIPT.position_changed TO MOVEME.translation
}


mrl