Исходя из опубликованной ссылки genpfault , ваша первая проблема заключается в том, что вы работаете с форматом модели ASCII. Хотя это можно сделать, вы представляете проблему конверсии. Тяжело, не совсем, немного боли, да. Кроме того, этот формат имеет двоичный и ASCII-варианты, поэтому вам нужно работать с двумя форматами.
Теперь подробности формата, как отмечено в этом разделе (взято со страницы):
Линия 1 ВЫКЛ.
Строка 2 vertex_count face_count edge_count
Одна строка для каждой вершины: x y z
для вершины 0, 1, ..., vertex_count-1
Одна линия для каждой многоугольной грани: n v1 v2 ... vn,
количество вершин и индексы вершин для каждой грани.
На первый взгляд кажется, что все определено в очень дружественном для OpenGL формате. На самом деле, держу пари, вы можете сделать рендеринг прямо из файла модели. Это сработает только один раз, но это означает, что вы начинаете хорошо, если сравнивать с некоторыми из более безумных форматов.
То, что вы хотите сделать, это взять вторую строку и найти вершину и количество лиц. Сохраните это (фрагмент псевдокода, чтобы следовать). Затем просмотрите списки вершин и граней и загрузите каждый из них, сохранив его в любой форме. Этот процесс будет выглядеть примерно так:
List<Vector3> vertices;
Open file model.off
Read line
if ( line == "OFF" )
{
// We know it's a model
Read line
Attributes[] = Split line(' ')
Vertex count = Attributes[0]
Face count = Attributes[1]
// Save edge count if necessary
For ( vert = 0; vert < vertex count; vert += 1 )
{
Read line
Coordinates[] = Split line(' ')
float X = FloatFromString(Coordinates[0])
float Y = FloatFromString(Coordinates[1])
float Z = FloatFromString(Coordinates[2])
vertices.push(new Vector3(x, y, z))
}
// Repeat for faces
}
Теперь, когда вы загрузите все данные, вам нужно будет настроить их на рендеринг. Вы можете иметь небольшую функцию в своем классе модели, которая просто вызывает:
glBegin(TRIS)
for each ( face )
{
retrieve the verts from the list
glVertex3f(x, y, z)
}
Очевидно, что это не точно, но это грубая идея. Вы можете кэшировать вершины в VBO на карте или любым другим способом, но использование простого рендеринга, подобного этому, на мой взгляд, упрощает связь между форматом модели и процедурой рендеринга.