作为标题,我试图通过 glTranslate ()来做到这一点。所以我必须知道窗口屏幕坐标和OpenGL坐标之间的关系。
我可以通过 glutMouseFunc ()获取窗口屏幕坐标中的鼠标位置。根据我在网上找到的内容,我需要函数 gluUnProject ()将窗口屏幕坐标从glutMouseFunc()传递到OpenGL坐标。
如果没有 gluLookAt ()和 glFrustum ()函数,结果是正确的。但是有了这两个功能,我得到了完全错误的答案。
这是初始设置:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(1.9, 1.75, 1.7, 0.25, 0.25, 0.25, 0, 1, 0);
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);/*show all planes of the polygon by lines*/
glPointSize(20.0);
glBegin(GL_POINTS);
glVertex3f(0.5, 0.5, 0.5);
glVertex3f(0, 0, 0);
glVertex3f(0.25, 0.25, 0.25);
glEnd();
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-0.4, 0.4, -0.4, 0.4, 1.1, 10);
glutSwapBuffers();
在glutMouseFunc(鼠标)中:
void mouse(int button, int state, int mouse_x, int mouse_y){
if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN){
int viewport[4];
double modelview[16];
double projection[16];
double windowX,windowY,z_cursor;
double x,y,z;
glGetIntegerv(GL_VIEWPORT, viewport);
glGetDoublev(GL_MODELVIEW_MATRIX, modelview);
glGetDoublev(GL_PROJECTION_MATRIX, projection);
windowX= (double)mouse_x;
windowY= (double)viewport[3]-(double)mouse_y;
glReadPixels(windowX, windowY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &z_cursor);
gluUnProject(windowX, windowY, z_cursor, modelview, projection, viewport, &x, &y, &z);
printf("%lf %lf %lf\n", x, y, z);
}
}
有谁知道错误发生的原因以及如何解决?或者是否有另一种方法来实现“将对象移动到鼠标位置”的目标?