gluProject和2D显示

时间:2013-07-10 08:20:26

标签: opengl projection glu

我想在使用gluProject()从3D点计算的2D点处显示2D图像。 所以我有我的3D点,我用gluProject获取它的2D坐标,然后我在这一点上显示我的图像。 它工作得很好,但我的Z坐标有问题,这使得我的图像在屏幕上出现两次:它应该在哪里出现,而在#34;相反的#34;。

让我们举一个例子:相机位于(0,0,0),我看(0,0,-1),所以在负Z方向。

我使用3D点(0,0,-1)作为我的对象,gluProject将我作为2D点指向我窗口的中心,这是一个好点。

因此,当我朝(0,0,-1)方向看时,我的2D图像出现,当我旋转时,它移动得很好,直到点(0,0,-1)不可见,这使得2D图像走出屏幕所以不显示。

但是当我看(0,0,1)时,它也出现了。因此,如果我使用3D点(0,0,-1)和(0,0,1),我得到相同的结果(用于显示我的2D图像)。我假设与GluProject返回的Z坐标有关,但我不知道是什么。

这是我的代码:我的zNear = 0.1和zFar = 1000

    GLint viewport[4];
    GLdouble modelview[16];
    GLdouble viewVector[3];
    GLdouble projection[16];

    GLdouble winX, winY, winZ;//2D point

    GLdouble posX, posY, posZ;//3D point
    posX=0.0;
    posY=0.0;
    posZ=-1.0;//the display is the same if posZ=1 which should not be the case

    //get the matrices
    glGetDoublev( GL_MODELVIEW_MATRIX, modelview );

    viewVector[0]=modelview[8];
    viewVector[1]=modelview[9];
    viewVector[2]=modelview[10];

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

    int res=gluProject(posX,posY,posZ,modelview,projection,viewport,&winX,&winY,&winZ);

    if(viewVector[0]*posX+viewVector[1]*posY+viewVector[2]*posZ<0){
            displayMyImageAt(winX,windowHeight-winY);
    }

那么,我需要做些什么才能很好地展示我的2D图像,并考虑将Z考虑在内?

2 个答案:

答案 0 :(得分:3)

gluProject工作正常,你在屏幕平面投影矩阵投影点,你应该检查点是否落后,你可以通过计算你的视图矢量和矢量的点积来实现这一点,如果它小于0然后点落后了。

答案 1 :(得分:0)

您的DisplayImageAt功能是什么?

它与我的代码中给出的这个显示功能类似吗? 我也试图获得一个选定的3d坐标点的2D坐标。

这是我的显示器几乎所有.. `void display() {     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glLoadIdentity();
glMultMatrixd(_matrix);

glColor3f(0.5,0.5,0.5);
glPushMatrix();                                                 //draw terrain
glColor3f(0.7,0.7,0.7);
glBegin(GL_QUADS);
    glVertex3f(-3,-0.85,3);
    glVertex3f(3,-0.85,3);
    glVertex3f(3,-0.85,-3);
    glVertex3f(-3,-0.85,-3);
glEnd();
glPopMatrix();

glPushMatrix();

myDefMesh.glDraw(meshModel);

glPopMatrix();

glutSwapBuffers();

}“