2016-03-03 2 views
0

Так я пытаюсь к основной программе OpenGL, который читает в .obj файл, а затем делает его (файл OBJ содержит вершины треугольника в формате v 1.000000 2.000000, 3.00000.Ошибка рисования модели в OpenGL

Так вот мой код делать, что (им с помощью 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() 

Однако, когда я иду, чтобы запустить этот результат Isnt вполне правильного

enter image description here

Я попробовал это в нескольких других файлах, которые я нашел в Интернете, и получаю аналогичные результаты. Похоже, что вершины треугольников смещены или что-то в этом роде.

+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

Obj хранение файлов в дополнении к вершинам (V-линия), также, как они должны быть объединены в грани (F-линия) , Вершины сами сохраняются без определенного порядка, что означает, что первый треугольник не обязательно состоит из вершин 0-2.

Вам нужно будет прочитать все вершины в виде массива vector/list/array, а затем проанализировать записи лица, которые могут быть составлены (в соответствии с этим) четырьмя различными способами в зависимости от того, какая дополнительная информация (нормали, координаты текстуры) дополнительно хранится:

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]} 
} 
Смежные вопросы