[matplotlib 3D] 47. 3D STLファイルのボクセル変換とmatplotlibによる表示

matplotlib 3D

はじめに

ここでは、3次元のSTLファイルをボクセル表現に変換し、matplotlibのvoxel関数を利用してサボテンの形状を視覚化する方法を解説します。STL(STereoLithography)ファイルは3Dプリンティングなどで広く使われている3Dモデル形式で、これをボクセル(3次元のピクセル)データに変換することで、matplotlib上で表現できるようになります。

コード

コードをダウンロード

解説

stlファイルのダウンロード

https://www.thingiverse.com/

上記サイトからSTLファイルをダウンロードし、下記サイトでボクセル形式に変換して、TXTデータとしてダウンロードしました。

online html5 voxelizer
convert your 3D model or image into voxels

モジュールのインポート

データの読み込み

np.loadtxt(‘Cactus1.txt’, delimiter=’,’)を使用して、ファイル名と区切り文字を指定してデータを読み込みます。データ構造は(#,#,#)形式の座標が1列に連なった形式になっています。

ボクセルデータの生成

データの最大値を求め、最大値+1のサイズでnp.indices()配列を生成します。ここでは、形状が(61,61,61)の、各要素が位置インデックスを持つ配列を作成し、それをx,y,z座標として使用しています。

for文内でx[int(data[i,0]),int(data[i,1]),int(data[i,2])] = -1を実行し、データに対応するx,y,z位置の値を-1に変更します。すべての対応位置を-1にした後、voxels = x < 0 とすることで、dataの位置のみがTrueとなるブール型配列を生成します。

3Dグラフの表示

matplotlib で3Dグラフを表示するには ax = fig.gca(projection='3d') を使用します。

ax.set_aspect('equal') を設定することで、x軸、y軸、z軸の比率を均等にしています。

ボクセルの表示には ax.voxels(voxels, linewidth=0.3, facecolor='lightgreen',edgecolors='k') を使用します。

視点は ax.view_init(elev=-160, azim=30) で設定しています。

軸は ax.set_axis_off() で非表示にしています。

その他の例

応用例

このテクニックは以下のような応用が可能です:

  • 医療画像の3D可視化(MRIやCTスキャンデータの表示)
  • 地形データの立体表現
  • 建築モデルの簡易表示
  • 3Dゲームのボクセルベースのグラフィックス

注意点

解像度が高すぎると処理に時間がかかり、メモリ消費も増大します。適切なvoxel_resolutionを設定することが重要です。また、大きなモデルの場合はNumPyの最適化手法を活用すると効率的です。

まとめ

STLファイルからボクセルデータへの変換と、matplotlibを使った3D表示方法を説明しました。この技術を応用することで、様々な3Dデータの可視化が可能になります。

参考

https://www.thingiverse.com/
online html5 voxelizer
convert your 3D model or image into voxels

コメント

  1. […] [matplotlib 3D] 47.ボクセルサボテン(Voxel Cactus)3D形式のデータをもつstlファイルをボクセル形式に変換して、matplotlib のvoxelで表示する。sabopy.com2019.03.14 […]