public void applicationLoop() {

		int sign = -1;
		float height = 0;
		Transform3D transform = new Transform3D();
		Transform3D transform2 = new Transform3D();

		screen = canvas.getGraphics2D();
		canvas.setFrameRate(String.format("Frame [%d]", frameCounter));
		canvas.setCameraPosition(String.format("Camera Position (%f, %f, %f)", cameraX, cameraY, cameraZ));

		FPSTimer fpsTimer = new FPSTimer(this);
		fpsTimer.start();

		DecimalFormat decimalFormat = new DecimalFormat("#.##");

		while (!shouldStop) {

			for (Block block : renderMees) {
				transform.setTranslation(block.getPosition3f());
				block.getTransformGroup().setTransform(transform);
			}

			// Indicates we want to travel 2 meters in 1 second
			float travelInterval = 2f / fps;
			height += travelInterval * sign;
			if (Math.abs(height * 2) >= 1) {
				sign = -1 * sign;
			}
			transform.setTranslation(new Vector3f(0f, height, 0f));
			transformGroup.setTransform(transform);

			transform2.setTranslation(new Vector3f(.25f, 0f, 0f));
			transformGroup2.setTransform(transform2);

			canvas.setFrameRate(String.format("Frame [%d|%dfps]", frameCounter, averageFPS));
			canvas.setCameraPosition(String.format("Camera Position (%s, %s, %s)", decimalFormat.format(cameraX),
					decimalFormat.format(cameraY), decimalFormat.format(cameraZ)));

			Transform3D camera = new Transform3D();
			camera.setTranslation(new Vector3d(cameraX, cameraY, cameraZ));
			cameraTransformGroup.setTransform(camera);

			Transform3D cameraTransform3D = new Transform3D();
			Vector3f cameraPosition = new Vector3f();
			cameraTransformGroup.getTransform(cameraTransform3D);
			cameraTransform3D.get(cameraPosition);

			try {
				// For some reason it's required to draw a string here for it to render scaling properly in postRender
				screen.drawString(" ", 0, 0);
			} catch (NullPointerException e) {
				log.warn("InterruptedException");
			}

			try {
				sleep(timerInterval);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}

			frameCounter++;

		}

	}