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

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 安卓13,动态广播无法接受
  • ¥50 docker运行容器端口如何映射(不重启服务、不重建容器)
  • ¥50 基于TwinCAT3实现力传感器的实时读取
  • ¥20 python求解八元一次不定方程,无数解中随机输出几组即可(相关搜索:用python)
  • ¥50 libreoffice导出PPTX到PDF中的错误换行问题
  • ¥15 python实现网页视频下载
  • ¥15 如何通过深度图获得物体的完整、正确点云?
  • ¥15 有没有操作系统适用白丁的经典的书籍,如何解决?(标签-学习)
  • ¥15 Catia V5 R20 64位 安装过程中选择orbix配置创建套接字失败
  • ¥100 C51单片机设计交通灯时出现的问题