Cool thanks for that. My problem must now be with the way I get the camera normal matrix or world origin position for it, though they look correct to me... I'm going to post my calculations here, if anyone can spot a problem with what I'm doing any help would be greatly appreciated /*Camera Normal Matrix*/ CMatrix3D cameraInverse; glGetFloatv(GL_MODELVIEW_MATRIX, cameraInverse._data); CMatrix3D cameraNormalMatrix = cameraInverse.GetInverse().GetTranspose(); /*World Origin*/ CVector4D worldOrigin; worldOrigin.X = CVector4D(cameraInverse._11, cameraInverse._12, cameraInverse._13, cameraInverse._14).Dot(CVector4D(0.0, 0.0, 0.0, 1.0)); worldOrigin.Y = CVector4D(cameraInverse._21, cameraInverse._22, cameraInverse._23, cameraInverse._44).Dot(CVector4D(0.0, 0.0, 0.0, 1.0)); worldOrigin.Z = CVector4D(cameraInverse._31, cameraInverse._32, cameraInverse._33, cameraInverse._44).Dot(CVector4D(0.0, 0.0, 0.0, 1.0)); worldOrigin.W = CVector4D(cameraInverse._41, cameraInverse._42, cameraInverse._43, cameraInverse._44).Dot(CVector4D(0.0, 0.0, 0.0, 1.0)); Ideally here I would have like to have just done cameraNormalMatrix * CVector4D(0.0, 0.0, 0.0, 1.0); however I could not see any function to do this calculation. Is there one? thanks in advance Michael