Если вы хотите проанализировать Wavefront .obj файл , то этот файл можно проанализировать с помощью Регулярного выражения , который получает строки файла, которые содержат соответствующие данные:
import re
reComp = re.compile("(?<=^)(v |vn |vt |f )(.*)(?=$)", re.MULTILINE)
with open(filename) as f:
data = [txt.group() for txt in reComp.finditer(f.read())]
Список строк можно преобразовать в списки координат и атрибутов с плавающей запятой и интегральных индексов:
v_arr, vn_arr, vt_arr, f_arr = [], [], [], []
for line in data:
tokens = line.split(' ')
if tokens[0] == 'v':
v_arr.append([float(c) for c in tokens[1:]])
elif tokens[0] == 'vn':
vn_arr.append([float(c) for c in tokens[1:]])
elif tokens[0] == 'vt':
vn_arr.append([float(c) for c in tokens[1:]])
elif tokens[0] == 'f':
f_arr.append([[int(i) if len(i) else 0 for i in c.split('/')] for c in tokens[1:]])
Окончательно сгенерировать линеаризованные списки координат вершин и векторов нормалей:
vertices, normals = [], []
for face in f_arr:
for tp in face:
vertices += v_arr[tp[0]-1]
normals += vn_arr[tp[2]-1]
При анализе файла Wavefront вопроса с приведенным выше кодом будут получены следующие массивы координат вершин и векторов нормалей:
Координаты вершин:
[1.90047, 2.777519, -3.0, 2.095561, 2.796734, -1.0, 1.90047, 2.777519, -1.0, 2.09556, 2.796734, -3.0, 2.283154, 2.85364, -1.0, 2.095561, 2.796734, -1.0, 2.283154, 2.85364, -3.0, 2.45604, 2.946049, -1.0, 2.283154, 2.85364, -1.0]
Нормальные векторы:
[0.098, -0.9952, 0.0, 0.098, -0.9952, 0.0, 0,098, -0,9952, 0,0, 0,2903, -0,9569, -0,0, 0,2903, -0,9569, -0,0, 0,2903, -0,9569, -0,0, 0,4714, -0,8819, 0,0, 0,4714, -0,8819, 0,0, 0,4714, -0,8819, 0,0]