gluUnProject射线拾取(opengl / c ++ /过剩)

时间:2012-01-11 19:42:13

标签: c++ opengl graphics mouse glut

我试图看看我是否可以在3D世界中使用鼠标点击3D绘制的对象。我明白我必须使用gluUnProject,所以我尝试了以下方式:

首先,我有一个从鼠标(窗口坐标)获取x,y坐标的函数,并尝试将它们转换为真实世界坐标:

void project(int x_cursor, int y_cursor){

GLint viewport[4];
GLdouble modelview[16];
GLdouble projection[16];
GLfloat winX,winY;
glGetIntegerv(GL_VIEWPORT, viewport);
glGetDoublev(GL_MODELVIEW_MATRIX, modelview);
glGetDoublev(GL_PROJECTION_MATRIX, projection);

// obtain the Z position (not world coordinates but in range 0 - 1)
GLfloat z_cursor;
winX = (float)x_cursor;
 winY = (float)viewport[3]-(float)y_cursor;
glReadPixels(winX, winY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &z_cursor);

// obtain the world coordinates

gluUnProject(winX, winY, z_cursor, modelview, projection, viewport, &x, &y, &z);
}

然后我有鼠标回调函数:

void mouse(int button, int state, int x_cursor, int y_cursor){
if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
{
    mouse_x=x_cursor;
    mouse_y=y_cursor;

 project(mouse_x,mouse_y);

     cout<<x<<" "<<"Printed out variable x"<<endl;
 cout<<y<<" "<<"Printed out variable y"<<endl;
 cout<<z<<" "<<"Printed out variable z"<<endl;

 /**for (int i = 0; i < 150; i++) { 
if ((enemies[i]!=NULL)&&(enemies[i]->getTranslation().x > x - 1 &&     enemies[i]->getTranslation().x < x + 1) 
        && (enemies[i]->getTranslation().z > z - 1 && enemies[i]->getTranslation().z < z + 1)
        && (enemies[i]->getTranslation().y > y - 1 && enemies[i]->getTranslation().y < y + 1)) {

        running=false;
            }
    }**/
}

}

目前我只是打印出坐标x,y,z,但是在注释代码中你可以看到我打算用它们做什么:验证绘制的对象是否在我所在的地方的直接vecinity中点击了鼠标。

最后我添加了glutMouseFunc(鼠标); main()函数中的行,它编译好了,但是根据打印结果判断它并不表示正确的值。

我想补充一个事实,即我有一个移动的相机;我的意思是我可以使用键盘输入更改glulookat参数。你能看看我的代码,也许可以告诉我我做错了什么。非常感谢。

[编辑]它似乎只在我设置相机时起作用:gluLookAt(-35,0,0,0,100,0,0,0,1);

[EDIT2]此外,如果我移动相机的位置,然后将其返回到初始位置(工作位置),它就不再起作用了。

解决。上面的代码没问题。问题是我正在添加glPushMatrix();和glPopMatrix();在绘制场景中的对象之前和之后。问题可以结束。

0 个答案:

没有答案