OSG学习笔记-Group(2-3-4)-PagedLOD

本文档介绍了osg::PagedLOD节点的使用,它是一种细节层次节点,用于处理大规模数据,特别是在地形和GIS应用中。PagedLOD不同于osg::LOD,它将每个细节层次节点存储为独立的磁盘文件,根据视点动态加载所需内容。示例程序展示了如何创建一个包含三个级别的PagedLOD场景,并将其保存到磁盘上,以实现按需加载和卸载数据。
摘要由CSDN通过智能技术生成

OSG学习笔记-Group(2-3-4)-PagedLOD

2.3.11 分页细节层次节点

分页细节层次节点(osg::PagedLOD)继承自osg::LOD节点,它也是一个细节层次节点,用于实现动态分页加载,根据视点来加载所需要的,分页细节层次节点中还可以包含LOD节点。它与osg::LOD节点的区别是:osg::LOD节点存在于一个文件中,osg::PagedLOD的每个节点都是磁盘中的文件,可以根据需要来加载这些文件,加载过程中有单独的线程负责实时调度与加载

分页细节层次节点主要是用来处理大规模的数据,在地形和GIS方面有广泛的应用。可以把模型进行预处理,在渲染场景时,再根据需要来实现实时加载需要的数据及卸载无用的数据。

在示例程序中,把PagedLOD节点写到磁盘上,以便与2.3.10的程序输出的LOD节点相比较。通过比较可以看出,osg::LOD节点存在于一个文件中,而PagedLOD节点只提供索引的作用,每个LOD节点存在于磁盘文件中,但不把文件存在一个文件中。

2.3.12 分页细节层次节点示例

#include<osgViewer/Viewer>
#include<osg/Node>
#include<osg/Group>
#include<osg/Geode>
#include<osg/PagedLOD>
#include<osg/PositionAttitudeTransform>
#include<osg/MatrixTransform>
#include<osgDB/ReadFile>
#include<osgDB/WriteFile>
#include<osgGA/TrackballManipulator>
#include<osgUtil/Optimizer>
#include<iostream>

// 创建三级PagedLOD场景
osg::ref_ptr<osg::Group>createPagedLOD()
{
    // 创建PagedLOD对象
    osg::ref_ptr<osg::PagedLOD>page = new osg::PagedLOD();
    page->setCenter(osg::Vec3(0.0f,0.0f,0.0f));
    
    // 添加节点设置0级的内容为cow.osg
    page->setFileName(0,"cow.osg");
    // 设置可视变化范围0-50
    page->setRange(0,0.0f,50.0f);
    
    // 添加节点,设置1级的内容为spaceship.osg
    page->setFileName(1,"glider.osg");
    page->setRange(1,50.0f,100.0f);
    
    // 添加节点,设置2级的内容为cessna.osg
    page->setFileName(2,"cessna.osg");
    page->setRange(2,100.0f,200.0f);
    
    return page.get();
}
//-----------------------------------------------------
int main()
{
    osg::ref_ptr<osgViewer::Viewer>viewer = new osgViewer::Viewer();
    osg::ref_ptr<osg::Group>root = new osg::Group();
    
    // 创建矩阵变换节点
    osg::ref_ptr<osg::MatrixTransform> mt = new osg::MatrixTransform();
    mt->addChild(createPagedLOD());
    osg::Matrix m;
    m.makeRotate(60.0f,0.0f,0.0f,1.0f);
    mt->setMatrix(m);
    
    // 添加PagedLOD场景
    root->addChild(mt.get());
    
    // 写入Page的LOD场景
    osgDB::writeNodeFile(*root,"page.osg");
    
    // 优化场景数据
    osgUtil::Optimizer optimizer;
    optimizer.optimize(root.get());
    
    viewer->setSceneData(root.get());
    viewer->realize();
    viewer->run();
    
    return 0;
}
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

听风者868

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值