public class Camera { private Player player; private float horizontalDistanceFromPlayer; private float verticalDistanceFromPlayer; private Vector3 eye; private Vector3 center; private Vector3 up; private float[] viewMatrix; private float[] rotationMatrix; private float[] translationMatrix; public Camera(Player player) { this.player = player; horizontalDistanceFromPlayer = 1.25f; verticalDistanceFromPlayer = 0.75f; up = new Vector3(0, 1, 0); center = player.getWorldMidPoint(); center.y += player.getPlayerRadius().y * 2; eye = new Vector3(center.x, center.y + verticalDistanceFromPlayer, center.z + horizontalDistanceFromPlayer); viewMatrix = new float[16]; rotationMatrix = new float[16]; translationMatrix = new float[16]; } public float[] getViewMatrix() { Matrix.setLookAtM(viewMatrix, 0, eye.x, eye.y, eye.z, center.x, center.y, center.z, up.x, up.y, up.z); return viewMatrix; } public void updateCamera() { center = player.getWorldMidPoint(); center.y += player.getPlayerRadius().y * 2; float angle = -player.getIncrementalRotationAngle(); float c = (float)Math.cos(Math.toRadians(angle)); float s = (float)Math.sin(Math.toRadians(angle)); eye.x = center.x + (s*horizontalDistanceFromPlayer); eye.y = center.y + verticalDistanceFromPlayer; eye.z = center.z + (c*horizontalDistanceFromPlayer); if(player.getPlayerRunningStatus()) { eye.addVector(player.getPlayerTimeBasedVelocity()); } } public Vector3 getCameraEyeVector() { return new Vector3(eye.x, eye.y, eye.z); } }