2015-06-26 53 views
0

我知道StackOverflow中充满了类似的问题(Like this onethat one),但所给出的解决方案似乎对我无效。 我的目标是使用gluProject从3D空间中获取某点的屏幕坐标。在此之前,我期望通过执行以下操作获取矩阵:在Opengl 2.x中获取ModelView和投影矩阵[C++]

GLint view[4]={0}; 
GLdouble proj[16]={0}; 
GLdouble model[16]={0}; 

glGetDoublev(GL_PROJECTION_MATRIX,proj); 
glGetDoublev(GL_MODELVIEW_MATRIX,model); 
glGetIntegerv(GL_VIEWPORT,view); 

知道这三个允许计算点的屏幕坐标。然而,当我把这些功能我得到怪异的结果:

VIEWPORT 
     0    0    1366    768 

PROJECTION 
-536 870 912  1 073 460 858   0     0 
     0    0   -536 870 912  1 073 460 858 
     0    0     0     0 
     0    0     0     0 

MODELVIEW 
    1 073 741 824  1 073 741 824  -1 073 741 824   1 071 119 123 
      0    0    1 073 741 824   1 072 511 075 
    -1 073 741 824  1 072 523 682    0    -1 077 637 615 
    -2 147 483 648 -1 069 923 613    0    -1 071 413 844 

矩阵使用gluPerspectivegluLookAt生成。 视口显然是正确的,但矩阵是错误的,不仅是因为它们的值对我来说似乎不是很正常,而是因为矩阵元素的值分布(请参见[1,2]元素)投影矩阵应该是零但不是,而[3,3]元素是零,它不应该)。

这些奇怪的值指向glGet()函数的调用中的一些问题,但我无法弄清楚。我检查过我没有拨打glBegin()glEnd()之间的glGet()。实际上,在正确绘制一些点之后,在使用相同的模型视图和投影矩阵正确绘制某些球体之前,我会调用glGet()。 有我的代码的一个更大的片断(调用序列main->CheckForPlanetPosition->Planet::GetScreenLocation):

typedef struct position { 
    int x,y,z; 
}; 

int main() 
{ 
    glEnable(GL_DEPTH_TEST); 
    glViewport(0,0,1366,768); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(60,16.0f/9.0f,1,1000); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    gluLookAt(Camera.x,Camera.y,Camera.z,Camera.cx,Camera.cy,Camera.cz,0,1,0); 

    //calls to glEnable 

    //some drawing 
    glBegin(GL_LINES); 
    for(float i=1;i<15;i++) 
    { 
     glColor4f(0,120.0f/255.0f,210.0f/255.0f,1.0f); 

     glVertex3f(0,0.5f,i*100.0f/15.0f); 
     glVertex3f(100,0.5f,i*100.0f/15.0f); 
     glVertex3f(i*100.0f/15.0f,0.5f,0); 
     glVertex3f(i*100.0f/15.0f,0,100); 
    } 
    glEnd(); 

    CheckForPlanetsLocation(); 
    //other stuff... 
    return 0; 
    } 

bool CheckForPlanetsLocation() 
{ 
    position pos; 
    pos=SomePlanet.GetScreenLocation(); 
    //check that the mouse is over the returned region... 
} 

position Planet::GetScreenLocation() 
{ 
     GLint view[4]={0}; 
     GLdouble proj[16]={0}; 
     GLdouble model[16]={0}; 
     GLdouble x,y,z; 

     glGetDoublev(GL_PROJECTION_MATRIX,proj); 
     glGetDoublev(GL_MODELVIEW_MATRIX,model); 
     glGetIntegerv(GL_VIEWPORT,view); 

     gluProject(pos.x,pos.y,pos.z,model,proj,view,&x,&y,&z); 
     position res; 

     res.x=(int)x; 
     res.y=(int)y; 
     res.z=(int)z; 
     return res; 
} 

希望你能帮助我这一次!在此先感谢您的回答:)

回答

2

问题是gluProject需要一个double类型的数组,而您将其传递给float。当它进行迭代时,它将使用大小为浮点大小的double进行迭代!因此,它会跳过一些元素并为其他人提供垃圾。用double替换那些浮点数组,并使用glGetDoublev来获得你想要的值。

此外,你的gluPerspective代码有一个小错误 - 16/9将整数截断到之前它被传递到函数。这不是导致投影问题的原因,但最好记住整数截断是一件会让你的浮点运算变得困难的事情。

最后,我会成为那个家伙,并说在这个时代学习OldenGL(正如我所说的那样)会造成更多的伤害而不是好处。有很多现代的OpenGL伟大的在线教程,如这些:

Open.GL

LearnOpenGL

凡是提到的OpenGL 2以上就是你想要的。