web-dev-qa-db-ja.com

python)の3D配列から.objファイルを作成します

私の目標は、Unityで開く目的で、Pythonを使用して気の利いた(.nii)形式から.objファイルを取得することです。 「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()

enter image description here

データ(頂点、法線、値)を.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にインポートすると、次の結果が得られました。

enter image description here

enter image description here

だから私の質問は次のとおりです:

  • .obj作成プロセスで何が間違っていますか?
  • これをより良い方法で行うモジュールまたは関数はありますか?
  • 私がやりたいことをすることはまったく可能ですか?

ありがとうございました。

その他の例:

Python:

enter image description here

Unity:

enter image description here

8
Diego Orellana

解決策:数時間のデバッグの後、解決策は非常に簡単でした!マーチングキューブを適用して与えられた顔データに+1を加えるだけです。問題は、Pythonが頂点を0から始まると見なし、単一性がそれらを1から始まると見なすということでした。それが一致しなかった理由です!どういたしまして。

頂点、面、法線、値= measure.marching_cubes_lewiner(nifty_data、0)

顔=顔+1

成功!

enter image description here

13
Diego Orellana