从 python 中的 3d 数组创建 .obj 文件
Create a .obj file from 3d array in python
我的目标是使用 python 从漂亮的 (.nii) 格式获取 .obj 文件,目的是在 Unity 上打开它。我知道 "scikit-image" 包有一个名为 "measure" 的模块,它实现了行进立方体算法。我将行进立方体算法应用于我的数据,并获得了我期望的结果:
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 认为顶点是从 0 开始的,而 unity 认为它们是从 1 开始的。这就是它们不匹配的原因!没关系。
verts, faces, normals, values =
measure.marching_cubes_lewiner(nifty_data, 0)
faces=faces +1
成功!
我的目标是使用 python 从漂亮的 (.nii) 格式获取 .obj 文件,目的是在 Unity 上打开它。我知道 "scikit-image" 包有一个名为 "measure" 的模块,它实现了行进立方体算法。我将行进立方体算法应用于我的数据,并获得了我期望的结果:
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 认为顶点是从 0 开始的,而 unity 认为它们是从 1 开始的。这就是它们不匹配的原因!没关系。
verts, faces, normals, values = measure.marching_cubes_lewiner(nifty_data, 0)
faces=faces +1
成功!