Конвертер .obj в raw вершин с нормалями в python - PullRequest
0 голосов
/ 12 февраля 2019

Я снова прошу твоей помощи.Я хочу создать скрипт на python, который будет принимать файл вершин и нормалей в формате .obj, а также экспортировать 2 файла с координатами вершины и еще один с нормальными координатами нормали

v 1.900470 2.777519 -1.000000
v 1.900470 2.777519 -3.000000
v 2.095561 2.796734 -1.000000
v 2.095560 2.796734 -3.000000
v 2.283154 2.853640 -1.000000
v 2.283154 2.853640 -3.000000
v 2.456040 2.946049 -1.000000
v 2.456040 2.946049 -3.000000
v 2.607577 3.070412 -1.000000
vn 0.0980 -0.9952 0.0000
vn 0.2903 -0.9569 -0.0000
vn 0.4714 -0.8819 0.0000
f 2//1 3//1 1//1
f 4//2 5//2 3//2
f 6//3 7//3 5//3

и экспортировать их вформат:

вертицирует

 verxex1.x,verxex1.y,verxex1.z, verxex2.x,verxex2.y,verxex2.z,verxex3.x,verxex3.y,verxex3.z,

нормалей:

normal1.x,normal1.y,normal1.z, normal2.x,normal2.y,normal2.z, normal3.x,normal3.y,normal3.z, 

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

Большое спасибо !!

1 Ответ

0 голосов
/ 24 февраля 2019

Если вы хотите проанализировать 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]

...