2016-11-17 77 views
-1

gluUnProject查找錯誤的座標。我貪心畫在單元格尺寸爲1x1的黑色背景上。我嘗試檢測單元格中的單擊,並得到錯誤的座標(不是1 - 1)。 我知道那是OpenGL 1.1的老,我一定要用它。我不喜歡它,大多數時候我使用2.1或3.1。OpenGL gluUnProject查找錯誤的座標

渲染代碼:

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(); 

點擊代碼:

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; 

回答

0

glPopMatrix()被丟棄你最後的矩陣。 glGetxxx()將返回另一個矩陣。

+0

我嘗試回家時。 – nekicneko99