2015-10-20 99 views
1

我有一個gluProject函數(OpenGL)的問題。 我想將一個簡單的3D點從對象空間轉換到屏幕空間。 我的代碼如下:奇怪的結果gluProject()

int main(){ 
    GLdouble mvmatrix[16]; 
    GLdouble projmatrix[16]; 
    GLint viewport[4]; 
    GLdouble winx; 
    GLdouble winy; 
    GLdouble winz; 
    glGetDoublev(GL_MODELVIEW_MATRIX, mvmatrix); 
    glGetDoublev(GL_PROJECTION_MATRIX, projmatrix); 
    glGetIntegerv(GL_VIEWPORT, viewport); 
    gluProject(0.0, 0.0, 0.0, mvmatrix, projmatrix, viewport, &winx, &winy, &winz); 
    std::cout << winx << winy; 
    getchar(); 
    getchar(); 
    return 0; 
} 

輸出是:

-1.71799e+009 -1.71799e+009 

這是一個奇怪的結果,並沒有道理給我。 有誰知道出了什麼問題?我沒有在網上找到任何東西。

回答

1

有誰知道出了什麼問題?

您尚未創建GL context並使其當前使用glGetDoublev()glGetIntegerv()前:

爲了任何OpenGL命令工作,上下文必須是最新的;所有OpenGL命令都會影響當前上下文的狀態。當前上下文是一個線程局部變量,因此一個進程可以有多個線程,每個線程都有自己的當前上下文。但是,單個上下文不能同時處於多個線程中。

可以使用(FreeGLUT(中other things (not exhaustive))創建窗口&相關的GL上下文:

#include <GL/glut.h> 
#include <iostream> 

int main(int argc, char **argv) 
{ 
    // create context & make it current 
    glutInit(&argc, argv); 
    glutInitWindowSize(200, 200); 
    glutInitDisplayMode(GLUT_RGBA); 
    glutCreateWindow("GLUT"); 

    GLdouble mvmatrix[16]; 
    GLdouble projmatrix[16]; 
    GLint viewport[4]; 
    GLdouble winx; 
    GLdouble winy; 
    GLdouble winz; 
    glGetDoublev(GL_MODELVIEW_MATRIX, mvmatrix); 
    glGetDoublev(GL_PROJECTION_MATRIX, projmatrix); 
    glGetIntegerv(GL_VIEWPORT, viewport); 
    gluProject 
     (
     0.0, 0.0, 0.0, 
     mvmatrix, projmatrix, viewport, 
     &winx, &winy, &winz 
     ); 
    std::cout << winx << " " << winy << std::endl; 
    return 0; 
} 

輸出:

100 100 
+0

非常感謝,現在我明白了! –