#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 }