用c++在Opengl平台实现的三维物体的显示,下面要实现一个功能:即,三维体的三维坐标点信息是已经知道存在的,不需要计算,要实现当鼠标放在三维体中的某一点上时,同时显示这一三维点的坐标信息,该怎么实现呢?
望高位高手指导!

解决方案 »

  1.   

    不知道OpenGL的GL_SELECT绘图模式能不能点拾取,楼主可以试试(可以参考一下讲拾取的文章,比如这个:http://jerome.jouvie.free.fr/OpenGl/Tutorials/Tutorial27.php)。
    如果不行的话还有个思路:需要进行拾取判断的绘制时把三维物体的贴图啊,混合什么的都关了,然后把所有点都给上一个唯一的颜色值,用点模式绘制,然后用glReadPixels结合鼠标位置取颜色,看取出来的是什么颜色就是对应的哪个点。
      

  2.   

    GLint iViewPort[4];  
    GLdouble dModelMatrix[16];  
    GLdouble dProjMatrix[16];  
    GLfloat winX, winY;  
    glPushMatrix();
    glGetIntegerv(GL_VIEWPORT, iViewPort); //获得视
    glGetDoublev(GL_MODELVIEW_MATRIX, dModelMatrix); //获得视图模型矩阵
    glGetDoublev(GL_PROJECTION_MATRIX, dProjMatrix);//获得投影矩阵
    glPopMatrix();
        winX = (float)pointx;  
    winY = (float)iViewPort[3] - (float)pointy;
    glReadPixels(winX,//x坐标  
    int(winY),//y坐标  
    1,1,//读取一个像素  
    GL_DEPTH_COMPONENT,//获得深度信息  
    GL_FLOAT,//数据类型为浮点型  
    &winZ);//获得的深度值保存在winZ中  
    gluUnProject((GLdouble)winX,(GLdouble)winY,(GLdouble)winZ,dModelMatrix,dProjMatrix,iViewPort,&posX,&posY,&posZ);  
    为什么我这样得到的三维坐标点不正确呢?
      

  3.   

    我开始说的用唯一颜色直接画所有的点就可以保证,只要是光栅化后留在framebuffer上的像素点,read鼠标位置回来的像素点的颜色就是画的时候指定的颜色,也就是鼠标位置的点。
      

  4.   

    那就是用画点时得用glRendModel设为选择模式吧?而且选择模式返回的只是标记的名字啊,不能返回坐标信息啊?
    如果用gluUnProject函数的话又该怎么实现呢?有什么要特别注意的地方呢
      

  5.   

    gluUnProject这个我没用过。点的坐标不是你绘图时提交的数据么?为每个点配上一个唯一的颜色,然后再光栅化后查看鼠标位置的像素点的颜色,然后再反查一遍是哪个点的不就有坐标信息了?
      

  6.   

    http://library.forum.nokia.com/index.jsp?topic=/S60_5th_Edition_Cpp_Developers_Library/GUID-441D327D-D737-42A2-BCEA-FE89FBCA2F35/OpenGLEx/PickSelect/doc/a_pick_select_8cpp-source.html
    这个是nokia的opengl es拾取实例,性质类似,你可以参考一下。
    这个拾取的时候画不带贴图等状态的处理只是针对判断鼠标位置的点用的,并不会被实际显示在屏幕上,所以不会影响实际表现。