osgVerse显示地球

 前言

     osgVerse实现了一种轻量级的地球可视化方案。该方案通过实现TMS(Tile Map Service)插件,采用动态LOD(Level of Detail)层级构建技术,构建地球瓦片系统。与osgEarth相比,osgVerse实现地球可视化的区别在于:1)完全基于OSG的插件体系构建地球瓦片系统;2)未像osgEarth一样对着色器进行封装而自成一套系统;3)完全采用DatabasePager来实现瓦片的调度。本章将重点解析osgVerse基于OSG插件机制实现地球瓦片系统的动态构建逻辑。


目录

  • 1 在osgverse中显示地球
  • 2  tms插件实现地球瓦片系统的动态构建

1 osgverse中显示地球

      命令如下:

.\osgviewer.exe 0-0-0.verse_tms -O "URL=https://webst01.is.autonavi.com/appmaptile?style%3d6&x%3d{x}&y%3d{y}&z%3d{z} UseWebMercator=1 UseEarth3D=1"

   

2 tms插件实现地球瓦片系统的动态构建

    virtual ReadResult readNode(const std::string& path, const Options* options) const
    {
        std::string fileName(path);
        std::string ext = osgDB::getLowerCaseFileExtension(path);
        if (!acceptsExtension(ext)) return ReadResult::FILE_NOT_HANDLED;

        bool usePseudo = (ext == "verse_tms");
        if (usePseudo)
        {
            fileName = osgDB::getNameLessExtension(path);
            ext = osgDB::getLowerCaseFileExtension(fileName);
        }

        std::vector<std::string> values; osgDB::split(fileName, values, '-');
        if (options && values.size() > 2)
        {
            int x = atoi(values[0].c_str()) * 2, y = atoi(values[1].c_str()) * 2,
                z = (values[2] == "x") ? 0 : atoi(values[2].c_str()) + 1, countY = 2;
            std::string pseudoAddr = options->getPluginStringData("URL"); bool changed = true;
            while (changed) pseudoAddr = replace(pseudoAddr, "%3d", "=", changed);

            osg::Vec3d extentMin = osg::Vec3d(-180.0, -90.0, 0.0), extentMax = osg::Vec3d(180.0, 90.0, 0.0);
            std::string strX = options->getPluginStringData("FlatExtentMinX"),
                        strY = options->getPluginStringData("FlatExtentMinY");
            if (!strX.empty()) extentMin[0] = atof(strX.c_str()); if (!strY.empty()) extentMin[1] = atof(st
可以利用osgVerse中的osgdb_3dtiles插件在平台内加载3dtiles。具体步骤如下: 1. **获取3DTiles数据**:可从数据下载地址https://pdmap.pland.gov.hk/PLANDWEB/public/3d_photo_realistic_models/cesium/tile_20_28_CESIUM.zip 下载公开的3dtiles数据。 2. **使用插件加载**:插件有针对不同字段的处理函数,例如针对 "content" 和 "Childeren" 的处理函数 `osg::Node* createTile(picojson::value& root, const std::string& prefix, const std::string& name)` 和 `osg::Node* createTileChildren(picojson::array& children, const std::string& name, const osgDB::Options* localOptions)`;针对 "RTC_CENTER" 的处理,3dtile插件会将根节点的 "RTC_ROOT" 标记为 true,`LoadSceneGlTF.cpp` 会根据设置的标记进行相应操作。通过这些处理函数和机制,按照osg的场景结构来显示3dtiles [^1]。 ### 代码示例 虽然引用中未给出完整代码,但可推测相关代码调用逻辑如下: ```cpp // 假设存在osgdb_3dtiles插件相关的头文件 #include <osgDB/ReadFile> #include <osg/Node> #include <picojson.h> // 假设createTile和createTileChildren函数已定义 osg::Node* createTile(picojson::value& root, const std::string& prefix, const std::string& name); osg::Node* createTileChildren(picojson::array& children, const std::string& name, const osgDB::Options* localOptions); // 加载3DTiles的示例函数 osg::Node* load3DTiles(const std::string& dataPath) { // 读取3DTiles的JSON文件,这里简单假设已读取为picojson::value picojson::value root; // 实际中需要实现从文件读取并解析为picojson::value的逻辑 // 调用createTile函数创建节点 osg::Node* tileNode = createTile(root, "", ""); return tileNode; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

CHPCWWHSU

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

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

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

打赏作者

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

抵扣说明:

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

余额充值