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