【问题标题】:Load a series of 3D models using OpenGL (Streaming 3D model?)使用 OpenGL 加载一系列 3D 模型(流式 3D 模型?)
【发布时间】:2022-07-24 23:30:02
【问题描述】:

我的应用程序生成 3D 模型流,例如 .obj 格式。每个模型都是一个带有纹理的 3D 网格。我想知道如何使用 OpenGL 显示/可视化 3D 模型流。我的想法只是按顺序加载 3D 模型,但我不确定如何实现。

【问题讨论】:

    标签: c++ opengl


    【解决方案1】:
    1. 您需要从 obj 文件加载 3D 模型的代码。 要么自己写,要么在网上找一个实现。搜索例如"obj 模型解析 c++"。

      关于 obj 格式的规范,您可以在这里查看: https://en.wikipedia.org/wiki/Wavefront_.obj_file

    2. 每个模型都应该像这样加载到一个类的实例中:

    class Model
    {
    public:
        bool LoadObj(std::string const & filename);
         
        using VertexPosition = std::array<float, 3>;
        std::vector<VertexPosition> const &  GetVerticesPositions();
         
        using VertexColor = std::array<unsigned char, 4>;
        std::vector<VertexColor> const & GetVerticesColors();
        
        using FaceIndices = std::array<int, 3>;
        std::vector<FaceIndices> const & GetFacesIndices();
        
        using VertexUV = std::array<float, 2>;
        std::vector<VertexUV> const & GetVerticesUVs();
         
        int GetTextureWidth();
        int GetTextureHeight();
        unsigned char const * GetTextureData();
         
        // etc...
    };
    
    1. 所有模型都可以存储在std::vector&lt;Model&gt;中。

    2. 您的应用程序应该有一个用于渲染的计时器。 每次你需要渲染一帧你需要确定要渲染哪个模型, 基于经过的时间和每秒帧数。 选择模型时,可以使用Model的接口进行渲染。

    3. 如果您有很多模型并且不想占用太多内存,您可以进行延迟加载(仅在需要时从文件加载)。 这种技术需要在单独的线程(即缓冲)上提前加载一些帧。 否则,您的播放将不会很流畅,因为您需要等待加载 obj 文件,这可能需要一些时间。

    【讨论】:

    • 感谢您的回复。目前,我可以加载 .obj 格式的 3D 模型并使用 OpenGL 绘制 + 渲染 3D 模型。我也可以在 obj 中加载下一个 3D 模型,但我一直在绘制新模型。我想我需要清理窗口并绘制新模型。但不太确定该怎么做。顺便说一句,每个 3D 模型都加载到 VOB 中。
    • 每次为下一帧渲染新模型时,都需要将所有缓冲区(索引、顶点位置等)传输到 opengl。这是使用 glBindBufferglBufferData 等 API 完成的。如果您成功渲染了第一个模型,您应该熟悉它们。
    • 是的,glBindBuffer 和 glBufferData 是我用来创建 VOB 的函数。目前,我可以分别加载和渲染当前和下一个 3D 模型。但我被困在试图一一展示它们。
    • 我不明白到底出了什么问题。您说您设法将数据推送到 opengl 并渲染第一帧。如果你推送下一帧数据并尝试以相同的方式渲染,你会看到什么?
    • 抱歉不清楚。为简单起见,我假设所有 3D 模型都可用,所以我只是预先加载所有帧的数据并尝试像做动画一样按顺序显示它们。画完第一帧后,我尝试擦除第一帧并绘制下一帧......问题是所有模型都会同时出现。
    猜你喜欢
    • 1970-01-01
    • 2016-11-18
    • 1970-01-01
    • 2013-02-24
    • 2012-05-01
    • 2012-03-26
    • 1970-01-01
    • 1970-01-01
    • 2018-05-11
    相关资源
    最近更新 更多