如何将对象移动到鼠标位置(opengl)

时间:2015-05-31 00:30:55

标签: opengl

作为标题,我试图通过 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);
}
}

有谁知道错误发生的原因以及如何解决?或者是否有另一种方法来实现“将对象移动到鼠标位置”的目标?

0 个答案:

没有答案