- // ****************************************************************************************************
- // Function for computing 3D - position.
- // ****************************************************************************************************
- public Vector3 GetMouse3DPos(int mousePos_X, int mousePos_Y)
- {
- var viewport = new int[4];
- Matrix4 modelview, projection;
- // Get the needed matrix informations for computing mouse 3D - position.
- GL.GetInteger(GetPName.Viewport, viewport);
- GL.GetFloat(GetPName.ModelviewMatrix, out modelview);
- GL.GetFloat(GetPName.ProjectionMatrix, out projection);
- var t = new float[1];
- GL.ReadPixels(mousePos_X, (viewport[3] - mousePos_Y), 1, 1, PixelFormat.DepthComponent, PixelType.Float, t);
- // Compute 3D position.
- Vector3 mouse_3D = new Vector3();
- try
- {
- mouse_3D = new Vector3(UnProject(new Vector3(mousePos_X, viewport[3] - mousePos_Y, t[0]), modelview, projection, viewport));
- }
- catch (ArgumentException exc)
- {
- MessageBox.Show(exc.Message, "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
- }
- Vector3 mouse_out = mouse_3D;
- return mouse_out;
- }
- // ****************************************************************************************************
- // Self implemented glUnProject.
- // ****************************************************************************************************
- private Vector3 UnProject(Vector3 screen, Matrix4 modelview, Matrix4 projection, IList<int> viewport)
- {
- var pos = new Vector4()
- {
- X = ((screen.X - viewport[0]) / viewport[2]) * 2.0f - 1.0f,
- Y = ((screen.Y - viewport[1]) / viewport[3]) * 2.0f - 1.0f,
- Z = screen.Z * 2.0f - 1.0f,
- W = 1.0f
- };
- var pos2 = Vector4.Transform(pos, Matrix4.Invert(Matrix4.Mult(modelview, projection)));
- var posOut = new Vector3(pos2.X, pos2.Y, pos2.Z);
- if (posOut.Z == 0.0f)
- {
- throw new ArgumentException("Error: Division throught 0!", "posOut.Z");
- }
- else
- return (posOut / pos2.W);
- }