查看: 1387|回复: 1

OSG绘制地形问题

[复制链接]

该用户从未签到

发表于 2011-6-22 11:03:00 | 显示全部楼层 |阅读模式
采用OSG将一个3000*3000的DEM绘制成地形。没有LOD, 我的代码主要分两步,生成顶点数组,生成顶点索引 。下面是代码


1  生成顶点数组

  1. osg::ref_ptr<osg :: Vec3Array> vecArray=new osg::Vec3Array(this->nrows*this->ncols);   //nrows=3000,ncols=30000
  2. int vi=0;
  3. for (int i=0;i<nrows;i++)
  4. {
  5.   for (int j=0;j<ncols;j++)
  6.   {
  7.    //1
  8.    int row=i;
  9.    int col=j;
  10.    float x,y;
  11.    GetXYCoorByColRow(col,row,x,y);
  12.    float z=GetHeightByColRow(col,row);
  13.    if (z==noDataValue)
  14.    {
  15.     z=minHeight;
  16.    }
  17.    osg::Vec3f v1(x,y,z);
  18.    
  19.    (*vecArray)[vi]=v1;
  20.    /*  osg::Vec4 cv1;
  21.    this->heightRenderByColor.SetVertexColor(z,cv1);

  22.   (*colorArray)[vi]=cv1;*/
  23.    vi++;   

  24.   }
  25. }
复制代码


2 生成geometry


  1. osg::ref_ptr<osg::Geometry> geo=new osg::Geometry;
  2. geo->setVertexArray(v);
  3. // geo->setColorArray(cv);
  4. //geo->setColorBinding(osg::Geometry::BIND_PER_VERTEX);
  5. for(int r=0;r<nrows-1;++r)
  6. {
  7.   osg:rawElementsUInt& drawElements = *(new osg:rawElementsUInt(GL_QUAD_STRIP,2*ncols));
  8.   geo->addPrimitiveSet(&drawElements);
  9.   int ei=0;
  10.   for(int c=0;c<ncols;++c)
  11.   {
  12.    
  13.        drawElements[ei++] = (r)*ncols+c;
  14.        drawElements[ei++] = (r+1)*ncols+c;
  15.   
  16.    
  17.   }
  18. }


  19. geo->setUseDisplayList(false);
  20. geo->setUseVertexBufferObjects(true);
复制代码


现在的问题是,因为3000*3000的DEM有900万个顶点,我是将这900万个顶点全部放到了vec3array中,怀疑这样会带来很大性能问题, 还有就是,程序是循环DEM的行,然后生成了3000个PrimitiveSet ,这样的方式是否合理,该如何修改能够提高效率,现在的问题是,程序一运行上面的第2步时就卡住了,  谢谢。

该用户从未签到

发表于 2011-6-22 14:28:29 | 显示全部楼层
提示效率的方法有很多种,建立基于视点连续LOD简化算法等,关于几何体绘制,你先看osganimate这个例子吧~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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