Рабочие файлы .off в opengl - PullRequest
1 голос
/ 06 ноября 2010

У меня есть пара трехмерных объектов в формате .off, которыми я бы хотел управлять с помощью OpenGL + C. Есть ли стандартный, простой способ сделать это?

Ответы [ 2 ]

2 голосов
/ 07 ноября 2010

Исходя из опубликованной ссылки 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 на карте или любым другим способом, но использование простого рендеринга, подобного этому, на мой взгляд, упрощает связь между форматом модели и процедурой рендеринга.

0 голосов
/ 07 ноября 2010

Вам придется найти документацию по "файловой структуре" файла ".off", если вы планируете написать загрузчик.

Примерно так (Это для ".MD2"): ru.wikipedia.org / wiki / MD2_ (file_format)

Хотя я предлагаю вам попробовать найти конвертер из ".off" в ".fbx" или ".md2" или любой другой формат файлакоторый широко используется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...