【发布时间】:2022-07-24 23:30:02
【问题描述】:
我的应用程序生成 3D 模型流,例如 .obj 格式。每个模型都是一个带有纹理的 3D 网格。我想知道如何使用 OpenGL 显示/可视化 3D 模型流。我的想法只是按顺序加载 3D 模型,但我不确定如何实现。
【问题讨论】:
我的应用程序生成 3D 模型流,例如 .obj 格式。每个模型都是一个带有纹理的 3D 网格。我想知道如何使用 OpenGL 显示/可视化 3D 模型流。我的想法只是按顺序加载 3D 模型,但我不确定如何实现。
【问题讨论】:
您需要从 obj 文件加载 3D 模型的代码。 要么自己写,要么在网上找一个实现。搜索例如"obj 模型解析 c++"。
关于 obj 格式的规范,您可以在这里查看: https://en.wikipedia.org/wiki/Wavefront_.obj_file
每个模型都应该像这样加载到一个类的实例中:
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...
};
所有模型都可以存储在std::vector<Model>中。
您的应用程序应该有一个用于渲染的计时器。
每次你需要渲染一帧你需要确定要渲染哪个模型,
基于经过的时间和每秒帧数。
选择模型时,可以使用Model的接口进行渲染。
如果您有很多模型并且不想占用太多内存,您可以进行延迟加载(仅在需要时从文件加载)。 这种技术需要在单独的线程(即缓冲)上提前加载一些帧。 否则,您的播放将不会很流畅,因为您需要等待加载 obj 文件,这可能需要一些时间。
【讨论】:
glBindBuffer、glBufferData 等 API 完成的。如果您成功渲染了第一个模型,您应该熟悉它们。