|
From: <tre...@us...> - 2007-11-24 12:43:17
|
Revision: 600
http://ogoglio.svn.sourceforge.net/ogoglio/?rev=600&view=rev
Author: trevorolio
Date: 2007-11-24 04:43:01 -0800 (Sat, 24 Nov 2007)
Log Message:
-----------
Now the camera motion imitates many games:
Left-mouse-drag pans and tilts the camera, rotating around the head.
Escape key resets camera position.
Scroll-wheel zooms in and out.
Modified Paths:
--------------
maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/J3DCamera.java
maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/J3DCameraMotionBehavior.java
maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/J3DRenderer.java
maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/J3DUserRenderable.java
maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/MotionInputHandler.java
maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/render/Camera.java
Modified: maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/J3DCamera.java
===================================================================
--- maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/J3DCamera.java 2007-11-22 14:44:20 UTC (rev 599)
+++ maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/J3DCamera.java 2007-11-24 12:43:01 UTC (rev 600)
@@ -38,8 +38,12 @@
private TransformGroup rootTransformGroup = new TransformGroup();
private Transform3D defaultLocation = new Transform3D();
+
+ private Transform3D workingTransform = new Transform3D();
+
+ private Vector3d workingVector = new Vector3d();
- private Transform3D location = new Transform3D();
+ private TransformGroup viewGroup = new TransformGroup();
private ViewPlatform platform = new ViewPlatform();
@@ -53,59 +57,64 @@
public J3DCamera() {
hudGroup.setCapability(Group.ALLOW_CHILDREN_EXTEND);
- rootTransformGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
- rootTransformGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
- rootTransformGroup.setCapability(TransformGroup.ALLOW_CHILDREN_EXTEND);
- rootTransformGroup.setCapability(TransformGroup.ALLOW_CHILDREN_READ);
- rootTransformGroup.setCapability(TransformGroup.ALLOW_CHILDREN_WRITE);
- rootTransformGroup.setTransform(location);
- rootTransformGroup.addChild(platform);
- rootTransformGroup.addChild(hudGroup);
+ setTransformCapabilities(rootTransformGroup);
+ viewGroup.addChild(platform);
+ viewGroup.addChild(hudGroup);
+ setTransformCapabilities(viewGroup);
+ rootTransformGroup.addChild(viewGroup);
+
view.setBackClipDistance(BACK_CLIP_DISTANCE);
view.setPhysicalBody(body);
view.setPhysicalEnvironment(env);
view.attachViewPlatform(platform);
}
- public TransformGroup getTransformGroup() {
- return rootTransformGroup;
+ private void setTransformCapabilities(TransformGroup transformGroup) {
+ transformGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ transformGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
+ transformGroup.setCapability(TransformGroup.ALLOW_CHILDREN_EXTEND);
+ transformGroup.setCapability(TransformGroup.ALLOW_CHILDREN_READ);
+ transformGroup.setCapability(TransformGroup.ALLOW_CHILDREN_WRITE);
}
- public void setCanvas(Canvas3D canvas) {
- this.canvas = canvas;
- view.addCanvas3D(canvas);
+ public void changeRelativePosition(double x, double y, double z){
+ viewGroup.getTransform(workingTransform);
+ workingTransform.get(workingVector);
+ workingVector.x += x;
+ workingVector.y += y;
+ workingVector.z += z;
+ workingVector.z = Math.max(1, workingVector.z);
+ workingTransform.setTranslation(workingVector);
+ viewGroup.setTransform(workingTransform);
}
- public Canvas3D getCanvas() {
- return canvas;
+ public void setRelativePosition(double x, double y, double z) {
+ workingTransform.setIdentity();
+ workingTransform.setTranslation(new Vector3d(x, y, z));
+ viewGroup.setTransform(workingTransform);
}
- public void getPosition(Transform3D transform) {
- rootTransformGroup.getTransform(transform);
+ public void setDefaultLocation(double x, double y, double z) {
+ defaultLocation.setIdentity();
+ defaultLocation.setTranslation(new Vector3d(x, y, z));
}
- public void setPosition(Transform3D transform) {
- location.set(transform);
- rootTransformGroup.setTransform(location);
+ public void setToDefaultLocation() {
+ rootTransformGroup.setTransform(defaultLocation);
}
- public void setLocation(Vector3f loc) {
- location.setTranslation(loc);
- rootTransformGroup.setTransform(location);
+ public TransformGroup getTransformGroup() {
+ return rootTransformGroup;
}
- public void setRotation(double xRot, double yRot, double zRot) {
- Vector3d position = new Vector3d();
- location.get(position);
- location.setEuler(new Vector3d(xRot, yRot, zRot));
- location.setTranslation(position);
- rootTransformGroup.setTransform(location);
+ public void setCanvas(Canvas3D canvas) {
+ this.canvas = canvas;
+ view.addCanvas3D(canvas);
}
-
- public void setOrientation(AxisAngle4f angle) {
- location.setRotation(angle);
- rootTransformGroup.setTransform(location);
+
+ public Canvas3D getCanvas() {
+ return canvas;
}
public void addHUDObject(Node geom) {
@@ -115,13 +124,4 @@
public Node getNode() {
return rootTransformGroup;
}
-
- public void setDefaultLocation(Vector3f location) {
- defaultLocation.setIdentity();
- defaultLocation.setTranslation(location);
- }
-
- public void setToDefaultLocation(){
- rootTransformGroup.setTransform(defaultLocation);
- }
}
Modified: 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 2007-11-22 14:44:20 UTC (rev 599)
+++ maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/J3DCameraMotionBehavior.java 2007-11-24 12:43:01 UTC (rev 600)
@@ -9,6 +9,7 @@
import javax.media.j3d.WakeupCriterion;
import javax.media.j3d.WakeupOnAWTEvent;
import javax.media.j3d.WakeupOnBehaviorPost;
+import javax.vecmath.Quat4d;
import javax.vecmath.Quat4f;
import javax.vecmath.Vector3d;
@@ -19,21 +20,26 @@
double x_factor = 0.01;
- double z_factor = 0.04;
+ double y_factor = 0.01;
+ Vector3d euler = new Vector3d();
+
Vector3d translation = new Vector3d();
- Quat4f orientation = new Quat4f();
+ Quat4d orientation = new Quat4d();
Transform3D orientationTransform = new Transform3D();
+
+ boolean allowXRotation = true;
- double minDistance = 0;
-
- public J3DCameraMotionBehavior(TransformGroup transformGroup, double minDistance) {
+ public J3DCameraMotionBehavior(TransformGroup transformGroup) {
super(transformGroup);
- this.minDistance = minDistance;
}
+ public void setAllowXRotation(boolean allow){
+ this.allowXRotation = allow;
+ }
+
public void processStimulus(Enumeration criteria) {
WakeupCriterion wakeup;
AWTEvent[] events;
@@ -85,27 +91,18 @@
if (!reset) {
y_angle = dx * x_factor;
+ x_angle = allowXRotation ? dy * y_factor : 0;
+
+ euler.x -= x_angle;
+ euler.x = Math.max(-Math.PI / 5, euler.x);
+ euler.x = Math.min(Math.PI / 5, euler.x);
+ euler.y -= y_angle;
+ euler.z = 0;
+
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);
-
+ currXform.setEuler(euler);
+ currXform.setTranslation(translation);
transformGroup.setTransform(currXform);
} else {
reset = false;
@@ -114,9 +111,37 @@
x_last = x;
y_last = y;
} else if (id == MouseEvent.MOUSE_PRESSED) {
+ transformGroup.getTransform(currXform);
+ currXform.get(orientation);
+ getEuler(orientation, euler);
x_last = evt.getX();
y_last = evt.getY();
}
}
}
+
+ private void getEuler(Quat4d quat, Vector3d euler) {
+ double heading = 0, bank = 0, attitude = 0;
+
+ double sqw = quat.w * quat.w;
+ double sqx = quat.x * quat.x;
+ double sqy = quat.y * quat.y;
+ double sqz = quat.z * quat.z;
+ double unit = sqx + sqy + sqz + sqw; // if normalised is one, otherwise is correction factor
+ double test = quat.x * quat.y + quat.z * quat.w;
+ if (test > 0.499 * unit) { // singularity at north pole
+ heading = 2 * Math.atan2(quat.x, quat.w);
+ bank = Math.PI / 2;
+ attitude = 0;
+ } else if (test < -0.499 * unit) { // singularity at south pole
+ heading = -2 * Math.atan2(quat.x, quat.w);
+ bank = -Math.PI / 2;
+ attitude = 0;
+ } else {
+ heading = Math.atan2(2 * quat.y * quat.w - 2 * quat.x * quat.z, sqx - sqy - sqz + sqw);
+ bank = Math.asin(2 * test / unit);
+ attitude = Math.atan2(2 * quat.x * quat.w - 2 * quat.y * quat.z, -sqx + sqy - sqz + sqw);
+ }
+ euler.set(attitude, heading, bank);
+ }
}
Modified: maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/J3DRenderer.java
===================================================================
--- maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/J3DRenderer.java 2007-11-22 14:44:20 UTC (rev 599)
+++ maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/J3DRenderer.java 2007-11-24 12:43:01 UTC (rev 600)
@@ -694,9 +694,8 @@
if (isLocalUser) {
float cameraHeight = (float) (renderable.getHeight() - renderable.getHeight() / 5);
- Vector3f defaultCameraLocation = new Vector3f(0f, cameraHeight, 3f);
- camera.setDefaultLocation(defaultCameraLocation);
- camera.setLocation(defaultCameraLocation);
+ camera.setDefaultLocation(0, 0, 0);
+ camera.setRelativePosition(0, cameraHeight, 3f);
renderable.setCamera(camera);
motionHandler = new MotionInputHandler(this, renderable, userInputListener);
@@ -720,7 +719,7 @@
public void setSimCamera() {
BranchGroup cameraBranch = new BranchGroup();
- camera.setLocation(new Vector3f(0f, 2f, 2f));
+ camera.setRelativePosition(0f, 2f, 2f);
cameraBranch.addChild(camera.getNode());
worldGroup.addChild(cameraBranch);
}
Modified: maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/J3DUserRenderable.java
===================================================================
--- maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/J3DUserRenderable.java 2007-11-22 14:44:20 UTC (rev 599)
+++ maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/J3DUserRenderable.java 2007-11-24 12:43:01 UTC (rev 600)
@@ -78,6 +78,8 @@
private boolean playDefaultAnimationWhenComplete = true;
+ private J3DCameraMotionBehavior cameraBehavior = null;
+
public J3DUserRenderable(User user, J3DBodyData bodyData, BufferedImage customSkin) {
ArgumentUtils.assertNotNull(user);
this.user = user;
@@ -185,11 +187,10 @@
this.camera = (J3DCamera) camera;
transformGroup.addChild(this.camera.getNode());
- TransformGroup cameraTransformGroup = ((J3DCamera)camera).getTransformGroup();
- J3DCameraMotionBehavior zoomBehavior = new J3DCameraMotionBehavior(cameraTransformGroup, 1.1);
- zoomBehavior.setTransformGroup(cameraTransformGroup);
- cameraTransformGroup.addChild(zoomBehavior);
- zoomBehavior.setSchedulingBounds(new BoundingSphere());
+ TransformGroup cameraTransformGroup = ((J3DCamera) camera).getTransformGroup();
+ cameraBehavior = new J3DCameraMotionBehavior(cameraTransformGroup);
+ cameraTransformGroup.addChild(cameraBehavior);
+ cameraBehavior.setSchedulingBounds(J3DRenderer.DEFAULT_SPACE_BOUNDS);
}
@@ -289,7 +290,7 @@
}
public static String convertGuestCookieToDisplayName(String displayName) {
- if(displayName == null || !displayName.startsWith(WebConstants.GUEST_COOKIE_PREFIX)){
+ if (displayName == null || !displayName.startsWith(WebConstants.GUEST_COOKIE_PREFIX)) {
return displayName;
}
displayName = displayName.substring(WebConstants.GUEST_COOKIE_PREFIX.length() + 1);
@@ -301,4 +302,8 @@
}
return result.toString();
}
+
+ public J3DCameraMotionBehavior getCameraBehavior() {
+ return cameraBehavior;
+ }
}
Modified: maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/MotionInputHandler.java
===================================================================
--- maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/MotionInputHandler.java 2007-11-22 14:44:20 UTC (rev 599)
+++ maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/j3d/MotionInputHandler.java 2007-11-24 12:43:01 UTC (rev 600)
@@ -30,6 +30,7 @@
import com.ogoglio.client.model.SplinePath;
import com.ogoglio.client.model.Thing;
import com.ogoglio.util.ArgumentUtils;
+import com.ogoglio.viewer.render.Camera;
import com.ogoglio.viewer.render.ClickTarget;
import com.ogoglio.viewer.render.DoorRenderable;
import com.ogoglio.viewer.render.PageRenderable;
@@ -77,8 +78,6 @@
private Quat4d orientation = new Quat4d();
- private Vector3d translation = new Vector3d();
-
public MotionInputHandler(Renderer renderer, UserRenderable userGroup, UserInputListener inputListener) {
ArgumentUtils.assertNotNull(renderer);
this.renderer = renderer;
@@ -100,22 +99,8 @@
renderer.getCamera().setToDefaultLocation();
return;
}
- J3DCamera camera = ((J3DCamera) renderer.getCamera());
- camera.getTransformGroup().getTransform(currentTransform);
- currentTransform.get(translation);
- translation.y = 0;
- if (translation.length() > 1 || cameraZoom > 0) {
- currentTransform.get(orientation);
- translation.x = 0;
- translation.y = 0;
- translation.z = 0;
- orientationTransform.set(orientation, translation, 1);
- translation.z = cameraZoom;
- orientationTransform.transform(translation);
- transformX.set(translation);
- currentTransform.mul(transformX, currentTransform);
- camera.getTransformGroup().setTransform(currentTransform);
- }
+ Camera camera = renderer.getCamera();
+ camera.changeRelativePosition(0, 0, cameraZoom);
}
if (!dirty) {
Modified: maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/render/Camera.java
===================================================================
--- maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/render/Camera.java 2007-11-22 14:44:20 UTC (rev 599)
+++ maven/trunk/ogoglio-common/src/main/java/com/ogoglio/viewer/render/Camera.java 2007-11-24 12:43:01 UTC (rev 600)
@@ -14,7 +14,12 @@
package com.ogoglio.viewer.render;
public interface Camera {
- public void setRotation(double xRot, double yRot, double zRot);
+ public void setRelativePosition(double x, double y, double z);
+ public void changeRelativePosition(double x, double y, double cameraZoom);
+
+ public void setDefaultLocation(double x, double y, double z);
+
public void setToDefaultLocation();
+
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|