I want to draw my current mouse cursor on the screen using opengl - so i convert the mouse window coordinates to world coordinates using gluUnProject.
But the resulting world coordinates are very small and does fit into the world space coordinates at all.
What am i doing wrong?
#include <string.h>
#include <stdio.h>
#include <iostream>
#include <GL/freeglut.h>
using std::cout;
float mouseX, mouseY;
void Draw()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.0f, 0.0f, -25.0f);
glPointSize(40.0f);
glColor3f(1.0f, 1.0f, 1.0f);
glBegin(GL_POINTS);
glVertex2f(mouseX, mouseY);
glEnd();
glPointSize(1.0f);
glutSwapBuffers();
}
void Keyboard(unsigned char key, int x, int y)
{
switch (key)
{
case 27:
exit(0);
break;
}
}
void Mouse(int button, int state, int x, int y) {
}
void MouseMove(int x, int y) {
double modelview[16], projection[16];
int viewport[4];
//get the projection matrix
glGetDoublev( GL_PROJECTION_MATRIX, projection );
//get the modelview matrix
glGetDoublev( GL_MODELVIEW_MATRIX, modelview );
//get the viewport
glGetIntegerv( GL_VIEWPORT, viewport );
float z;
double posX, posY, posZ;
glReadPixels( x, viewport[3] - y - 1, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &z );
gluUnProject( x, viewport[3] - y - 1, z, modelview, projection, viewport, &posX, &posY, &posZ );
cout << x << ", " << y << ", " << z << " to " << posX << ", " << posY << ", " << posZ << "\n";
mouseX = posX;
mouseY = posY;
}
void Reshape(int width, int height)
{
if (height == 0) {
height = 1;
}
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0, (float)width/(float)height, 0.1, 100.0);
glMatrixMode( GL_MODELVIEW );
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
glutInitWindowSize(800, 800);
glutCreateWindow("GLUT Mouse!");
glutReshapeFunc(Reshape);
glutDisplayFunc(Draw);
glutKeyboardFunc(Keyboard);
glutMouseFunc(Mouse);
glutMotionFunc(MouseMove);
glutPassiveMotionFunc(MouseMove);
glutIdleFunc(SimulationLoop);
glClearColor( 0.0f, 0.0f, 0.0f, 1.0f );
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glutMainLoop();
return 0;
}