在opengl中绘制模型时出错

时间:2016-03-03 14:15:17

标签: opengl go glfw

所以我尝试了一个基本的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()

然而,当我去运行时,结果是不对的

enter image description here

我在互联网上找到的其他几个文件上尝试过,我得到了类似的结果。几乎看起来三角形顶点是偏移的或其他东西。

2 个答案:

答案 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]}
}