查看: 5667|回复: 1

osg地形问题求助

[复制链接]

该用户从未签到

发表于 2011-5-17 11:54:50 | 显示全部楼层 |阅读模式
本帖最后由 CWorld 于 2011-5-17 12:02 编辑

问题描述:   我的地形很小,不想用vpb生成lod的地形,于是我使用直接读取高度图的方法。但是想像Global_mapper那样根据海拔产生颜色,用Geometry时,不知道为什么地形发生了形变。
   希望达到的效果,类似于我们使用Global_mapper查看的影子。
   但是在OSG里,如果直接读取高度图,即
          osgDB::Registry::instance()->getReaderWriterForExtension("gdal");
        osg::ref_ptr<osg::HeightField> hf = osgDB::readHeightFieldFile("topo.asc");
   则渲染的地形没有颜色,具体见附件二。

  应对方法,我参考osgTerrain的Example, 像转换为Geometry,然后根据每个点的高度来设置颜色,但是地形的形状就发生了变化,具体见附件三。

这次有图也有代码实现,请大家帮我分析分析,这是什么原因?

code:
          osgDB::Registry::instance()->getReaderWriterForExtension("gdal");
          osg::ref_ptr<osg::HeightField> hf = osgDB::readHeightFieldFile("topo.asc");
   
   unsigned int numColumns ;
         unsigned int numRows ;

         osg::Geometry* geometry = new osg::Geometry;

          numColumns=hf->getNumColumns();
          numRows=hf->getNumRows();

          osg::Vec3Array& v = *(new osg::Vec3Array(numColumns*numRows));
          osg::Vec4ubArray& color = *(new osg::Vec4ubArray(1));

          unsigned int r;
          unsigned int c;

          //设置颜色与高度的关系
          color[0].set(255,255,255,255);
          osg::Vec3 pos = origin2;
          int vi=0;

          for(r=0;r<numRows;++r)
          {
                  for(c=0;c<numColumns;++c)
                  {
                          v[vi]=hf->getVertex(c,r);        
                          ++vi;
                  }
          }

          geometry->setVertexArray(&v);
          geometry->setColorArray(&color);
          geometry->setColorBinding(osg::Geometry::BIND_OVERALL);

          for(r=0;r<numRows-1;++r)
          {
                  osg:rawElementsUShort& drawElements = *(new osg::DrawElementsUShort(GL_QUAD_STRIP,2*numColumns));
                  geometry->addPrimitiveSet(&drawElements);
                  int ei=0;
                  for(c=0;c<numColumns;++c)
                  {
                          drawElements[ei++] = (r+1)*numColumns+c;
                          drawElements[ei++] = (r)*numColumns+c;
                  }
          }

          geode->addDrawable(geometry);
          osgUtil::SmoothingVisitor sv;
          sv.smooth(*geometry);

希望的效果

希望的效果
2.png
3.png

该用户从未签到

发表于 2011-5-21 23:24:51 | 显示全部楼层
然后根据每个点的高度来设置颜色
我想您显然应该用BIND_PER_VERTEX的形式,此外这个功能我很早以前用shader也实现过,效果还不错,呵呵
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表