c++ - 为什么 blender .obj 文件中 vt 和 v 元素的数量不同?

标签 c++ opengl blender

按照教程的说明操作 https://www.youtube.com/watch?v=yc0b5GcYl3U (How To Unwrap A UV Sphere In Blender) 我成功地在 blender 程序中生成了一个带纹理的球体。

现在我想在我的 openGL C++ 程序中使用它。为此,我遵循了教程 http://en.wikibooks.org/wiki/OpenGL_Programming/Modern_OpenGL_Tutorial_Load_OBJexported为了将球体保存为 .obj 文件(使用上述教程中所述的三角测量导出选项),​​并高兴地在结果中发现了很多“v”、“vt”和“f”行。

然而,在解析文件时我发现了预期结构“fa/at b/bt c/ct”的 642 个顶点 (v)、561 个“纹理顶点”(vt)[ 和 1216 个元素行 (f)]。

令我困惑的是:我对 openGL 的天真理解告诉我,纹理对象上的每个点在空间中都有一个位置(顶点),在纹理上有一个位置(UV 点)。因此,我真的希望 vs 和 vts 的数量匹配。但他们没有:642!=561。怎么可能?

最佳答案

因为 OBJ 和 OpenGL 使用不同的“顶点”定义,并以不同方式处理索引。

在下面的解释中,我将顶点的坐标称为“位置”,即OBJ格式的v记录中的值。

目标

OBJ 顶点/索引模型的主要特点是它对不同的顶点属性(位置、法线、纹理坐标)使用单独的索引。

这意味着您可以拥有不同大小的独立位置和纹理坐标列表。该文件只需列出每个唯一位置一次,每个唯一纹理坐标对一次。

然后通过指定3 索引定义顶点:位置、纹理坐标和法线各一个。

OpenGL

另一方面,OpenGL 使用一组索引,它引用完整的顶点。

顶点由其位置、纹理坐标和法线定义。因此,位置、纹理坐标和法线的每个独特组合都需要一个顶点。

转化

当您读取用于 OpenGL 渲染的 OBJ 文件时,您需要为位置、纹理坐标和法线的每个唯一组合 创建一个顶点。由于它们由 f 记录中的索引引用,因此您需要为在那些 f 记录中找到的每个唯一索引三元组创建一个 OpenGL 顶点。对于这些顶点中的每一个,您使用从 OBJ 文件中读取的给定索引处的位置、纹理坐标和法线。

我在这里的旧答案包含伪代码来说明这个过程:OpenGL - Index buffers difficulties .

关于c++ - 为什么 blender .obj 文件中 vt 和 v 元素的数量不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29867926/

相关文章:

c++ - 如何从 D11 纹理为英特尔 MFT 编码器创建 IMFSample

c++ - Linux 中的 Cout 和 Cin - 看不到控制台

opengl - 这会导致万向节锁定吗?

c++ - OpenGL 中的线框立方体呈现空白

three.js - ThreeJs 和 Blender(使用 colladaLoader): first contact

import - FBX 文件使用什么压缩算法?

c++ - 类模板的静态数据成员

c++ - 打印 GUID 变量

c++ - 如何在 GLFW 中为游戏引擎创建正确的输入类

Python:在 Windows 上运行 bpy 脚本