iDevGames Forums
gluUnProject issue - Printable Version

+- iDevGames Forums (http://www.idevgames.com/forums)
+-- Forum: Development Zone (/forum-3.html)
+--- Forum: Game Programming Fundamentals (/forum-7.html)
+--- Thread: gluUnProject issue (/thread-8725.html)



gluUnProject issue - LATHEEFTH - Mar 14, 2011 06:04 PM

Hello,

I am having a problem with gluUnProject.
I drew a Cube with gluPerspective and rotate it on the Y axis when dragged by mouse. Now I need to place a small sphere on the face of the cube depending on my mouse click (presently if I press P and then click mouse left button then convert the window position to object position).
Everything works fine , if I dont rotate the cube(ie I am able to place the
small sphere on the cube where I click). Now If I rotate the cube , then click on the cube (ie P + mouse) the sphere is not placed where I click. It behaves weirdly. I am new to opengl, please help.


RE: gluUnProject issue - OneSadCookie - Mar 14, 2011 07:47 PM

Not enough information.


RE: gluUnProject issue - LATHEEFTH - Mar 15, 2011 03:04 PM

Below is the code...My intention here is to place the small sphere on the tetrahedron at the position specified by the mouse. It does not work when I rotate the tetrahedron. Hope this gives insight to my problem




Code:
#include <GL/glut.h>
#include <iostream>
#include <stdlib.h>
#include <stdio.h>

void Display();
void Reshape(int w,int h);

static float _angle = 0.0f;
static int stop = 0;
static int rotate  = 0;
static int lastx = 0;
static int lasty = 0;
static float rotation_angle = 0.0f;
static bool edit_poly = false;;
static bool second_point = false;
static       double object_coord_start[3];

void mouseMovement(int x, int y) {
   if(rotate == 1)
   {
     int diffx=x-lastx; //check the difference between the current x and the last x position
     int diffy=y-lasty; //check the difference between the current y and the last y position
     lastx=x; //set lastx to the current x position
     lasty=y; //set lasty to the current y position
     _angle = _angle + (float)diffx;
    glutPostRedisplay(); //Tell GLUT that the display has changed
   }
   else
   {
      lastx = 0;
      lasty = 0;
    }
}

void keyboard (unsigned char key, int x, int y) {
/* Called when a key is pressed */
if (key == 27) exit (0); /* 27 is the Escape key */
if(key == 'p')
{
    edit_poly = true;
}
}
void mouseEvent(int button, int state, int x, int y)  
{  
   if (button == GLUT_LEFT_BUTTON)  
   {  
    if (state == GLUT_DOWN)  
    {
      rotate = 1;
      lastx = x;
      lasty = y;
      if ( edit_poly == true)
      {
        
         GLint viewport[4];
         GLdouble projection[16],modelview[16];
         GLfloat wx=x,wy,wz;
         glGetIntegerv(GL_VIEWPORT,viewport);
         y=viewport[3]-y;
         wy=y;
         glGetDoublev(GL_MODELVIEW_MATRIX,modelview);
         glGetDoublev(GL_PROJECTION_MATRIX,projection);
         glReadPixels(x,y,1,1,GL_DEPTH_COMPONENT,GL_FLOAT,&wz);
         GLU_FALSE == gluUnProject(wx,wy,wz,modelview,projection,viewport,&object_coord_start[0],&object_coord_start[1],&object_coord_start[2]);
         glutPostRedisplay();
      }

    }
    else if (state == GLUT_UP)  
    {
       rotate = 0;
      if ( edit_poly == true)
      {
          edit_poly = false;
      }
    }

   }
}
int main(int argc,char **argv) {
  glutInit(&argc,argv);
  glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);
  glutInitWindowSize(500,500);
  glutInitWindowPosition(100,100);
  glutCreateWindow("ex");
  glEnable(GL_DEPTH_TEST);
  glEnable(GL_COLOR_MATERIAL);
  glutDisplayFunc(Display);
  glutReshapeFunc(Reshape);
  glutKeyboardFunc (keyboard); /* Register the "keyboard" function */
  glutMotionFunc(mouseMovement); //check for mouse movement
  glutMouseFunc(mouseEvent);
  glutMainLoop();
  return 0;
}

GLdouble ox=0.0,oy=0.0,oz=0.0;
void Display() {
  glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  glLoadIdentity();
  //gluLookAt(10.0,0.0,20.0,0.0,0.0,0.0,0.0,1.0,0.0);
  gluLookAt (0.0, 0.0, 6.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
  glPushMatrix();
  glRotatef(_angle, 0.0f, 1.0f, 0.0f);
  //glRotatef(45,1.0,0.0,0.0);
  glColor3f(1,0,0);
  glBegin(GL_POLYGON);
  glVertex3f(0.0, 0.0, 0.0);
  glVertex3f(2.0, 0.0, 0.0);
  glVertex3f(1.0,2.0,0.0);
  glVertex3f(0.0, 0.0, 0.0);
  //glVertex3f(1.0, 1.0, 2.0);
  glEnd();
  glColor3f(0,1,0);
  glBegin(GL_POLYGON);
  glVertex3f(0.0, 0.0, 0.0);
  glVertex3f(1.0, 2.0, 0.0);
  glVertex3f(1.0,1.0,2.0);
  glVertex3f(0.0, 0.0, 0.0);
  glEnd();
  glColor3f(1,1,0);
  glBegin(GL_POLYGON);

  glVertex3f(2.0,0.0, 0.0);
  glVertex3f(1.0,2.0,0.0);
  glVertex3f(1.0, 1.0, 2.0);
glVertex3f(2.0, 0.0, 0.0);
  glEnd();
  glColor3f(0,0,1);
  glBegin(GL_POLYGON);
  glVertex3f(0.0, 0.0, 0.0);
  glVertex3f(2.0,0.0, 0.0);
  glVertex3f(1.0,1.0,2.0);
  glVertex3f(0.0, 0.0, 0.0);
  glEnd();

  //glPopMatrix();

  glPushMatrix();
  glColor3f(0,1,1);
  glDepthMask(GL_FALSE);
  glTranslated(object_coord_start[0],object_coord_start[1],object_coord_start[2]);
  glutSolidSphere(0.1,15,15);
  glDepthMask(GL_TRUE);
  glPopMatrix();
glutSwapBuffers();

}

void Reshape(int w,int h) {
  glViewport(0,0,w,h);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  gluPerspective (60, (GLfloat)w / (GLfloat)h, 1.0, 100.0);
  glMatrixMode(GL_MODELVIEW);
}



RE: gluUnProject issue - DoG - Mar 21, 2011 02:56 AM

The way you do it, it won't work because the matrices you retrieve in mouseEvent() aren't the matrices that were used to draw the cube because of push/pop. You need to store those when drawing or computing them, then use them with unProject() later.


RE: gluUnProject issue - LATHEEFTH - Mar 21, 2011 05:50 AM

Thanks for the help. It is solved now.