Update of /cvsroot/bprocessor/model/src/net/sourceforge/bprocessor/model
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv3644/src/net/sourceforge/bprocessor/model
Modified Files:
Camera.java
Log Message:
Refactored all the rotation from cameratool to the camera in the model as static methods. Fixed small bug with tilting when rotating. There is still a bug when rotation about the eye point though
Index: Camera.java
===================================================================
RCS file: /cvsroot/bprocessor/model/src/net/sourceforge/bprocessor/model/Camera.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** Camera.java 12 Dec 2005 14:17:12 -0000 1.1
--- Camera.java 13 Dec 2005 12:37:15 -0000 1.2
***************
*** 229,231 ****
--- 229,330 ----
camera[2] += (camera[2] - center[2]) * 0.1;
}
+
+ /**
+ * Rotate the camera horizontal about eye position
+ * @param c the camera to rotate
+ * @param angle the angle to rotate
+ */
+ public static void rotateHorizontallyEye(Camera c, double angle) {
+ Vertex up = new Vertex("", c.roll[0], c.roll[1], c.roll[2]);
+ up.scale(1 / up.length());
+ double x = c.center[0] - c.camera[0];
+ double y = c.center[1] - c.camera[1];
+ double z = c.center[2] - c.camera[2];
+ Vertex forward = new Vertex("", x, y, z);
+ forward.scale(1 / forward.length());
+ double turn = 1;
+ if (c.roll[2] < 0) {
+ turn = -1;
+ }
+ Geometry.rotate(angle, up.getX(), up.getY(), up.getZ(), c.center, c.camera);
+ Geometry.rotate(angle, 0, 0, turn, c.roll, new double[]{0, 0, 0});
+ }
+
+ /**
+ * Rotate the camera vertical about eye position
+ * @param c the camera to rotate
+ * @param angle the angle to rotate
+ */
+ public static void rotateVerticallyEye(Camera c, double angle) {
+ Vertex up = new Vertex("", c.roll[0], c.roll[1], c.roll[2]);
+ up.scale(1 / up.length());
+ double x = c.center[0] - c.camera[0];
+ double y = c.center[1] - c.camera[1];
+ double z = c.center[2] - c.camera[2];
+ Vertex forward = new Vertex("", x, y, z);
+ forward.scale(1 / forward.length());
+ Vertex sidewards = up.cross(forward);
+ sidewards.scale(1 / sidewards.length());
+
+ Geometry.rotate(angle, sidewards.getX(), sidewards.getY(), sidewards.getZ(),
+ c.center, c.camera);
+ Geometry.rotate(angle, sidewards.getX(), sidewards.getY(), sidewards.getZ(),
+ c.roll, new double[]{0, 0, 0});
+ }
+
+ /**
+ * Rotate the camera horizontal about the given center
+ * @param c the camera to rotate
+ * @param angle the angle to rotate
+ * @param center the rotation center
+ */
+ public static void rotateHorizontally(Camera c, double angle, double[] center) {
+ double turn = 1;
+ if (c.roll[2] < 0) {
+ turn = -1;
+ }
+ Geometry.rotate(angle, 0, 0, turn, c.camera, center);
+ Geometry.rotate(angle, 0, 0, turn, c.center, center);
+ Geometry.rotate(angle, 0, 0, turn, c.roll, new double[]{0, 0, 0});
+ }
+
+ /**
+ * Rotate the camera vertical about the given center
+ * @param c the camera to rotate
+ * @param angle the angle to rotate
+ * @param center the rotation center
+ */
+ public static void rotateVertically(Camera c, double angle, double[] center) {
+ Vertex up = new Vertex("", c.roll[0], c.roll[1], c.roll[2]);
+ //up.scale(1 / up.length());
+ double x = c.center[0] - c.camera[0];
+ double y = c.center[1] - c.camera[1];
+ double z = c.center[2] - c.camera[2];
+ Vertex forward = new Vertex("", x, y, z);
+ //forward.scale(1 / forward.length());
+ Vertex sidewards = up.cross(forward);
+ sidewards.scale(1 / sidewards.length());
+
+ Geometry.rotate(angle, sidewards.getX(), sidewards.getY(), sidewards.getZ(),
+ c.camera, center);
+ Geometry.rotate(angle, sidewards.getX(), sidewards.getY(), sidewards.getZ(),
+ c.center, center);
+ Geometry.rotate(angle, sidewards.getX(), sidewards.getY(), sidewards.getZ(),
+ c.roll, new double[]{0, 0, 0});
+ }
+
+ /**
+ * Rotate the tip of the camera
+ * @param c The camera
+ * @param angle The angle of tip
+ */
+ public static void rollCamera(Camera c, double angle) {
+ double x = c.center[0] - c.camera[0];
+ double y = c.center[1] - c.camera[1];
+ double z = c.center[2] - c.camera[2];
+ Vertex forward = new Vertex("", x, y, z);
+ forward.scale(1 / forward.length());
+ Geometry.rotate(angle / 2, forward.getX(),
+ forward.getY(), forward.getZ(), c.roll, new double[] {0, 0, 0});
+ }
}
|