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

matplotlib 3D

はじめに

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

コード

コードをダウンロード

解説

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

Thingiverse - Digital Designs for Physical Objects
Download millions of 3D models and files for your 3D printer, laser cutter, or CNC. From custom parts to unique designs,...

上記サイトから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データの可視化が可能になります。

参考

Thingiverse - Digital Designs for Physical Objects
Download millions of 3D models and files for your 3D printer, laser cutter, or CNC. From custom parts to unique designs,...
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 […]