科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件GIS三维地景仿真设计之建模及场景渲染

GIS三维地景仿真设计之建模及场景渲染

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文将根据已经读取的DEM数据完成建模及对场景的绘制渲染。

作者:青岛郎锐 来源:天极开发 2007年10月16日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
初始化地景列表并建模

  在法线向量和材质定义完毕后就可以进行最后的场景建模了。这里通过glNewList()和glEndList()定义一个新的显示列表的开始与结束,并再其中枚举每一个矩形网格单元,通过将网格单元左上角顶点与右下角顶点的连接而将一个矩形网格单元划分为两个小的三角形网格,由指定了GL_TRIANGLE_STRIP 参数的glBegin()和glEnd()对其进行定义。期间需要指定当前网格的各顶点坐标与法向向量:

glNewList(Terrain, GL_COMPILE); // 开始一个新的显示列表
for (int i = 0; i < m_nDemY - 1; i++) { // 绘制三角网格
 for(int j = 0; j < m_nDemX - 1; j++) {// 开始定义三角带
  glBegin(GL_TRIANGLE_STRIP);
  glNormal3d(m_pNormals[(i * m_nDemX + j) * 3 + 0], m_pNormals[(i * m_nDemX + j) * 3 + 1], m_pNormals[(i * m_nDemX + j) * 3 + 2]); // 设置当前法向向量
  glVertex3d(m_pDemX[i * m_nDemX + j], m_pDemY[i * m_nDemX + j], m_pDemH[i * m_nDemX + j]); // 定义顶点坐标
  glNormal3d(m_pNormals[((i + 1) * m_nDemX + j) * 3 + 0], m_pNormals[((i + 1) * m_nDemX + j) * 3 + 1], m_pNormals[((i + 1) * m_nDemX + j) * 3 + 2]);
  glVertex3d(m_pDemX[(i + 1) * m_nDemX + j], m_pDemY[(i + 1) * m_nDemX + j], m_pDemH[(i + 1) * m_nDemX + j]);
  glNormal3d(m_pNormals[(i * m_nDemX + j + 1) * 3 + 0], m_pNormals[(i * m_nDemX + j + 1) * 3 + 1], m_pNormals[(i * m_nDemX + j + 1) * 3 + 2]);
  glVertex3d(m_pDemX[i * m_nDemX + j + 1], m_pDemY[i * m_nDemX + j + 1], m_pDemH[i * m_nDemX + j + 1]);
glNormal3d(m_pNormals[((i + 1) * m_nDemX + j + 1) * 3 + 0], m_pNormals[((i + 1) * m_nDemX + j + 1) * 3 + 1],   m_pNormals[((i + 1) * m_nDemX + j + 1) * 3 + 2]);
  glVertex3d(m_pDemX[(i + 1) * m_nDemX + j + 1], m_pDemY[(i + 1) * m_nDemX + j + 1], m_pDemH[(i + 1) * m_nDemX + j + 1]);
  glEnd(); // 停止定义三角带
}
}
glEndList(); // 结束显示列表

  这里之所以要定义显示列表是因为经过这样的处理后OpenGL将把此由数量众多的节点组成的网格地景模型作为一个整体进行处理。也就是说,当需要重绘图形时,OpenGL将整体绘制而不是象CDC绘图一样去一个顶点一个顶点的绘制,显然这样的处理将极大提高图形的显示处理速度。


  在默认状态下OpenGL将以面去建模(如上图所示),如果需要查看不同的建模方式,如以点建模、以线建模和以面建模,可分别以GL_POINT、GL_LINE或GL_FILL调用glPolygonMode()并在之后重绘场景即可(下图分别为以线建模和以点建模的场景):

// 以点建模
glPolygonMode(GL_BACK, GL_POINT);
// 以线建模
glPolygonMode(GL_BACK, GL_LINE);
// 以面建模
glPolygonMode(GL_BACK, GL_FILL);

点击放大此图片

  小结

  本文主要介绍了对DEM数字高程模型数据的场景绘制方法。读者需要掌握的技术主要有:对法向量的计算、显示列表的创建与使用、材质的定义以及场景建模方式等。本文所述程序在Windows 2000 Professional + SP4下由Microsoft Visual C++ 6.0编译通过。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章