单击屏幕坐标获取三维坐标

在利用opengl显示点云时,有时需要通过单击鼠标获取屏幕点的三维坐标,其实这是一个矩阵的逆变换过程,opengl的glut库已经有相关的函数为我们为我们完成了复杂的矩阵计算,我们只需要调用就行。

template <class PointType>
bool Pick(const int & x, const int &y, PointType &pp)
{
    GLdouble res[3];
    GLdouble mm[16], pm[16]; GLint vp[4];

    //获取模型视图矩阵
    glGetDoublev(GL_MODELVIEW_MATRIX, mm);
    //获取投影矩阵
    glGetDoublev(GL_PROJECTION_MATRIX, pm);
    //获取视口
    glGetIntegerv(GL_VIEWPORT, vp);

    GLfloat   pix;
    //读取缓冲区的深度分量
    glReadPixels(x, y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &pix);
    GLfloat depthrange[2] = { 0,0 };
    glGetFloatv(GL_DEPTH_RANGE, depthrange);
    if (pix == depthrange[1])
        return false;
    //反投影
    gluUnProject(x, y, pix, mm, pm, vp, &res[0], &res[1], &res[2]);
    pp = PointType(res[0], res[1], res[2]);
    return true;
}

注意上面函数中的x,y坐标是 基于窗口左下角的opengl坐标,并非鼠标单击的屏幕坐标。

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 黑客帝国 设计师:上身试试 返回首页