通过确定视角 等信息后,如何通过鼠标点击 得到某点的三维坐标

解决方案 »

  1.   

    gluUnProject。
    深度方向需要进一步通过基准面等方法确定。
      

  2.   

    http://community.csdn.net/Expert/topic/3146/3146805.xml?temp=.3910334
      

  3.   

    // 获取光标位置的模型坐标。 2002.11.18.
    CVector3 WINAPI GetMouseModelCoordinate(CVRRoomView* pView, CPoint point)
    {
    GLfloat fdepth;
    GLdouble ObjectX, ObjectY, ObjectZ;
    GLint iViewPort[4];
    GLdouble dProjMatrix[16];
    GLdouble dModelMatrix[16];
    POINT iScreen;
    int iScrToWinX, iScrToWinY;
    long iError;
    CVector3 pp; CClientDC ClientDC(pView);
    wglMakeCurrent(ClientDC.m_hDC, pView->m_hGLContext); //使 RC 与当前 DC 相关联
    glGetIntegerv(GL_VIEWPORT, iViewPort);
    glPushMatrix();
    glGetDoublev(GL_MODELVIEW_MATRIX, dModelMatrix);
        glGetDoublev(GL_PROJECTION_MATRIX, dProjMatrix);
    ::GetCursorPos(&iScreen);
    iScrToWinX = iScreen.x-point.x;
    iScrToWinY = iScreen.y-point.y;
    glReadPixels(point.x, iViewPort[3]-point.y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &fdepth);
    gluUnProject((GLdouble)point.x, (GLdouble)(iViewPort[3]-point.y), (GLdouble)fdepth, dModelMatrix, dProjMatrix, iViewPort, &ObjectX, &ObjectY, &ObjectZ);
    if(ObjectX>=pView->m_pDoc->m_dModelMinX&&ObjectX<=pView->m_pDoc->m_dModelMaxX&&
       ObjectY>=pView->m_pDoc->m_dModelMinY&&ObjectY<=pView->m_pDoc->m_dModelMaxY&&
       ObjectZ>=pView->m_pDoc->m_dModelMinZ&&ObjectZ<=pView->m_pDoc->m_dModelMaxZ)
    {
    pp.x = ObjectX;
    pp.y = ObjectY;
    pp.z = ObjectZ;
    }
    else
    {
    pp.x = pView->m_pDoc->m_pRoamParameter->dMouseModelX;
    pp.y = pView->m_pDoc->m_pRoamParameter->dMouseModelY;
    pp.z = pView->m_pDoc->m_pRoamParameter->dMouseModelZ;
    }
    // pView->m_pDoc->m_pRoamParameter->dMouseModelX = (double)ObjectX;
    // pView->m_pDoc->m_pRoamParameter->dMouseModelX = (double)ObjectY;
    // pView->m_pDoc->m_pRoamParameter->dMouseModelX = (double)ObjectZ;
    glPopMatrix();
    iError = glGetError();
    if(iError!=GL_NO_ERROR)
    {
    // Errinfo = gluErrorString(iResultCode);
    ::MessageBox(NULL, (LPCTSTR)gluErrorString(iError), "提示13:", MB_OK);
    }
    wglMakeCurrent(ClientDC.m_hDC, NULL);//释放 RC,以便其它 DC 进行绘图
    return pp;
    }
      

  4.   

    #include <gl\glu.h>
    double Model[16],Proj[16];
    int View[4];

    glGetDoublev(GL_MODELVIEW_MATRIX,Model);
    glGetDoublev(GL_PROJECTION_MATRIX,Proj);
    glGetIntegerv(GL_VIEWPORT,View); float depth = 0.0;
    //读取深度信息
    glReadPixels(X, View[3]-Y-1, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &depth); double Coor[3]; // 返回值
    gluUnProject(X, View[3]-Y-1, depth, Model, Proj, View, Coor, Coor+1, Coor+1);
      

  5.   

    是啊,本人很感激同志们,向你们致敬 :) 那太平洋 兄能给我发一份完整代码吗 :)
    [email protected]
      

  6.   

    这个代码比较少啊 :) 能简单解释一下吗?
    double Coor[3];
    这个就是最后返回的三维点坐标
    最后一行错了,是
    gluUnProject(X, View[3]-Y-1, depth, Model, Proj, View, Coor, Coor+1, Coor+2);
    呵呵,不好意思大概流程就是先获得深度平面,然后定位具体坐标位置
      

  7.   

    我帖子上的代码已经很完整了,我再给你一些地址,上面有解释和更多的代码:
    http://community.csdn.net/Expert/topic/3146/3146805.xml?temp=.948559
    http://community.csdn.net/Expert/topic/3115/3115928.xml?temp=.6338007
    http://community.csdn.net/Expert/topic/3143/3143497.xml?temp=.9614374