baidu_27304211 2023-02-25 20:48 采纳率: 26.7%
浏览 131
已结题

Dem和dom如何生成流畅的osgb(语言-c++)

目前很多工具可以实现dem加dom生成osgb,生成的osgb数据浏览起来非常流畅;
我目前只会比较low的方法,先用dem和dom生成obj数据,然后用osgblab等软件或者osgconv简单的将obj转换成osgb数据,但这些方法生产的osgb数据浏览起来都非常卡;
请指教一下如何解决大数据量osgb浏览流畅性的问题,如果能有现成的代码指点一下更感激不尽!

  • 写回答

4条回答 默认 最新

  • 「已注销」 2023-02-25 22:44
    关注

    参考GPT和自己的思路,在处理大数据量的OSGB文件时,可以尝试以下几个方法来提高浏览流畅性:

    使用LOD(Level of Detail)技术
    使用LOD技术可以在保持地形数据的精度的同时,减少需要渲染的顶点数量,从而提高渲染效率。可以将地形数据划分为不同的层级,根据视野范围和距离来选择渲染哪一层的数据。

    使用纹理
    使用纹理可以减少需要渲染的顶点数量,从而提高渲染效率。可以将纹理与高度图结合使用,将高度信息编码为不同颜色的像素,然后在渲染时使用纹理来代替大量的顶点。

    使用批处理
    在渲染大量的顶点时,可以使用批处理来优化性能。将需要渲染的顶点打包成一个批次,然后一次性提交给GPU来渲染。

    优化地形数据格式
    优化地形数据格式可以减少数据的大小,从而提高读取和渲染效率。可以将地形数据压缩成更小的格式,如LZ4、Snappy等。

    以下是一些代码示例,用于优化OSGB浏览的性能:

    使用LOD技术:

    osg::Geometry* createTerrainGeometry(osg::HeightField* heightField, float xInterval, float yInterval)
    {
        osg::LOD* lod = new osg::LOD();
        lod->addChild(createTerrainGeometry(heightField, xInterval, yInterval, 0, 0, heightField->getNumColumns() - 1, heightField->getNumRows() - 1), 0, FLT_MAX);
        for (int level = 1; level < 10; level++)
        {
            int step = pow(2, level);
            osg::ref_ptr<osg::Geometry> geom = createTerrainGeometry(heightField, xInterval, yInterval, 0, 0, heightField->getNumColumns() - 1, heightField->getNumRows() - 1, step);
            float distance = 500 * level;
            lod->addChild(geom.get(), distance, FLT_MAX);
        }
        return lod;
    }
    

    使用纹理:

    osg::Texture2D* createTexture(osg::Image* image)
    {
        osg::Texture2D* texture = new osg::Texture2D();
        texture->setImage(image);
        texture->setWrap(osg::Texture::WRAP_S, osg::Texture::REPEAT);
        texture->setWrap(osg::Texture::WRAP_T, osg::Texture::REPEAT);
        return texture;
    }
    

    使用批处理:

    osg::ref_ptr<osg::DrawElementsUInt> indices = new osg::DrawElementsUInt(osg::PrimitiveSet::TRIANGLES, 0);
    for (unsigned int i = 0; i < vertices.size(); i++)
    {
        indices->push_back(i);
    }
    osg::ref_ptr<osg::Geometry> geometry = new osg::Geometry();
    geometry->setVertexArray(vertices.get());
    geometry->setNormal
    

    如果对您有帮助,请给与采纳,谢谢。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 3月7日
  • 已采纳回答 2月27日
  • 修改了问题 2月25日
  • 创建了问题 2月25日

悬赏问题

  • ¥15 乘性高斯噪声在深度学习网络中的应用
  • ¥15 运筹学排序问题中的在线排序
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
  • ¥30 求一段fortran代码用IVF编译运行的结果
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥30 python代码,帮调试,帮帮忙吧