import vrml.*; import vrml.node.*; import vrml.field.*; public class mobile extends Script { private SFString node_name; private SFRotation current_rotation; private SFRotation rotation_changed; private SFBool running; private SFRotation dialrot; private float oldfrac = 0.0f; private float lastrot = 0.0f; private float vel; private float decel; private float threshold; public void initialize() { node_name = (SFString) getField("nodename"); current_rotation = (SFRotation) getField("currentRotation"); rotation_changed = (SFRotation) getEventOut("rotation_changed"); dialrot = (SFRotation) getEventOut("dialrot"); running = (SFBool) getField("running"); vel = ((SFFloat) getField("velocity")).getValue(); decel = ((SFFloat) getField("decel")).getValue(); threshold = ((SFFloat) getField("decel")).getValue(); } public void processEvent(Event e) { String EventName = e.getName(); if (EventName.equals("set_fraction")) set_fraction(((ConstSFFloat)e.getValue()).getValue()); if (EventName.equals("spinning")) spin((ConstSFRotation) e.getValue()); } private void spin(ConstSFRotation angle) { float temp[] = new float[4]; angle.getValue(temp); vel = temp[3] / 3.7f; if (vel < 0) decel = -((SFFloat) getField("decel")).getValue(); else decel = ((SFFloat) getField("decel")).getValue(); } private void set_fraction(float frac) { if (vel != 0) { float dTime; if (frac > oldfrac) dTime = frac - oldfrac; else dTime = (1.0f - oldfrac) + frac; oldfrac = frac; lastrot += (vel * dTime) - (decel * dTime * dTime / 2); vel -= decel * dTime; if (Math.abs(vel) < threshold) { vel = 0; dialrot.setValue(0, 1, 0, 0); } rotation_changed.setValue(0, 1, 0, lastrot); } else oldfrac = frac; } }