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

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

モジュールのインポート
データの読み込み
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データの可視化が可能になります。
参考

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