我试图看看我是否可以在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();在绘制场景中的对象之前和之后。问题可以结束。