public static double[][] cameraFollowsObject(double[][] object,
			double behind, double above) {

		// get the unit vector that points along the local x axis of the object
		double[] objectXAxis = HoneyBee.getLocalXAxisUnitVector(object);

		// calculate the unit vector that would point along the local y axis of
		// the object if the object was fully upright
		double[] objectIdealYAxis = HoneyBee.createPerpendicularUnitVector(
				objectXAxis, HoneyBee.GLOBAL_Z_AXIS);

		// translate the object along the ideal y axis by behind units and then
		// along the global z axis by above units
		double[][] translated = HoneyBee.translateAlongArbitraryAxis(object,
				behind, objectIdealYAxis);
		translated = HoneyBee.translateAlongArbitraryAxis(translated, above,
				HoneyBee.GLOBAL_Z_AXIS);

		// calculate the unit vector from the object to the camera that is
		// equivalent to the local z axis of the camera
		double[] cameraZAxis = HoneyBee.createUnitVectorFromTransforms(object,
				translated);

		// calculate the unit vectors of the local x and y axes of the camera
		// when the local x axis of the camera is level with the global horizon
		double[] cameraXAxis = HoneyBee.createPerpendicularUnitVector(
				HoneyBee.GLOBAL_Z_AXIS, cameraZAxis);
		double[] cameraYAxis = HoneyBee.createPerpendicularUnitVector(
				cameraZAxis, cameraXAxis);

		// derive the rotation and translation matrices of the camera
		double[][] cameraRotation = new double[][] { cameraXAxis, cameraYAxis,
				cameraZAxis };
		double[] cameraTranslation = HoneyBee
				.getTranslationFromTransform(translated);

		// construct the transform matrix of the camera
		double[][] camera = HoneyBee.createTransformForRotationAndTranslation(
				cameraRotation, cameraTranslation);

		return camera;

	}