2016-11-17 7 views
-1

gluUnProject trouver des coordonnées erronées. J'ai l'avidité de dessin sur fond noir avec la dimension de la cellule 1x1. J'essaie de détecter le clic dans les cellules et je reçois des coordonnées erronées (pas 1 - 1). Je sais que c'est OpenGL 1.1 vieux, bourgeon je dois l'utiliser. Je ne suis pas bien avec, la plupart du temps j'utilise 2.1 ou 3.1.OpenGL gluUnProject trouver la mauvaise coordonnée

Code rendu:

glClear(GL_COLOR_BUFFER_BIT); 

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
gluPerspective(45.0f, width()/(float)height(), 0.1f, 100.0f); 
gluLookAt(m_camera->getX(), m_camera->getY(), m_camera->getZ(), 
      m_camera->getX(), m_camera->getY(), m_camera->getZ() - 1.0f, 
      0.0f, 1.0f, 0.0f); 
glPushMatrix(); 

int i; 

/* 
* Render grid 
*/ 
for(i = 0; i <= m_mapProperties->getWidth(); i++) 
{ 
    glm::vec3 position(i * m_mapProperties->getGridWidth(), 0.0f, 0.0f); 
    glm::vec3 scale(0.05f, m_mapProperties->getHeight() * m_mapProperties->getGridHeight(), 0.0f); 
    RenderUtil::render(position, scale); 
} 
for(i = 0; i <= m_mapProperties->getHeight(); i++) 
{ 
    glm::vec3 position(0.0f, i * m_mapProperties->getGridHeight(), 0.0f); 
    glm::vec3 scale(m_mapProperties->getWidth() * m_mapProperties->getGridWidth(), 0.05f, 0.0f); 
    RenderUtil::render(position, scale); 
} 

for(i = 0; i < m_width * m_height; i++) 
    if(m_map[i]) 
     m_map[i]->render(); 

glPopMatrix(); 

Code Click:

QPoint cursorPos = event->pos(); 
    GLint viewport[4]; 
    GLdouble modelview[16]; 
    GLdouble projection[16]; 

    glGetDoublev(GL_MODELVIEW_MATRIX, modelview); 
    glGetDoublev(GL_PROJECTION_MATRIX, projection); 
    glGetIntegerv(GL_VIEWPORT, viewport); 

    GLfloat winX, winY, winZ = 0.0f; 
    GLdouble x, y, z; 

    winX = (float)cursorPos.x(); 
    winY = (float)viewport[3] - (float)cursorPos.y(); 
    glReadPixels(winX, winY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ); 
    winZ = 0.0f; 
    winZ = -m_camera->getZ(); 
    gluUnProject(winX, winY, winZ, modelview, projection, viewport, &x, &y, &z); 
    qDebug() << x 
      << y; 

Répondre

0

glPopMatrix() est votre dernière matrice mise au rebut. glGetxxx() retournera une autre matrice.

+0

J'essaie quand je rentre à la maison. – nekicneko99