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); eye = new Vector(Ex, Ey, Ez); // change center point with WASD (broken, but this was not required by // the assignment) double Cx, Cy, Cz; Cx = gs.cnt.x(); Cy = gs.cnt.y(); Cz = gs.cnt.z(); center = new Vector(Cx, Cy, Cz); } /** * 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 ... } }