3

我想在使用 gluProject() 从 3D 点计算的 2D 点处显示 2D 图像。所以我有我的 3D 点,我使用 gluProject 来获取它的 2D 坐标,然后在这一点上显示我的图像。它运作良好,但我的 Z 坐标存在问题,这使我的图像在屏幕上出现两次:它应该真正出现的位置和“相反的位置”。

举个例子:相机在(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 呢?

4

2 回答 2

4

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

于 2013-07-10T09:14:30.717 回答
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();

}'

于 2015-10-09T00:41:07.200 回答