GluProject未显示C中的精确坐标

时间:2012-12-08 10:17:21

标签: c opengl graphics glut

我试图从opengl坐标(在3D空间中投影)中找到屏幕坐标我为此目的使用了glproject调用,我在代码中使用了旋转和翻译

在执行某些变换后的某个时刻,我调用glproject api来获取特定投影点P(x,y,z)的屏幕坐标

glproject(X,Y,Z,modelMatrix,projectionmatrix,视口,* X_S,* Y_S,* z_s);

我能够在x_s中正确获得x屏幕坐标,但是y坐标是不同的

y中唯一不在x中的变化是最初我调用glperspective来设置fovy(视角的角度,以度为单位,在y方向上)。 gluPerspective(60.0f,Width / Height,0.0001f,1000.0f);

让我重新解释一下我在屏幕上创建3D点的问题,现在我通过GL项目获得该点的2d(x,y)坐标,它们与鼠标坐标不同可能是获得正确的解决方案坐标。

以下是代码段

#include<GL/glut.h>     /* Header File For The GLUT Library */
GLint Window;              /* The number of our GLUT window */
float tmp_x,tmp_y,tmp_z;
GLfloat w = 1200;         /* Window size. Global for use in rotation routine */
GLfloat h = 1200;
GLint prevx, prevy;        /* Remember previous x and y positions */
GLfloat xt=1.0,yt=1.0,zt=1.0;   /* translate */
int width = 1600;
int height = 1200;

//This function will set windowing transformation
void transform(GLfloat Width , GLfloat Height )
{
    glViewport(0,0,  (GLfloat)Width,  (GLfloat)Height);
    glPushMatrix();
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(60.0f, Width/Height,0.0001f,1000.0f); 
    glTranslatef(0.0, 0.0, -15.0f);     /* Centre and away the viewer */
    glMatrixMode(GL_MODELVIEW);
    glPopMatrix();
}


GLvoid draw_room() 
{   
int i;
glPushMatrix();
glShadeModel(GL_SMOOTH); 
glLineWidth(1.0);                             
glPointSize(4.0);                             /* Add point size, to make it clear */
glBegin(GL_POINTS);                /* start drawing the cube.*/
glColor3f(0.0f,0.0f,1.0f);            /* Set The Color To Orange*/
glColor3f(1.0f,0.0f,0.0f);            /* Set The Color To Orange*/
glVertex3f(3.1f,2.1f,2.1f); 
glEnd();                              /* Done Drawing The Cube*/
glEnable(GL_DEPTH_TEST); 
}
//OpenGl Display  callback Function It call init room
void DrawGLScene()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    printf("%f %f %f\n",xt,yt,zt);
    glPushMatrix();
    glMatrixMode(GL_PROJECTION);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glTranslatef(xt,yt, zt);
    draw_room();
    glPopMatrix();
    glutSwapBuffers();               /* Swap buffers */
    glFlush();
}

GLvoid Mouse( int b , int s, int xx, int yy)
{

    double a1,a2,a3;    
    GLint viewport[4];
    GLdouble modelview[16];
    GLdouble projection[16]; 
    glGetIntegerv(GL_VIEWPORT, viewport);  
    glGetDoublev(GL_MODELVIEW_MATRIX, modelview);   
    glGetDoublev(GL_PROJECTION_MATRIX, projection);  
    //gluProject(xt+3.1f,yt+2.1f,zt+2.1f, modelview, projection, viewport, &a1, &a2, &a3);
    gluProject(3.1f,2.1f,2.1f, modelview, projection, viewport, &a1, &a2, &a3);

    printf("Mouse: %d %d\n",xx,yy);                // Both Print are giving different coordinaes.
    printf("Unproject %f %f %f\n",a1,a2,a3);    
    switch (b) {
    case GLUT_LEFT_BUTTON:  /* only stash away for left mouse */
        prevx = xx - w/2;
        prevy = h/2 - yy;
        break;
    case GLUT_MIDDLE_BUTTON:
        break;
    case GLUT_RIGHT_BUTTON:
        break;
    }
}

可能的解决办法是什么?

2 个答案:

答案 0 :(得分:1)

OpenGL使用屏幕的左下角作为坐标系原点。窗口系统通常使用左上角作为坐标系原点。你需要处理这种差异。例如:

printf("Mouse: %d %d\n",xx,yy);                
printf("Unproject %f %f %f\n",a1,viewport[1]-a2,a3);   

答案 1 :(得分:1)

副作用:

  

gluPerspective(60.0f,宽度/高度,0.0001f,1000.0f);

您的近距离和远距离之间的比率非常大。这对深度分辨率非常不利。作为一般规则,您应该尽可能地设置近剪裁平面距离,如场景所允许的那样。由gluPerspective创建的投影的远剪裁平面应设置为尽可能接近(如果投影矩阵的构建略有不同,也可以将远剪裁平面设置为无限远)。

无论如何,您的低深度分辨率会对您的鼠标指针屏幕位置反投影产生负面影响。

  

让我重新解释一下我在屏幕上创建3D点的问题,现在我通过GL项目获得该点的2d(x,y)坐标,它们与鼠标坐标不同可能是获得正确的解决方案坐标。

大多数窗口系统将指针坐标系原点放在左上角。 OpenGL将视口坐标系原点设置为左下角。因此,您必须沿Y =向上轴反转窗口中的鼠标位置。