summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKenneth Russel <[email protected]>2007-04-08 21:10:19 +0000
committerKenneth Russel <[email protected]>2007-04-08 21:10:19 +0000
commitd7b486ec441c492cb006ec73ab628dfb2b44488a (patch)
treea668409ef7a953f16a327b4535bb6bde5a94654c
parent557d7cb15514800ffd91d88eca0a79bd15a6bee6 (diff)
Added OrthographicCamera class and factored out computation of start
point for ray picking into abstract Camera.getRayStartPoint(). Tested by temporarily modifying DisplayShelf demo to use an orthographic camera -- appears to be working. git-svn-id: file:///usr/local/projects/SUN/JOGL/git-svn/svn-server-sync/joglutils/trunk@63 83d24430-9974-4f80-8418-2cc3294053b9
-rw-r--r--build/joglutils.jarbin156608 -> 165629 bytes
-rw-r--r--src/net/java/joglutils/msg/nodes/Camera.java11
-rw-r--r--src/net/java/joglutils/msg/nodes/OrthographicCamera.java114
-rw-r--r--src/net/java/joglutils/msg/nodes/PerspectiveCamera.java4
4 files changed, 125 insertions, 4 deletions
diff --git a/build/joglutils.jar b/build/joglutils.jar
index 44400e1..52f93ea 100644
--- a/build/joglutils.jar
+++ b/build/joglutils.jar
Binary files differ
diff --git a/src/net/java/joglutils/msg/nodes/Camera.java b/src/net/java/joglutils/msg/nodes/Camera.java
index 04380f1..8dc63d4 100644
--- a/src/net/java/joglutils/msg/nodes/Camera.java
+++ b/src/net/java/joglutils/msg/nodes/Camera.java
@@ -216,18 +216,21 @@ public abstract class Camera extends Node {
Vec3f to = new Vec3f(unproj.x() * ooZ,
unproj.y() * ooZ,
unproj.z() * ooZ);
- // FIXME: for orthographic projections, need to do something
- // different; can't just use the eye point
- Vec3f from = getPosition();
+ Vec3f from = getRayStartPoint(point, to);
Vec3f dir = to.minus(from);
- // System.err.println("unprojected point: " + from);
+ // System.err.println("unprojected point: " + to);
// System.err.println("unprojected dir : " + dir);
line.setPoint(from);
line.setDirection(dir);
}
+ /** Computes the start point of a ray for picking, given a point in
+ normalized screen coordinates ((0, 0) to (1, 1)) and a 3D point
+ which that point unprojects to. */
+ protected abstract Vec3f getRayStartPoint(Vec2f point, Vec3f unprojectedPoint);
+
public void doAction(Action action) {
if (ViewingMatrixElement.isEnabled(action.getState())) {
ViewingMatrixElement.set(action.getState(), getViewingMatrix());
diff --git a/src/net/java/joglutils/msg/nodes/OrthographicCamera.java b/src/net/java/joglutils/msg/nodes/OrthographicCamera.java
new file mode 100644
index 0000000..0678acd
--- /dev/null
+++ b/src/net/java/joglutils/msg/nodes/OrthographicCamera.java
@@ -0,0 +1,114 @@
+/*
+ * Copyright (c) 2007 Sun Microsystems, Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
+ * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
+ * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
+ * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
+ * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
+ * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
+ * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
+ * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed or intended for use
+ * in the design, construction, operation or maintenance of any nuclear
+ * facility.
+ *
+ */
+
+package net.java.joglutils.msg.nodes;
+
+import net.java.joglutils.msg.actions.*;
+import net.java.joglutils.msg.math.*;
+
+public class OrthographicCamera extends Camera {
+ private static final float DEFAULT_HEIGHT = 2.0f;
+ // Amount the most recently set height differed from the default
+ private float heightScale = 1.0f;
+
+ public Mat4f getProjectionMatrix() {
+ if (projDirty) {
+ projMatrix.makeIdent();
+ projDirty = false;
+
+ // Recompute matrix based on current parameters
+ float zNear = getNearDistance();
+ float zFar = getFarDistance();
+ float deltaZ = zFar - zNear;
+ float aspect = getAspectRatio();
+ float height = heightScale * DEFAULT_HEIGHT;
+ float width = height * aspect;
+
+ if ((height == 0) || (width == 0) || (deltaZ == 0))
+ return projMatrix;
+
+ // This is a simplified version of the orthographic camera
+ // matrix where it's symmetric about the origin
+ projMatrix.set(0, 0, 2.0f / width);
+ projMatrix.set(1, 1, 2.0f / height);
+ projMatrix.set(2, 2, -2.0f / deltaZ);
+ }
+
+ return projMatrix;
+ }
+
+ /** Sets the height, in units, of the volume this orthographic
+ camera views. The default height is 2.0 units. */
+ public void setHeight(float height) {
+ heightScale = height / DEFAULT_HEIGHT;
+ }
+
+ /** Returns the height, in units, of the volume this orthographic
+ camera views. */
+ public float getHeight() {
+ return heightScale * DEFAULT_HEIGHT;
+ }
+
+ /** Returns the width, in units, of the volume this orthographic
+ camera views, assuming the passed-in aspect ratio. */
+ public float getWidth(float aspectRatio) {
+ return getHeight() * aspectRatio;
+ }
+
+ /** Returns the width, in units, of the volume this orthographic
+ camera views, assuming the camera's currently-set aspect
+ ratio. */
+ public float getWidth() {
+ return getWidth(getAspectRatio());
+ }
+
+ protected Vec3f getRayStartPoint(Vec2f point, Vec3f unprojectedPoint) {
+ // The easiest way to compute a reasonable ray start point is to
+ // start from the unprojected 3D point and go back along the Z-axis
+ Vec3f backward = Vec3f.Z_AXIS.times(getNearDistance());
+ backward = getOrientation().rotateVector(backward);
+ return unprojectedPoint.plus(backward);
+ }
+
+ public void render(GLRenderAction action) {
+ // FIXME: unclear whether we should be doing this, or whether we
+ // should have a mechanism which doesn't require mutation of the
+ // camera
+ setAspectRatio(action.getCurAspectRatio());
+ doAction(action);
+ }
+}
diff --git a/src/net/java/joglutils/msg/nodes/PerspectiveCamera.java b/src/net/java/joglutils/msg/nodes/PerspectiveCamera.java
index 0bffd88..d2eb082 100644
--- a/src/net/java/joglutils/msg/nodes/PerspectiveCamera.java
+++ b/src/net/java/joglutils/msg/nodes/PerspectiveCamera.java
@@ -105,6 +105,10 @@ public class PerspectiveCamera extends Camera {
return getWidthAngle(getAspectRatio());
}
+ protected Vec3f getRayStartPoint(Vec2f point, Vec3f unprojectedPoint) {
+ return getPosition();
+ }
+
public void render(GLRenderAction action) {
// FIXME: unclear whether we should be doing this, or whether we
// should have a mechanism which doesn't require mutation of the