summaryrefslogtreecommitdiff
path: root/src/Camera.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/Camera.java')
-rw-r--r--src/Camera.java105
1 files changed, 105 insertions, 0 deletions
diff --git a/src/Camera.java b/src/Camera.java
new file mode 100644
index 0000000..e865bc7
--- /dev/null
+++ b/src/Camera.java
@@ -0,0 +1,105 @@
+
+import robotrace.Vector;
+import static java.lang.Math.*;
+import robotrace.GlobalState;
+
+/**
+ * Implementation of a camera with a position and orientation.
+ */
+class Camera {
+
+ /** The position of the camera. */
+ public Vector eye = new Vector(3f, 6f, 5f);
+
+ /** The point to which the camera is looking. */
+ public Vector center = Vector.O;
+
+ /** The up vector. */
+ public Vector up = Vector.Z;
+
+ /**
+ * A reference to the global game state from RobotRace.
+ */
+ private final GlobalState gs;
+
+ public Camera(GlobalState gs) {
+ this.gs = gs;
+ }
+
+ /**
+ * Updates the camera viewpoint and direction based on the
+ * selected camera mode.
+ */
+ public void update(int mode) {
+ if (1 == mode) { // Helicopter mode
+ setHelicopterMode();
+ } else if (2 == mode) { // Motor cycle mode
+ setMotorCycleMode();
+ } else if (3 == mode) { // First person mode
+ setFirstPersonMode();
+ } else if (4 == mode) { // Auto mode
+ // code goes here...
+ } else { // Default mode
+ setDefaultMode();
+ }
+ }
+
+ /**
+ * Computes {@code eye}, {@code center}, and {@code up}, based
+ * on the camera's default mode.
+ */
+ private void setDefaultMode() {
+ /* z |
+ * | vDist %
+ * | % * Ez
+ * |%________*________ y
+ * Ex / % *
+ * / s % *
+ * x / - - - - - - - *
+ * Ey
+ * phi is angle between vDist and XY plane (Z direction)
+ * theta is angle between X-axis and s (XY plane)
+ * E = (Ex, Ey, Ez)
+ * sin phi = Ez / vDist => Ez = vDist * sin phi
+ * cos phi = s / vDist => s = vDist * cos phi
+ * Ex = s * sin theta
+ * Ey = s * cos theta
+ */
+ float Ex, Ey, Ez, s;
+ Ez = gs.vDist * (float) sin(gs.phi);
+ s = gs.vDist * (float) cos(gs.phi);
+ Ex = s * (float) sin(gs.theta);
+ Ey = s * (float) cos(gs.theta);
+
+ // change center point with WASD
+ Ex += gs.cnt.x();
+ Ey += gs.cnt.y();
+ Ez += gs.cnt.z();
+
+ eye = new Vector(Ex, Ey, Ez);
+ }
+
+ /**
+ * Computes {@code eye}, {@code center}, and {@code up}, based
+ * on the helicopter mode.
+ */
+ private void setHelicopterMode() {
+ // code goes here ...
+ }
+
+ /**
+ * Computes {@code eye}, {@code center}, and {@code up}, based
+ * on the motorcycle mode.
+ */
+ private void setMotorCycleMode() {
+ // code goes here ...
+ }
+
+ /**
+ * Computes {@code eye}, {@code center}, and {@code up}, based
+ * on the first person mode.
+ */
+ private void setFirstPersonMode() {
+ // code goes here ...
+ }
+}