2015-10-20 100 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

非常感谢,现在我明白了! –