.OFF файлы на Python

Я практиковался с Python и PyOpenGL, но я не могу открыть файлы.OFF ( Object File Format) с Python.

Если вам интересно, файлы.OFF - это файлы, которые содержат позиции трехмерного объекта.

 OFF
 8 6 0
-0.500000 -0.500000 0.500000
 0.500000 -0.500000 0.500000
-0.500000 0.500000 0.500000
 0.500000 0.500000 0.500000
-0.500000 0.500000 -0.500000
 0.500000 0.500000 -0.500000
-0.500000 -0.500000 -0.500000
 0.500000 -0.500000 -0.500000
 4 0 1 3 2
 4 2 3 5 4
 4 4 5 7 6
 4 6 7 1 0
 4 1 7 5 3
 4 6 0 2 4

Я хочу прочитать этот файл и сделать его появиться на Python.

Пример должен быть таким: http://people.sc.fsu.edu/~jburkardt/data/off/box.png

Пока что мне нужно было написать каждую координату из файла.OFF вручную. Но программа должна быть в состоянии прочитать каждый файл.OFF, который вы ей даете.

Я мог сделать только тот пример, который дал, потому что я сделал кортеж для вершин и поверхностей:

verticiesCube = (
   (-0.5,-0.5,0.5),
   (0.5,-0.5,0.5),
   (-0.5,0.5,0.5),
   ...
   )

А также

 surfacesCube = (
   (0,1,2,3),
   (2,3,5,4),
   (4,5,7,6),
   ...
   )

Чтобы потом сделать:

 def Read(verticies,surfaces):
   glBegin(QL_QUADS)
   for surface in surfaces:
      for vertex in surface:
        glVertex3fv(verticies[vertex])
   glEnd()

Затем я запускаю Read (verticiesCube, surfaceCube) и появляется Cube. Я хочу сказать, что вы должны быть в состоянии сделать это с каждым файлом.OFF, и иногда не все они равны (у них также указаны цвета, или иногда есть вещи, написанные перед числами, поэтому я не знаю, как пропустить их. Пример:)

  OFF
  #
  #  cone.off
  #
  22   40     120
  0.000000   1.000000   0.000000
  0.000000   0.000000   0.000000
  0.500000   0.000000   0.000000

(# И cone.off - вещи, которые я упомянул)

Итак, как мне сохранить координаты и поверхности файлов.OFF в похожих кортежах, чтобы я мог применить алгоритм Read().

1 ответ

Решение

Понятия не имею, что означает последнее поле во второй строке. Остальное легко вывести:

def read_off(file):
    if 'OFF' != file.readline().strip():
        raise('Not a valid OFF header')
    n_verts, n_faces, n_dontknow = tuple([int(s) for s in file.readline().strip().split(' ')])
    verts = [[float(s) for s in file.readline().strip().split(' ')] for i_vert in range(n_verts)]
    faces = [[int(s) for s in file.readline().strip().split(' ')][1:] for i_face in range(n_faces)]
    return verts, faces
Другие вопросы по тегам