Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00017 package com.generalrobotix.ui.view.tdview;
00018
00019 import java.awt.*;
00020 import java.awt.event.*;
00021 import javax.media.j3d.*;
00022 import javax.vecmath.*;
00023 import com.sun.j3d.utils.picking.*;
00024
00025 class RoomViewHandler extends ViewHandler {
00026
00027
00028 private static final float ROTATION_FACTOR = 0.02f;
00029 private static final float TRANSLATION_FACTOR = 0.005f;
00030 private static final float ZOOM_FACTOR = 0.02f;
00031
00032
00033
00034 private Point3f pickPoint_;
00035 private Point prevPoint_;
00036 private boolean parallelMode_;
00037
00038
00039
00040
00041
00042 RoomViewHandler() {
00043 pickPoint_ = new Point3f();
00044 }
00045
00046
00047
00048 public void setParallelMode(boolean mode) {
00049 parallelMode_ = mode;
00050 }
00051
00052
00053
00054 public void processPicking(MouseEvent evt, BehaviorInfo info) {
00055 prevPoint_ = new Point(evt.getPoint());
00056
00057 info.pickCanvas.setShapeLocation(prevPoint_.x, prevPoint_.y);
00058 try {
00059 PickResult pickResult = info.pickCanvas.pickClosest();
00060 if (pickResult != null) {
00061 Point3d startPoint = info.pickCanvas.getStartPosition();
00062 PickIntersection intersection =
00063 pickResult.getClosestIntersection(startPoint);
00064 pickPoint_ = new Point3f(intersection.getPointCoordinatesVW());
00065 }
00066 } catch (CapabilityNotSetException ex) {
00067 return;
00068 }
00069 }
00070
00071 public void processDragOperation(MouseEvent evt, BehaviorInfo info) {
00072 switch (mode_[getMouseButtonMode(evt)]) {
00073 case ROTATION_MODE:
00074 if (!parallelMode_) {
00075 _rotation(evt, info);
00076 }
00077 break;
00078 case TRANSLATION_MODE:
00079 _translation(evt, info);
00080 break;
00081 case ZOOM_MODE:
00082 _zoom(evt, info);
00083 break;
00084 }
00085
00086 prevPoint_ = new Point(evt.getPoint());
00087 }
00088
00089 public void processStartDrag(MouseEvent evt, BehaviorInfo info) {}
00090 public void processReleased(MouseEvent evt, BehaviorInfo info) {}
00091 public boolean processTimerOperation(BehaviorInfo info) {
00092 return true;
00093 }
00094
00095
00096
00097 private void _rotation(MouseEvent evt, BehaviorInfo info) {
00098 double dx = ROTATION_FACTOR * (prevPoint_.getX() - evt.getPoint().getX());
00099 double dy = ROTATION_FACTOR * (prevPoint_.getY() - evt.getPoint().getY());
00100
00101
00102 TransformGroup tgView = info.drawable.getTransformGroupRoot();
00103 Transform3D trView = new Transform3D();
00104 tgView.getTransform(trView);
00105
00106
00107 Transform3D vw2view = new Transform3D();
00108 tgView.getLocalToVworld(vw2view);
00109 vw2view.mul(trView);
00110 vw2view.invert();
00111
00112
00113 Point3d pointTarget = new Point3d(pickPoint_);
00114 vw2view.transform(pointTarget);
00115
00116
00117 Vector3d ray = new Vector3d(pointTarget);
00118 Transform3D trMove = new Transform3D();
00119 trMove.set(ray);
00120 trView.mul(trMove);
00121
00122
00123 Transform3D tr = new Transform3D();
00124 Vector3d zAxis = new Vector3d(0.0, 0.0, 1.0);
00125 vw2view.transform(zAxis);
00126 tr.set(new AxisAngle4d(zAxis, dx));
00127 trView.mul(tr);
00128
00129 Vector3d xAxis = new Vector3d(1.0, 0.0, 0.0);
00130 tr.set(new AxisAngle4d(xAxis, dy));
00131 trView.mul(tr);
00132
00133
00134 trView.mulInverse(trMove);
00135
00136 info.drawable.setTransform(trView);
00137 }
00138
00139 private void _translation(MouseEvent evt, BehaviorInfo info) {
00140 double dx = TRANSLATION_FACTOR * (prevPoint_.getX() - evt.getPoint().getX());
00141 double dy = TRANSLATION_FACTOR * (prevPoint_.getY() - evt.getPoint().getY());
00142
00143 Transform3D tr = new Transform3D();
00144 Transform3D trView = new Transform3D();
00145 TransformGroup tgView = info.drawable.getTransformGroupRoot();
00146 tgView.getTransform(trView);
00147 tr.set(new Vector3d(dx, -dy, 0.0f));
00148 trView.mul(tr);
00149 info.drawable.setTransform(trView);
00150 }
00151
00152 private void _zoom(MouseEvent evt, BehaviorInfo info) {
00153 if (parallelMode_){
00154 View v = info.drawable.getView();
00155 double s = v.getScreenScale()-ZOOM_FACTOR*0.05*(prevPoint_.getY() - evt.getPoint().getY());
00156 if (s > 0) v.setScreenScale(s);
00157 }else{
00158 double dy = - ZOOM_FACTOR * (prevPoint_.getY() - evt.getPoint().getY());
00159
00160 Transform3D tr = new Transform3D();
00161 Transform3D trView = new Transform3D();
00162
00163 TransformGroup tgView = info.drawable.getTransformGroupRoot();
00164 tgView.getTransform(trView);
00165 tr.set(new Vector3d(0.0f, 0.0f, -dy));
00166 trView.mul(tr);
00167 info.drawable.setTransform(trView);
00168 }
00169 }
00170 }