Calculating The ModelView Matrix For OpenGL

Sometimes its very useful to create a modelview matrix without modifying the OpenGL matrix stack. Methods that will modify the matrix stack are for example gluLookAt or similar methods.

I wrote my own method that calculates the modelview matrix for java but i guess it can be easily adapted. Calculating a modelview matrix in this way allows one to pass the generated matrix to a glsl shader using a simple matrix uniform. Using vertex processing in a vertex shader is even the preferred way of dealing with modelview transformations in OpenGL 3.1.

A full example can be found <a href="https://github.com/Jotschi/jogl2-example">here</a>.

	public float[] calculateModelViewMatrix(Vector3f eye, Vector3f center,
			Vector3f up) {

		// Create a new matrix that will hold the modelview matrix
		Matrix4fe mv = new Matrix4fe();

		// Set the identity matrix
		mv.setIdentity();

		// Calculate the forward vector
		Vector3f forward = new Vector3f();
		forward.sub(center, eye);
		forward.normalize();

		// Calculate the side vector by calculating the cross product of the
		// forward and up vector
		Vector3f side = new Vector3f();
		side.cross(forward, up);
		side.normalize();

		// Recalculate up
		up.cross(side, forward);

		// Set the matrix fields
		mv.setElement(0, 0, side.getX());
		mv.setElement(0, 1, side.getY());
		mv.setElement(0, 2, side.getZ());

		mv.setElement(1, 0, up.getX());
		mv.setElement(1, 1, up.getY());
		mv.setElement(1, 2, up.getZ());

		mv.setElement(2, 0, -forward.getX());
		mv.setElement(2, 1, -forward.getY());
		mv.setElement(2, 2, -forward.getZ());

		// Negate the eye vector and create a translation matrix
		eye.negate();
		Matrix4f translationMatrix = new Matrix4f();
		translationMatrix.setIdentity();
		translationMatrix.setTranslation(eye);

		// Apply the translation
		mv.mul(translationMatrix);

		return mv.getFloatArray();
	}