import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.event.*;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.geometry.ColorCube;
import javax.media.j3d.*;
import javax.vecmath.*;

public class Example3 extends Applet {
  
  Canvas3D canvas3D;
  Transform3D pos;
  TransformGroup tg;
  ColorCube mark = new ColorCube(0.05);
  public Example3() {
    setLayout(new BorderLayout());
    canvas3D = new Canvas3D(null);
    add("Center", canvas3D);
    BranchGroup scene = new BranchGroup();
    pos = new Transform3D();
    tg = new TransformGroup(pos);
    tg.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
    tg.addChild(mark);
    scene.addChild(tg);
    scene.addChild(new ColorCube(0.05));
    SimpleUniverse simpleU = new SimpleUniverse(canvas3D);
    simpleU.getViewingPlatform().setNominalViewingTransform();
    simpleU.addBranchGraph(scene);
    
    MouseMotionAdapter ma = new MouseMotionAdapter() {
      Transform3D t3d = new Transform3D();
      Point3d point = new Point3d();
      Point3d campnt = new Point3d();
      Vector3d vec = new Vector3d();
      public void mouseMoved(MouseEvent e) {
        canvas3D.getCenterEyeInImagePlate(campnt);
        canvas3D.getPixelLocationInImagePlate(e.getX(),e.getY(),point);
        vec.sub(point,campnt);
        vec.normalize();
        pos.setTranslation(vec);
        tg.setTransform(pos);
        System.out.println("Point Loc: "+vec.toString());
      }
    };
    canvas3D.addMouseMotionListener(ma);
  }
  
  public static void main(String[] args) {
    Frame frame = new MainFrame(new Example3(), 256, 256);
  }
}
