错误在opengl中绘制模型

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

但是,当我去运行它时,结果并不完全正确

http://img.mukewang.com/61c024060001207c06460341.jpg

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


波斯汪
浏览 131回答 2
2回答

守着一只汪

您应该将所有顶点数据读入数组。Obj 文件包含有关三角形的信息,以及应如何索引顶点。以 开头的行f包含 3 个描述三角形的数字。所以你的代码应该是这样的(我不知道去):var vertices [1000*3] float32for 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()

跃然一笑

Obj 文件除了存储顶点(v 线)之外,还存储它们必须如何组合成面(f 线)。顶点本身的存储没有特定的顺序,这意味着第一个三角形不一定由顶点 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-entriesvt ... 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-listforeach (f-line){    parse v-indices -> {v0, v1, v2}    draw triangle {vertices[v0], vertices[v1], vertices[v2]}}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go