为了账号安全,请及时绑定邮箱和手机立即绑定

错误在opengl中绘制模型

错误在opengl中绘制模型

Go
波斯汪 2021-12-20 14:34:10
所以我正在尝试一个基本的 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()但是,当我去运行它时,结果并不完全正确我在互联网上找到的其他一些文件上尝试了它,我得到了类似的结果。看起来三角形的顶点几乎是偏移的或什么的。
查看完整描述

2 回答

?
守着一只汪

TA贡献1872条经验 获得超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()


查看完整回答
反对 回复 2021-12-20
?
跃然一笑

TA贡献1826条经验 获得超6个赞

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

}


查看完整回答
反对 回复 2021-12-20
  • 2 回答
  • 0 关注
  • 130 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信