Mi objetivo es obtener un archivo .obj de un formato ingenioso (.nii) usando python, con el propósito de abrirlo en Unity. Sé que el paquete "scikit-image" tiene un módulo llamado "medida" que tiene implementado el algoritmo Marching cube. Aplico el algoritmo del cubo de marcha a mis datos y obtengo los resultados que espero:
verts, faces, normals, values = measure.marching_cubes_lewiner(nifty_data, 0)
Entonces puedo trazar los datos:
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()
He buscado funciones para guardar los datos (verts, caras normales, valores) como .obj pero no he encontrado ninguna. Por lo tanto, decidí construirlo yo mismo.
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()
Pero cuando importo los datos a la unidad obtuve el siguiente resultado:
Entonces mis preguntas son las siguientes:
Gracias.
Más ejemplos:
Pitón:
Unidad:
Solución: ¡Después de horas de depuración, la solución fue muy simple! Simplemente agregue +1 a los datos de caras proporcionados al aplicar los cubos de marcha. El problema era que Python consideraba que los verts comenzaban desde 0 y Unity los consideraba como comenzando desde 1. ¡Es por eso que no coincidían! De nada.
verticales, caras, normales, valores = medida.marching_cubes_lewiner(nifty_data, 0)
caras=caras +1
¡Éxito!