0

我为 android 编写了一个简单的模型查看器,它解析 .obj 波前文件以创建 3d 模型。我正在导出一个简单的 icosphere,该 icosphere 已使用来自搅拌机的 uv 贴图以这种格式提供

v 0.000000 -1.000000 0.000000
v 0.723600 -0.447215 0.525720
v -0.276385 -0.447215 0.850640
.
.
.
v -0.723600 0.447215 -0.525720
v 0.276385 0.447215 -0.850640
v 0.894425 0.447215 0.000000
vt 0.238062 0.172144
vt 0.314133 0.212645
vt 0.264721 0.263452
.
.
.
vt 0.176955 0.098382
vt 0.327646 0.115775
vt 0.361262 0.040083
f 103/1 15/2 48/3
f 48/3 44/4 103/1
f 13/5 103/1 44/4
.
.
.
f 47/12 105/8 46/10
f 14/9 46/10 105/8
f 105/8 47/12 15/2

“v”表示顶点,“vt”表示纹理坐标,“f”表示面,正斜杠之前的值为顶点对应的索引,斜杠之后的值为纹理坐标对应的索引。我的问题是我不确定如何将纹理坐标索引输入到 opengl 中,所以我当前的模型看起来很奇怪,因为纹理坐标不匹配。

在此处输入图像描述

4

1 回答 1

0

OBJ 将纹理内的原点定义为位于左上角。OpenGL 将它定义为在左下角。您需要反转来自 OBJ 的 y 坐标。

编辑:为了回应我对下面 Christian Rau 部分的怀疑,出于 OpenGL 的目的并将属性限制为您实际使用的属性,顶点是位置和纹理坐标的组合。这是两件事在一起。你可能认为它们在逻辑上是不同的,但 OpenGL 却没有。您可能会回答“哪个 OBJ 顶点位于传递给 OpenGL 的列表中的条目 23 处?”的问题。答案是“它是顶点 46/10”。

在加载时实现它的一种方法是通过任何 Dictionary 子类(例如,Hashtable)。当遇到需要使用顶点 46/10 时,您将创建一个合适的复合键并检查 Hashtable 是否映射到 OpenGL 数组索引位置。如果找不到,您将分配下一个可用的索引位置并在字典中存储一条记录。

所以以下,从你的问题:

f 103/1 15/2 48/3
f 48/3 44/4 103/1
f 13/5 103/1 44/4
.
.
.
f 47/12 105/8 46/10
f 14/9 46/10 105/8
f 105/8 47/12 15/2

产生十个顶点,即顶点 103/1、13/5、48/3、44/4、15/2、47/12、105/8、46/10、14/9 和 46/10。

于 2012-03-24T19:06:11.580 回答