所以我尝试了一个基本的opengl程序,它读入.obj
文件然后渲染它(obj文件包含格式的三角形顶点
v 1.000000 2.000000, 3.00000
。
所以这里是我的代码(我使用GLFW和Golang绑定库)(目前我也忽略了法线)。
gl.Begin(gl.TRIANGLES)
for scanner.Scan() {
var v0, v1, v2 float32
t := strings.Split(scanner.Text(), " ")
line := scanner.Text()
fmt.Sscanf(line, "v %f %f %f", &v0, &v1, &v2)
if t[0] == "v" {
gl.Vertex3f(v0, v1, v2)
}
}
gl.End()
然而,当我去运行时,结果是不对的
我在互联网上找到的其他几个文件上尝试过,我得到了类似的结果。几乎看起来三角形顶点是偏移的或其他东西。
答案 0 :(得分:3)
您应该将所有顶点数据读入数组。 Obj文件包含有关三角形的信息,以及顶点应如何编入索引。以f
开头的行包含3个描述三角形的数字。所以你的代码应该是这样的(我不知道去):
var vertices [1000*3] float32
for scanner.Scan() {
var i=0
var v0, v1, v2 float32
var vv byte
t := strings.Split(scanner.Text(), " ")
line := scanner.Text()
fmt.Sscanf(line, "%c %f %f %f", &vv, &v0, &v1, &v2)
if vv == "v" {
vertices[i] = v0
vertices[i+1] = v1
vertices[i+2] = v2
}
i = i+3
}
gl.Begin(gl.TRIANGLES)
for scanner.Scan() {
var v0, v1, v2 int
var vv byte
t := strings.Split(scanner.Text(), " ")
line := scanner.Text()
fmt.Sscanf(line, "%c %d %d %d", &vv, &v0, &v1, &v2)
if vv == "f" {
gl.Vertex3f(vertices[v0], vertices[v1], vertices[v2])
}
}
gl.End()
答案 1 :(得分:1)
Obj文件除了顶点(v-lines)之外还存储它们如何组合成面(f-lines)。顶点本身存储时没有特定的排序,这意味着第一个三角形不一定由顶点0-2组成。
您必须将所有顶点读入矢量/列表/数组,然后根据哪些附加信息(法线,纹理坐标)以四种不同的方式解析可以组合的面条目(根据此处)另外存储:
f v1 v2 v3 ...
f v1/vt1 v2/vt2 v3/vt3 ...
f v1/vt1/vn1 v2/vt2/vn2 v3/vt3/vn3 ....
f v1//vn1 v2//vn2 v3//vn3 ...
,其中
v ... index into the list of v-entries
vt ... index into the list of vt-entries (texture coordinates)
vn ... index into the list of vn-entries (normals)
对于您的示例,您将必须执行类似于此伪代码的操作(假设所有面已经被三角化)
v-list vertices[];
parse each v-line into v-list
foreach (f-line)
{
parse v-indices -> {v0, v1, v2}
draw triangle {vertices[v0], vertices[v1], vertices[v2]}
}