import java.awt.AWTEvent; import java.awt.Dimension; import java.awt.event.MouseEvent; import java.util.Enumeration; import javax.media.j3d.*; import javax.vecmath.*; public class FreeViewBehavior extends Behavior { private TransformGroup target; private WakeupCondition mouseCriterion; private long lastTime,stopCounter; private Point3d position; private double tx,ty; private double speed; private double mouseX,mouseY; private boolean mouseButton; private boolean inversion; public FreeViewBehavior(TransformGroup target) { this.target=target; position=new Point3d(0.0,5.0,5.0*Math.sqrt(3.0)); tx=-Math.PI/6.0; ty=0.0; } public void initialize() { WakeupCriterion[] events; events=new WakeupCriterion[7]; events[0]=new WakeupOnElapsedFrames(0); events[1]=new WakeupOnAWTEvent(MouseEvent.MOUSE_PRESSED); events[2]=new WakeupOnAWTEvent(MouseEvent.MOUSE_RELEASED); events[3]=new WakeupOnAWTEvent(MouseEvent.MOUSE_MOVED); events[4]=new WakeupOnAWTEvent(MouseEvent.MOUSE_DRAGGED); events[5]=new WakeupOnAWTEvent(MouseEvent.MOUSE_ENTERED); events[6]=new WakeupOnAWTEvent(MouseEvent.MOUSE_EXITED); mouseCriterion=new WakeupOr(events); mouseX=0; mouseY=0; mouseButton=false; inversion =false; lastTime=0; stopCounter=-1; wakeupOn(mouseCriterion); } public void processStimulus(Enumeration criteria) { WakeupCriterion criterion; AWTEvent[] events; while (criteria.hasMoreElements()) { criterion=(WakeupCriterion)(criteria.nextElement()); if (criterion instanceof WakeupOnElapsedFrames) { process((WakeupOnElapsedFrames)(criterion)); } else if (criterion instanceof WakeupOnAWTEvent) { events=((WakeupOnAWTEvent)(criterion)).getAWTEvent(); for (int i=0;i=0) { stopCounter+=delay; if (stopCounter>1000) { mouseX=0; mouseY=0; } } move(delay); setTransform(); } private void processMouseEvent(MouseEvent event) { Dimension size; if (event.getID()==MouseEvent.MOUSE_PRESSED) { mouseButton=true; inversion=((event.getModifiers() & MouseEvent.BUTTON3_MASK)!=0); } else if (event.getID()==MouseEvent.MOUSE_RELEASED) { mouseButton=false; } else if (event.getID()==MouseEvent.MOUSE_MOVED || event.getID()==MouseEvent.MOUSE_DRAGGED) { size=event.getComponent().getSize(); mouseX=((event.getX()-size.width /2.0)/(size.width /2.0))%1.0; mouseY=((event.getY()-size.height/2.0)/(size.height/2.0))%1.0; } else if (event.getID()==MouseEvent.MOUSE_ENTERED) { stopCounter=-1; } else if (event.getID()==MouseEvent.MOUSE_EXITED) { stopCounter=0; } } private void move(long delay) { Transform3D transform; Vector3d velocity; double frame; frame=delay/1000.0; tx=tx+frame*(Math.acos(mouseY)-Math.PI/2.0)*2.0/3.0; tx=Math2.trimRadian(tx); ty=ty+frame*(Math.acos(mouseX)-Math.PI/2.0)*2.0/3.0; ty=Math2.trimRadian(ty); for (double i=0.0;i