whisper1215 2024-12-06 11:03 采纳率: 0%
浏览 19

利用osg库加载多个瓦片

求问c++中用osg库加载一个osgb文件的多个瓦片osgb到一个场景中时,应该如何做,目前我的做法是将osgb基本的瓦片文件读取,然后加载到一个osg::Group中进行保存最后渲染

img

但是在运行过程中,可以加载文件,但是渲染出的场景是空的,如下图

img

img

求问这是哪里出了问题,为啥想加载多个osgb场景就是空的,是因为没有规定他们的相对位置吗?按理来说osgb文件中本身不是已经包含了它本身的相对位置吗?
请问各位!感谢!
下面是我的代码

#include <osg/Node>
#include <osgDB/ReadFile>
#include <osgViewer/Viewer>
#include <iostream>
#include <filesystem>

namespace fs = std::filesystem;

// 判断文件是否是基本的瓦片,文件名与文件夹名一致
bool isBasicTile(const fs::path& filePath) {
    std::string folderName = filePath.parent_path().filename().string();
    std::string filename = filePath.stem().string();
    return folderName == filename; // 判断文件名与文件夹名是否一致
}

int main(int argc, char** argv) {
    if (argc < 2) {
        std::cerr << "Usage: " << argv[0] << " <base_path>" << std::endl;
        return 1;
    }

    // 获取根目录路径
    std::string basePath = argv[1];

    // 创建根节点
    osg::ref_ptr<osg::Group> root = new osg::Group();

    // 遍历给定目录
    for (const auto& entry : fs::recursive_directory_iterator(basePath)) {
        // 只加载符合规则的基本瓦片文件
        if (entry.is_regular_file() && entry.path().extension() == ".osgb" && isBasicTile(entry.path())) {
            std::string filePath = entry.path().string();
            std::cout << "Loading basic tile: " << filePath << std::endl;

            // 使用 OSG 加载瓦片文件
            osg::ref_ptr<osg::Node> tileNode = osgDB::readNodeFile(filePath);

            // 将每个符合条件的瓦片节点添加到根节点
            root->addChild(tileNode.get());
        }
    }

    // 创建 Viewer 并设置根节点为场景数据
    osgViewer::Viewer viewer;
    viewer.setSceneData(root.get());

    // 运行渲染循环
    return viewer.run();
}


  • 写回答

1条回答 默认 最新

  • 关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    从你提供的描述和代码来看,你在加载多个OSGB瓦片时遇到的问题可能与多个因素有关。以下是一些建议和可能的解决方案:

    1. 相对路径问题:虽然OSGB文件本身可能包含其相对位置的信息,但在加载时,你需要确保这些相对路径是正确的。在你的代码中,你正在使用文件系统的路径来检查瓦片文件,但在加载时,OSG可能需要根据某种方式解析这些相对路径。你可能需要确保你的路径是正确的,或者尝试使用绝对路径来加载瓦片。
    2. 瓦片文件完整性:确保所有OSGB瓦片文件都是完整的并且没有损坏。有时文件损坏或不完整可能导致加载失败。你可以尝试单独加载每个瓦片文件,以确定哪个文件是问题所在。
    3. OSG版本和兼容性:确保你使用的OSG版本与你的瓦片文件兼容。有时,不同的OSG版本可能会有不同的文件格式或加载机制。
    4. 加载错误处理:在你的代码中增加错误处理,以捕获在加载瓦片文件时可能出现的任何异常或错误。这样,你可以更清楚地了解哪些文件无法加载以及原因。
    5. 检查资源路径:确保所有依赖的资源(如纹理、模型等),如果OSGB文件中引用了这些资源,它们的路径也是正确的。
    6. 渲染场景为空:如果场景渲染为空,可能是因为瓦片没有被正确放置或渲染。你可以检查每个瓦片的坐标和位置,确保它们在场景中的位置是正确的。

    为了进一步诊断问题,你可以尝试以下操作:

    • 在加载每个瓦片后,检查tileNode是否为空或是否成功加载。
    • 使用OSG的日志系统或添加自己的日志输出,以查看在加载过程中是否有任何错误或警告。
    • 如果可能的话,尝试使用其他工具或软件打开OSGB文件,以检查文件是否损坏或不完整。

    希望这些建议能帮助你解决问题。如果问题仍然存在,你可能需要提供更多的信息或细节,以便更准确地诊断问题。

    评论

报告相同问题?

问题事件

  • 创建了问题 12月6日