Создайте файл .obj из 3D-массива в Python

Моя цель - получить файл .obj из отличного формата (.nii) с помощью python, чтобы открыть его в Unity. Я знаю, что в пакете scikit-image есть модуль под названием «measure», в котором реализован алгоритм Marching cube. Я применяю алгоритм маршевого куба к своим данным и получаю ожидаемые результаты:

verts, faces, normals, values = measure.marching_cubes_lewiner(nifty_data, 0)

Затем я могу построить данные:

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_trisurf(verts[:, 0], verts[:,1], faces, verts[:, 2],
                linewidth=0.2, antialiased=True)
plt.show()

введите описание изображения здесь

Я искал функции для сохранения данных (вершины, нормали граней, значения) как .obj, но не нашел. Таким образом, я решил построить его сам.

thefile = open('test.obj', 'w')
for item in verts:
  thefile.write("v {0} {1} {2}\n".format(item[0],item[1],item[2]))

for item in normals:
  thefile.write("vn {0} {1} {2}\n".format(item[0],item[1],item[2]))

for item in faces:
  thefile.write("f {0}//{0} {1}//{1} {2}//{2}\n".format(item[0],item[1],item[2]))  

thefile.close()

Но когда я импортирую данные в Unity, я получил следующий результат:

введите описание изображения здесь

введите описание изображения здесь

Итак, мои вопросы следующие:

  • Что я делаю не так в процессе создания .obj?
  • Есть ли модуль или функция, которые делают это лучше?
  • Можно ли вообще делать то, что я хочу?

Спасибо.

Еще примеры:

Python:

введите описание изображения здесь

Единство:

введите описание изображения здесь


person Diego Orellana    schedule 17.02.2018    source источник
comment
Что насчет вашего результата по сравнению с тем, каким вы хотите его видеть? Вы хотите, чтобы он был более плавным или?   -  person Doh09    schedule 17.02.2018
comment
Ясно, что лица неправильные, я попытаюсь отладить это, создав простейшие фигуры, такие как куб, а затем посмотрю, в каком порядке они должны быть написаны, это мой план. Процесс создания .obj как-то не так, я до сих пор не знаю почему, потому что он должен быть очень простым.   -  person Diego Orellana    schedule 17.02.2018
comment
Я не был уверен, было ли это в гранях или в ошибке в построении меша. Ваш план кажется хорошей идеей, если начать с более простых сеток. Хороший способ отладки.   -  person Doh09    schedule 17.02.2018


Ответы (1)


Решение: после нескольких часов отладки решение было очень простым! Просто добавьте +1 к данным лиц, применяя маршевые кубы. Проблема заключалась в том, что Python считал вершины начинающимися с 0, а unity считало их начинающимися с 1. Вот почему они не совпадали! Пожалуйста.

вершины, грани, нормали, значения = measure.marching_cubes_lewiner (nifty_data, 0)

лица = лица +1

Успех!

введите описание изображения здесь

person Diego Orellana    schedule 20.02.2018
comment
Ух ты! Большое спасибо. Вы сэкономили мне часы на отладку. Спасибо! - person Shubham Agrawal; 07.10.2019