使用OpenGL中glVertex3f((GLfloat)(x),(GLfloat)(y),(GLfloat)(z));绘制的三维点,用glRotatef(xrof,1.0f,0.0f,0.0f);//x轴等实现旋转,glScalef(m_ScaleX,m_ScaleY,m_ScaleZ);实现缩放,
现在在屏幕上如何任意选取已经绘制的单元??
如何将屏幕的二维坐标转换为空间三维坐标??
有实例的话发到:[email protected],万分感谢?

解决方案 »

  1.   

    用选择模式。
    用gluproject 和 gluunproject 函数
      

  2.   

    我也在搞这一个被烦死了,将屏幕二维转化为三维坐标很复杂,仅仅gluProject和gluUnProject函数搞不定,还涉及到从人眼出发的射线和所画图相交的点的求取。请高手指点!!顶!!
      

  3.   

    我也做这个,不过刚刚起步,也不知道怎么做。请高手指点,有资料更好。Thanks!
      

  4.   

    // 获取光标位置的模型坐标。 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;
    }