求将dem导入opengl,生成三维地形图的代码。这是一个老问题了, SeainBlue(爱海)等以前回答过的朋友再帮个忙。也请其他的朋友帮助一下。谢谢了。

解决方案 »

  1.   

    dem就是一个网格数据点啊,网格间距已知的
    按照三角带组织成显示数据,绘制效率比较高
      

  2.   

    here, it is 
      http://www.cs.arizona.edu/topovista/
    A DEM viewer with source code, plus a paper on Right-triangulated Irregular Networks.
      

  3.   

    关于dem文件的格式,可以看这个网站
      http://www.vterrain.org/Elevation/dem.html
      

  4.   

    谢谢楼上的指点,我已经看过了,与我求的有较大差距,but thank you all the same我想求的是c++代码,谢谢 happy__888([顾问团]寻开心)热心帮忙。
      

  5.   

    void CDEMObj::MakeModelTexture(CSetOpenGLEnv & Env)
    {
    int m,n;
    double kx,ky;
    CPoint3D tDP;
    int Cm0,Cn0,Cm,Cn;
    lShowRelution = (int)(Env.RoamGesture.DistStareEye/(30 * dStepX));
    if(lShowRelution < 1) lShowRelution = 1;
    Cm0 = (int)((Env.LookSizeLB.x - DemOriPoint3D.x)/dStepX);
    Cm0 = (int)(Cm0/lShowRelution) * lShowRelution;
    if(Cm0 < 0) Cm0 = 0;
    if(Cm0 > lColDem) return;
    Cm  = (int)((Env.LookSizeUR.x - DemOriPoint3D.x)/dStepX) +1;
    if(Cm  > lColDem) Cm = lColDem;
    if(Cm  < 0) return; Cn0 = (int)((Env.LookSizeLB.y - DemOriPoint3D.y)/dStepY);
    Cn0 = (int)(Cn0/lShowRelution) * lShowRelution;
    if(Cn0 < 0) Cn0 = 0;
    if(Cn0 > lRowDem) return;
    Cn  = (int)((Env.LookSizeUR.y - DemOriPoint3D.y)/dStepY) +1;
    if(Cn  > lRowDem) Cn = lRowDem;
    if(Cn  < 0) return; if(Cn == Cn0 || Cm == Cm0) return;
    if(lShowRelution > (Cn-Cn0)/2) lShowRelution = (Cn-Cn0)/2;
    if(lShowRelution > (Cm-Cm0)/2) lShowRelution = (Cm-Cm0)/2;
    if(lShowRelution < 1) lShowRelution = 1;
    //打开纹理映射开关
    glDisable(GL_COLOR_MATERIAL);
    glEnable(GL_TEXTURE_2D);
    if(pTextureInfo == NULL) pTextureInfo = Env.pDefTex;
    glBindTexture(GL_TEXTURE_2D,pTextureInfo->uiBindID);
    kx =1.0/(pTextureInfo->lCol*dResolution);
    ky =1.0/(pTextureInfo->lRow*dResolution);
    tDP = DemOriPoint3D - TexOriPoint3D;
    for(n=Cn0;n<Cn-lShowRelution;n += lShowRelution)
    {
    glBegin (GL_TRIANGLE_STRIP);       
    for(m=Cm0;m<Cm;m += lShowRelution)
    {  
    glNormal3fv(pppfNorVec[n+lShowRelution][m]);  
    glTexCoord2d((m*dStepX+tDP.x)*kx, ((n+lShowRelution)*dStepY+tDP.y)*ky);   
    glVertex3dv(pppdCoords[n+lShowRelution][m]);
    glNormal3fv(pppfNorVec[n][m]);
    glTexCoord2d((m*dStepX+tDP.x)*kx,(n*dStepY+tDP.y)*ky);    
    glVertex3dv(pppdCoords[n][m]);
    }
    if(m != Cm)
    {
    m -= lShowRelution;
    glNormal3fv(pppfNorVec[n+lShowRelution][Cm-1]);  
    glTexCoord2d(((Cm-1)*dStepX+tDP.x)*kx, ((n+lShowRelution)*dStepY+tDP.y)*ky);   
    glVertex3dv(pppdCoords[n+lShowRelution][Cm-1]);
    glNormal3fv(pppfNorVec[n][Cm-1]);
    glTexCoord2d(((Cm-1)*dStepX+tDP.x)*kx,(n*dStepY+tDP.y)*ky);    
    glVertex3dv(pppdCoords[n][Cm-1]);
    }
    glEnd();
    }
    if(n != Cn- lShowRelution)
    {
    n -= lShowRelution;
    glBegin (GL_TRIANGLE_STRIP);       
    for(m=Cm0;m<Cm;m += lShowRelution)
    {  
    glNormal3fv(pppfNorVec[Cn-1][m]);  
    glTexCoord2d((m*dStepX+tDP.x)*kx,((Cn-1)*dStepY+tDP.y)*ky);    
    glVertex3dv(pppdCoords[Cn-1][m]);
    glNormal3fv(pppfNorVec[n][m]);
    glTexCoord2d((m*dStepX+tDP.x)*kx,(n*dStepY+tDP.y)*ky);    
    glVertex3dv(pppdCoords[n][m]);
    }
    if(m != Cm)
    {
    m -= lShowRelution;
    glNormal3fv(pppfNorVec[Cn-1][Cm-1]);  
    glTexCoord2d(((Cm-1)*dStepX+tDP.x)*kx,((Cn-1)*dStepY+tDP.y)*ky);    
    glVertex3dv(pppdCoords[Cn-1][Cm-1]);
    glNormal3fv(pppfNorVec[n-lShowRelution][Cm-1]);
    glTexCoord2d(((Cm-1)*dStepX+tDP.x)*kx,((n-lShowRelution)*dStepY+tDP.y)*ky);    
    glVertex3dv(pppdCoords[n-lShowRelution][Cm-1]);
    }
    glEnd();
    }
    }