[Python] Create a .obj file from 3d array in python

Discussão em 'Python' iniciado por Stack, Agosto 22, 2025.

  1. Stack

    Stack Membro Participativo

    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()


    [​IMG]

    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:

    [​IMG]

    [​IMG]

    So my questions are the followings:

    • What I'm doing wrong in the .obj making process?
    • Is there a module or function that do this in a better way?
    • Is it possible at all to do what I want?

    Thank you.

    More examples:

    Python:

    [​IMG]

    Unity:

    [​IMG]

    Continue reading...

Compartilhe esta Página