diff options
Diffstat (limited to 'src/Camera.java')
-rw-r--r-- | src/Camera.java | 105 |
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 ... + } +} |