private GameClock gameClock; gameClock.Initialize(); //Runs first but only once. @Override public void onDrawFrame(GL10 gl) { elapsedTime = gameClock.CalculateElapsedTime(); //This is the elapsedTime that is used in setPlayerTimeBasedVelocity() function GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT); drawSkyBox(); drawPlayer(); drawMaze(); updateCamera(); collisionDetectionAndResponse(); } //This method is called from drawPlayer() function. private void setPlayerTimeBasedVelocity(float elapsedTime) { //timeBasedVelocity is the vector that I increase the players position with later on. timeBasedVelocity.x = initialVelocity.x * elapsedTime; timeBasedVelocity.y = initialVelocity.y * elapsedTime; timeBasedVelocity.z = initialVelocity.z * elapsedTime; } private long t0; private long t1; private long elapsedTime; private final long nanoSecond = 1000000000; private final long microSecond = 1000000; public void Initialize() { t0 = System.nanoTime(); } public float CalculateElapsedTime() { t1 = System.nanoTime(); elapsedTime = t1 - t0; t0 = t1; return (float)((double)elapsedTime/(double)nanoSecond); } //This is how I update my camera based upon the players position which is player.getWorldMidPoint(). //The eye and center variables are Vector3 variables with x, y and z and belongs to the camera which is used to create the //view matrix. 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()); } }