My goal is to get a .obj file from a nifty (.nii) format using python, with the purpose of open it on Unity. I know that the "scikit-image" package has a module called "measure" which has the Marching cube algorithm implemented. I apply the marching cube algorithm to my data and I obtain the results I expect:
verts, faces, normals, values = measure.marching_cubes_lewiner(nifty_data, 0)
I can then plot the data:
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()
I have looked for functions to save the data (verts,faces normals, values) as a .obj but I haven't found one. Thus, I decided to build it myself.
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()
But when I import the data to unity I got the following result:
So my questions are the followings:
Thank you.
More examples:
Python:
Unity:
Solution: After hours of debugging, the solution was very simple! Just add +1 to the faces data given by applying the marching cubes. The problem was that Python considered the verts as starting from 0 and unity consider them as starting from 1. That is why they didn't match! You welcome.
verts, faces, normals, values = measure.marching_cubes_lewiner(nifty_data, 0)
faces=faces +1
Success!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With