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()
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]}
}
- 2 回答
- 0 关注
- 130 浏览
添加回答
举报