3

我试图在 Android 中绘制一个地球仪,为此我使用 OpenGL。然而,为了更容易理解,我将从制作一个简单的 3D 立方体开始。我使用 Blender 创建我的 3D 对象(立方体),并在解包后将其导出为 .obj 文件以获取纹理坐标(vt)。问题是我得到 8 个不同的顶点和 9 个不同的纹理坐标。

V 1.000000 -1.0000 -1.000000 v
1.000000
-1.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 来 入 _ 1.000000 VT -1.000000 -1.000000 VT -1.000000 0.000000 VT 0.000000 1.000000 VT 1.000000 1.000000 VT 1.000000 VT 1.000000 0.000000 VT -1.000000 1.000000 1.000000 VT 1.000000 -1.000000 -1.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000 vt













因此,我也得到了一个真正混乱的索引设置,这使得无法重新排列纹理坐标的位置以匹配顶点中的位置。

f 5/1 1/2 4/3
f 5/1 4/3 8/4
f 3/1 7/5 8/6
f 3/1 8/6 4/7
f 2/1 6/5 3/4
f 6/7 7/1 3/2
f 1/1 5/5 2/4
f 5/7 6/1 2/2
f 5/5 8/8 6/1
f 8/1 7/2 6/9
f 1/1 2/2 3/3
f 1/1 3/3 4/4

由于我现在明白了,我只能使用一个数组作为索引,因为一个顶点由顶点和纹理坐标组成。因此,我需要重新排列其中一个 v/vt 数组。但我不能,因为如果我将 vt(在位置 1)移动到位置 5(第一行面),我需要再次移动它以使其一直通过索引数组。

所以基本上我想知道这是否是程序“Blender”的问题,或者是否有我可以应用的解决方案。

4

1 回答 1

2

你有什么是完全正常的,事实上,如果立方体被正确展开,我希望看到超过 9 个纹理坐标。如果以一种常见的方式完成一个立方体将被打开,我相信你真的应该有 12 个 vts。

一个完整的顶点通常由它的 xyz 坐标以及它的法线和纹理坐标组成。如果所有这些部分都相同,则单个 Vertex 只能保存一个索引位置(相对于 OpenGL 中的索引数组)。如果您查看面是如何定义的,它们是由包含 av 和 vt 的顶点组成的。如果你也有法线,它们会有一个额外的数字来表示每个使用的法线(或 OBJ 导出中的 vn 行)。在面中,取顶点 5/1、5/5 和 5/7。xyz坐标相同,但纹理坐标不同。这是因为展开后,3D 空间中的同一点会出现在 UV/图像编辑器的 3 个位置。因此,OpenGL 端的索引数组中会有 3 个单独的索引。

于 2011-05-01T03:46:48.117 回答