在python中从3d数组创建.obj文件

在python中从3d数组创建.obj文件,python,unity3d,.obj,marching-cubes,nifti,Python,Unity3d,.obj,Marching Cubes,Nifti,我的目标是使用python从漂亮的(.nii)格式获得一个.obj文件,目的是在Unity上打开它。我知道“scikit image”包有一个名为“measure”的模块,该模块实现了Marching cube算法。我将marching cube算法应用于我的数据,并获得了我预期的结果: verts, faces, normals, values = measure.marching_cubes_lewiner(nifty_data, 0) 然后,我可以绘制数据: fig = plt.figu

我的目标是使用python从漂亮的(.nii)格式获得一个.obj文件,目的是在Unity上打开它。我知道“scikit image”包有一个名为“measure”的模块,该模块实现了Marching cube算法。我将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:

团结:


解决方案:经过数小时的调试,解决方案非常简单!只需将+1添加到通过应用行进立方体给出的面数据。问题是Python认为VART是从0开始,Unity认为它们是从1开始的。这就是他们不匹配的原因!欢迎光临

顶点、面、法线、值= measure.marching\u cubes\u lewiner(漂亮的数据,0)

面=面+1

成功


与您希望的结果相比,您的结果是否有误?你希望它更平滑还是更平滑?很明显,这些面是错的,我将尝试通过创建最简单的图形(如立方体)来调试它,然后看看它们的书写顺序,这是我的计划。.obj的制作过程有点错误,我仍然不知道为什么,因为它应该很简单。我不确定是因为面还是网格构造中的错误。从更简单的网格开始,你的计划听起来是个好主意。调试的好方法。哇!非常感谢你。你帮我省了几个小时的调试时间。非常感谢。