[Python] 3Dデータを表示してみよう!

Python

ありがたいことにインターネット上にはフリーの3Dデータがたくさんアップロードされています。
通常は3Dデータ形式(例えば .3ds ファイル、.stl ファイル)で配布されていますが、
xyz ファイル形式に変換することができれば、Python環境でも比較的簡単に表示できます。

matplotlibパッケージのインストール

3Dデータを表示するために必要なmatplotlibパッケージをインストールします。
pipコマンドでインストール可能です。

pip install matplotlib

参考までに実行結果を載せておきます。

> pip install matplotlib
Collecting matplotlib
  Downloading matplotlib-3.9.2-cp313-cp313-win_amd64.whl.metadata (11 kB)
Collecting contourpy>=1.0.1 (from matplotlib)
  Downloading contourpy-1.3.0-cp313-cp313-win_amd64.whl.metadata (5.4 kB)
Collecting cycler>=0.10 (from matplotlib)
  Using cached cycler-0.12.1-py3-none-any.whl.metadata (3.8 kB)
Collecting fonttools>=4.22.0 (from matplotlib)
  Downloading fonttools-4.54.1-cp313-cp313-win_amd64.whl.metadata (167 kB)
Collecting kiwisolver>=1.3.1 (from matplotlib)
  Downloading kiwisolver-1.4.7-cp313-cp313-win_amd64.whl.metadata (6.4 kB)
Collecting numpy>=1.23 (from matplotlib)
  Downloading numpy-2.1.2-cp313-cp313-win_amd64.whl.metadata (59 kB)
Collecting packaging>=20.0 (from matplotlib)
  Downloading packaging-24.1-py3-none-any.whl.metadata (3.2 kB)
Requirement already satisfied: pillow>=8 in c:\users\rmatsush\appdata\local\programs\python\python313\lib\site-packages (from matplotlib) (11.0.0)
Collecting pyparsing>=2.3.1 (from matplotlib)
  Downloading pyparsing-3.2.0-py3-none-any.whl.metadata (5.0 kB)
Collecting python-dateutil>=2.7 (from matplotlib)
  Downloading python_dateutil-2.9.0.post0-py2.py3-none-any.whl.metadata (8.4 kB)
Collecting six>=1.5 (from python-dateutil>=2.7->matplotlib)
  Downloading six-1.16.0-py2.py3-none-any.whl.metadata (1.8 kB)
Downloading matplotlib-3.9.2-cp313-cp313-win_amd64.whl (7.8 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 7.8/7.8 MB 349.5 kB/s eta 0:00:00
Downloading contourpy-1.3.0-cp313-cp313-win_amd64.whl (218 kB)
Using cached cycler-0.12.1-py3-none-any.whl (8.3 kB)
Downloading fonttools-4.54.1-cp313-cp313-win_amd64.whl (2.2 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.2/2.2 MB 556.9 kB/s eta 0:00:00
Downloading kiwisolver-1.4.7-cp313-cp313-win_amd64.whl (55 kB)
Downloading numpy-2.1.2-cp313-cp313-win_amd64.whl (12.6 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 12.6/12.6 MB 1.0 MB/s eta 0:00:00
Downloading packaging-24.1-py3-none-any.whl (53 kB)
Downloading pyparsing-3.2.0-py3-none-any.whl (106 kB)
Downloading python_dateutil-2.9.0.post0-py2.py3-none-any.whl (229 kB)
Using cached six-1.16.0-py2.py3-none-any.whl (11 kB)
Installing collected packages: six, pyparsing, packaging, numpy, kiwisolver, fonttools, cycler, python-dateutil, contourpy, matplotlib
Successfully installed contourpy-1.3.0 cycler-0.12.1 fonttools-4.54.1 kiwisolver-1.4.7 matplotlib-3.9.2 numpy-2.1.2 packaging-24.1 pyparsing-3.2.0 python-dateutil-2.9.0.post0 six-1.16.0
>

3Dデータのxyz形式化

表示する3Dデータを取得してきます。
「3d データ フリー」といったキーワードで検索すると、たくさんの3Dデータが見つかると思います。

ここではこちらのザクの3Dをお借りして試してみます。
3Dデータをダウンロードして解凍すると、.stl形式の「ZAKU-MS-06S.STL」ファイルを確認できます。

この.stlファイルを.xyzファイル形式に変換するため、以下のサイトを利用します。

PNG、JPG 2D 画像を 3D STL メッシュ モデル ファイルに変換する無料オンライン ツール - ImageToStl
無料のオンライン ツールを使用して、PNG または JPG の 2D 画像またはロゴを 3D STL メッシュ/モデル ファイルに変換して、3D プリントしたり、3D 編集パッケージにロードしたりできます。

正しく変換が完了すると .xyz 形式のファイルをダウンロードできます。
ここでは「zaku.xyz」に保存されたとします。
テキストで開いてみると、以下のような数字が並んでいると思います。

19.36126137 4.94152689 39.02330017
19.36126137 4.94610691 39.02399445
19.36126137 4.10047483 39.4291954
19.36126137 5.72470188 39.7324295
19.36126137 5.73573399 39.80233765
  :

1列目がx座標軸、2列目がy座標軸、3列目がz座標軸の値を示していて、
これらの点の集合で3Dが表現されています。

Pythonによる3Dデータ表示

以下実行することで3Dデータを表示することができます。

import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure(figsize=(10,10)) 
ax = fig.add_subplot(projection='3d')

dx = np.array([])
dy = np.array([])
dz = np.array([])

with open('zaku.xyz') as f:
    for line in f:
        (x, y, z) = line.split()
        dx = np.append(dx, float(x))
        dy = np.append(dy, float(y))
        dz = np.append(dz, float(z))

ax.set_xlabel('dx') 
ax.set_ylabel('dy')
ax.set_zlabel('dz')

ax.scatter(dx, dy, dz, s=0.5)
plt.show()

コードもシンプルで、zaku.xyzファイルから1行ずつデータを読み込んで、
dx、dy、dzの配列に追加していき、最後にデータをプロットしているだけです。

実行すると別ウィンドウが表示され、3Dデータがマッピングされたザクが表示されます。
点で表現していますので、少しわかりづらいですが、ザクの形はしています。

まとめ

3DデータをPythonを使って表示することを試してみました。
本記事を書いている途中で、numpy-stlという .stlファイルをそのまま扱えるパッケージを見つけたので、
こちらもあとで試してみる予定です。

コメント

タイトルとURLをコピーしました