|
From: <tre...@us...> - 2007-10-20 12:21:32
|
Revision: 522
http://ogoglio.svn.sourceforge.net/ogoglio/?rev=522&view=rev
Author: trevorolio
Date: 2007-10-20 05:21:34 -0700 (Sat, 20 Oct 2007)
Log Message:
-----------
Added a better mouse control for camera movement.
Currently used only in the body editor, but eventually will work for viewers.
Added Paths:
-----------
maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/J3DCameraMotionBehavior.java
Added: maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/J3DCameraMotionBehavior.java
===================================================================
--- maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/J3DCameraMotionBehavior.java (rev 0)
+++ maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/J3DCameraMotionBehavior.java 2007-10-20 12:21:34 UTC (rev 522)
@@ -0,0 +1,123 @@
+package com.ogoglio.viewer.j3d;
+
+import java.awt.AWTEvent;
+import java.awt.event.MouseEvent;
+import java.util.Enumeration;
+
+import javax.media.j3d.Transform3D;
+import javax.media.j3d.TransformGroup;
+import javax.media.j3d.WakeupCriterion;
+import javax.media.j3d.WakeupOnAWTEvent;
+import javax.media.j3d.WakeupOnBehaviorPost;
+import javax.vecmath.Quat4f;
+import javax.vecmath.Vector3d;
+
+import com.sun.j3d.utils.behaviors.mouse.MouseBehavior;
+
+public class J3DCameraMotionBehavior extends MouseBehavior {
+ double x_angle = 0, y_angle = 0, old_y = 0;
+
+ double x_factor = 0.01;
+
+ double z_factor = 0.04;
+
+ Vector3d translation = new Vector3d();
+
+ Quat4f orientation = new Quat4f();
+
+ Transform3D orientationTransform = new Transform3D();
+
+ double minDistance = 0;
+
+ public J3DCameraMotionBehavior(TransformGroup transformGroup, double minDistance) {
+ super(transformGroup);
+ this.minDistance = minDistance;
+ }
+
+ public void processStimulus(Enumeration criteria) {
+ WakeupCriterion wakeup;
+ AWTEvent[] events;
+ MouseEvent mouseEvent;
+
+ while (criteria.hasMoreElements()) {
+ wakeup = (WakeupCriterion) criteria.nextElement();
+ if (wakeup instanceof WakeupOnAWTEvent) {
+ events = ((WakeupOnAWTEvent) wakeup).getAWTEvent();
+ if (events.length > 0) {
+ mouseEvent = (MouseEvent) events[events.length - 1];
+ doProcess(mouseEvent);
+ }
+ }
+
+ else if (wakeup instanceof WakeupOnBehaviorPost) {
+ while (true) {
+ synchronized (mouseq) {
+ if (mouseq.isEmpty())
+ break;
+ mouseEvent = (MouseEvent) mouseq.remove(0);
+
+ while ((mouseEvent.getID() == MouseEvent.MOUSE_DRAGGED) && !mouseq.isEmpty() && (((MouseEvent) mouseq.get(0)).getID() == MouseEvent.MOUSE_DRAGGED)) {
+ mouseEvent = (MouseEvent) mouseq.remove(0);
+ }
+ }
+ doProcess(mouseEvent);
+ }
+ }
+
+ }
+ wakeupOn(mouseCriterion);
+ }
+
+ void doProcess(MouseEvent evt) {
+ int id;
+ int dx, dy;
+
+ processMouseEvent(evt);
+
+ if (((buttonPress) && ((flags & MANUAL_WAKEUP) == 0)) || ((wakeUp) && ((flags & MANUAL_WAKEUP) != 0))) {
+ id = evt.getID();
+ if ((id == MouseEvent.MOUSE_DRAGGED) && !evt.isAltDown() && !evt.isMetaDown()) {
+
+ x = evt.getX();
+ y = evt.getY();
+
+ dx = x - x_last;
+ dy = y - y_last;
+
+ if (!reset) {
+ y_angle = dx * x_factor;
+ transformGroup.getTransform(currXform);
+
+ currXform.get(translation);
+ translation.y = 0;
+ if (translation.length() > minDistance || dy > 0) {
+ // First zoom
+ currXform.get(orientation);
+ translation.x = 0;
+ translation.y = 0;
+ translation.z = 0;
+ orientationTransform.set(orientation, translation, 1);
+ translation.z = dy * z_factor;
+ orientationTransform.transform(translation);
+ transformX.set(translation);
+ currXform.mul(transformX, currXform);
+ }
+
+ //Now rotate
+ transformY.rotY(y_angle);
+ currXform.mul(transformY, currXform);
+
+ transformGroup.setTransform(currXform);
+ } else {
+ reset = false;
+ }
+
+ x_last = x;
+ y_last = y;
+ } else if (id == MouseEvent.MOUSE_PRESSED) {
+ x_last = evt.getX();
+ y_last = evt.getY();
+ }
+ }
+ }
+}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|