唉,做论文遇到很多问题,真不知道从何问起了。要是有个算法就好了。哪位大侠帮帮忙。

解决方案 »

  1.   

    前面的我倒是做出来了,但不知道效果怎么样?
    我根据每个点的重要度(到平均平面的距离)与自由度(包含此点的边的个数)来简化模型。
    不同参数的重要度与自由度简化出不同复杂程度的简化模型,我一共简化出五个。但是要做到动态的LOD细节层次。初步的想法应该是离视点近的地方采用较细致的模型,远的地方用比较粗的。通过与视点的距离来控制三角形的显示。但是后面的与OPENGL的联系比较紧,我对OPENGL不是很熟,一筹莫展。
      

  2.   

    既然模型简化做好了。那你的工作就完成了大部分了。ogl显示很容易。找一个程序框架,往里面填就行了。http://alphasun.port5.com/alphasun/glframemdi/index.htm  仅供参考。
      

  3.   

    你的那个FRAME我认真看了,但是如果我要显示鼠标所在点的坐标,该怎么办?我要显示的是模型所在坐标系的坐标,(应该是世界坐标系吧。)
      

  4.   

    gluUnProject 可以得到一个三维点,这个点和屏幕上的点重合。
      

  5.   

    原来的那个网站暂时不能访问了,如果要用的话 就用这个
    http://alphasun.port5.com/alphasun/index.htm
      

  6.   

    请问一下,有没有gluUnProject的例子?
    我正在做OpenGL三维交互,要算出鼠标点中的一个物体的三维坐标。我现在手上的例子只有和平鸽工作室编的两个简单程序:选择与反馈。我应该去哪里找资料?
      

  7.   

    是一个值得研究的领域,很有前途;
    Tieren_love(甜蜜程序员) :给你一个连接
    http://community.csdn.net/Expert/topic/3146/3146805.xml?temp=.1424677
      

  8.   

    syy64(太平洋) 我看了你那个连接里的获取模型坐标的代码,有点没搞清楚。屏幕点与模型点是怎么联系起来的?是垂直屏幕做垂线与模型相交得到的点吗?这是好久以前的贴子了,不好意思,这段时间在干别的事,没时间管这个,现在应该做些工作了。
      

  9.   

    不是,是opengl函数将屏幕点与模型点联系起来的。
      

  10.   

    我贴一下代码。我看晕了。我加了一个处理MouseMove事件:
    void CMeshView::OnMouseMove(UINT nFlags, CPoint point) 
    {
    GLfloat fdepth;
    GLdouble ObjectX, ObjectY, ObjectZ;
    GLint iViewPort[4];
    GLdouble dProjMatrix[16];
    GLdouble dModelMatrix[16];
    POINT iScreen;
    int iScrToWinX, iScrToWinY;
    long iError;
    SpaceDot pp; CClientDC ClientDC(this);
    wglMakeCurrent(ClientDC.m_hDC, 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); {
    pp.x = (float)ObjectX;
    pp.y = (float)ObjectY;
    pp.h = (float)ObjectZ;
    }
    glPopMatrix();
    iError = glGetError();
    if(iError!=GL_NO_ERROR)
    {
    ::MessageBox(NULL, (LPCTSTR)gluErrorString(iError), "提示13:", MB_OK);
    }
    wglMakeCurrent(ClientDC.m_hDC, NULL);//释放 RC,以便其它 DC 进行绘图 CString str;
    CMainFrame *pFrame = (CMainFrame *)AfxGetApp()->m_pMainWnd;
    CStatusBar *pStatus = &pFrame->m_wndStatusBar;
    int nIndex;
    if(pStatus)
    {
    str.Format("X=%f",pp.x);
    nIndex = pStatus->CommandToIndex(ID_MODEL_X);
    pStatus->SetPaneText(nIndex,str,TRUE);
    }
    CView::OnMouseMove(nFlags, point);
    }
    之后,在这里出错了:纹理绑定 // 纹理
    //***********************************
    unsigned int NbTexture = m_ArrayTexture.GetSize();
    if(NbTexture)
    {
    TRACE("SceneGraph : texture binding...(%d texture(s))\n",NbTexture); // 清除
    if(m_pIndexTextureBinding != NULL)
    {
    ::glDeleteTextures(NbTexture,m_pIndexTextureBinding);
    delete [] m_pIndexTextureBinding;
    m_pIndexTextureBinding = NULL;
    } if(m_bTexture)
    {
    m_pIndexTextureBinding = new unsigned int[NbTexture];

    ::glGenTextures(NbTexture,m_pIndexTextureBinding);
    int error = glGetError();
    ASSERT(error !=  GL_INVALID_VALUE);                            //error!!!!!
    ASSERT(error !=  GL_INVALID_OPERATION); TRACE("Bind texture...\n");
                               ........
                      }
            }     error == GL_INVALID_OPERATION
      

  11.   

    纹理绑定 // 纹理
    //***********************************
             CClientDC ClientDC(this);
    wglMakeCurrent(ClientDC.m_hDC, m_hGLContext); //使 RC 与当前 DC 相关联
       
    unsigned int NbTexture = m_ArrayTexture.GetSize();
    if(NbTexture)
    {
    TRACE("SceneGraph : texture binding...(%ld texture(s))\n",NbTexture); // 清除
    if(m_pIndexTextureBinding != NULL)
    {
    ::glDeleteTextures(NbTexture,m_pIndexTextureBinding);
    delete [] m_pIndexTextureBinding;
    m_pIndexTextureBinding = NULL;
    } if(m_bTexture)
    {
    m_pIndexTextureBinding = new unsigned int[NbTexture];

    ::glGenTextures(NbTexture,m_pIndexTextureBinding);
    int error = glGetError();
    ASSERT(error !=  GL_INVALID_VALUE);                            //error!!!!!
    ASSERT(error !=  GL_INVALID_OPERATION); TRACE("Bind texture...\n");
                               ........
                      }
            } wglMakeCurrent(ClientDC.m_hDC, NULL); //使 RC 与当前 DC 相关联
      

  12.   

    Thank you .
    确实是这样的。没有关联DC。