Pythonで
3次元CG を作りたい
人のための PyVista 入門

Speaker:

小山哲央

Date:

2024-06-20

自己紹介

もくじ

  • PythonでCGを作るのに必要なこと

  • モデリングをしてみよう

  • テクスチャを追加してみよう

  • マテリアルを追加してみよう

  • ライティングをしてみよう

  • 空間のデータ分析をしてみよう

  • インタラクティブに可視化をしてみよう

PythonでCGを作るのに必要なこと

  • 👉 PythonでCGを作るのに必要なこと

  • モデリングをしてみよう

  • テクスチャを追加してみよう

  • マテリアルを追加してみよう

  • ライティングをしてみよう

  • 空間のデータ分析をしてみよう

  • インタラクティブに可視化をしてみよう

モデリング

  • 仮想3次元空間上に個々のポリゴンをつくる。

  • CGを作る際に最も基本的な作業。

  • 仮想3次元空間上に自分の作成したい物体を配置することができる。

_images/index-1_00_00.png

テクスチャマッピング

  • 質感を表現するための画像をモデルに貼り付ける。

  • モデリングで作成したオブジェクトに、テクスチャを貼り付けることで、CGをよりリアルに表現することができる。

_images/index-2_00_00.png

ライティング

  • 仮想3D空間に光を配置してオブジェクトを照らす。

  • 光源を配置することで、モデリングしたオブジェクトに影をつけることができる。

_images/index-3_00_00.png

PyVistaとは?

  1. Pythonフレンドリな3D可視化ライブラリです。

  2. MatplotlibやPandasのAPIに似ています。

  3. Matplotlibで実現できないCGの表現もPyVistaで実現できます。

  4. Jupyter NotebookやSphinxでのインタラクティブな可視化もサポートしています。

インストール

$ pip install "pyvista[all]"

モデリングをしてみよう

  • PythonでCGを作るのに必要なこと

  • 👉 モデリングをしてみよう

  • テクスチャを追加してみよう

  • マテリアルを追加してみよう

  • ライティングをしてみよう

  • 空間のデータ分析をしてみよう

  • インタラクティブに可視化をしてみよう

モデリングをしてみよう

# PyVistaをインポートする。

import pyvista as pv
# 円柱のモデルを作成する。

mesh = pv.Cylinder()
# 球体のモデルを描画する。

mesh.plot()
_images/index-4_00_00.png

モデリングをしてみよう

# Plotterオブジェクト

pl = pv.Plotter()

# 円柱を上方向に1.0移動します

mesh = pv.Cylinder()
mesh.translate(xyz=(0, 0, 1), inplace=True)
pl.add_mesh(mesh)
# もう1つ円柱を追加します

mesh = pv.Cylinder()
pl.add_mesh(mesh)

# 追加されたモデルを描画します

pl.show()
_images/index-5_00_00.png

テクスチャを追加してみよう

  • PythonでCGを作るのに必要なこと

  • モデリングをしてみよう

  • 👉 テクスチャを追加してみよう

  • マテリアルを追加してみよう

  • ライティングをしてみよう

  • 空間のデータ分析をしてみよう

  • インタラクティブに可視化をしてみよう

テクスチャを追加してみよう

# テクスチャに使用する画像を読み込み

from pyvista import examples as ex

filename = ex.mapfile
# 画像をテクスチャとして読み込み

texture = pv.read_texture(filename=filename)
# テクスチャをオブジェクトに貼り付け

mesh.plot(texture=texture)
_images/index-6_00_00.png

マテリアルを追加してみよう

  • PythonでCGを作るのに必要なこと

  • モデリングをしてみよう

  • テクスチャを追加してみよう

  • 👉 マテリアルを追加してみよう

  • ライティングをしてみよう

  • 空間のデータ分析をしてみよう

  • インタラクティブに可視化をしてみよう

スカイボックスを表示してみよう

from pyvista import examples as ex

# スカイボックスをダウンロードする

cube_map = ex.download_sky_box_cube_map()

cube_map.plot()
skybox
_images/index-7_00_00.png

質感と背景の映り込みを追加してみよう

# スカイボックスを背景に設定する
pl.add_actor(cube_map.to_skybox())
# 背景の映込をテクスチャとして設定する
pl.set_environment_texture(cube_map)

# 物理ベースレンダリングを使用して
# 表面に反射する光の強さを設定する
pl.add_mesh(
   mesh,
   pbr=True,
   metallic=0.8,
   roughness=0.1,
   diffuse=1
)
_images/index-8_00_00.png

ライティングをしてみよう

  • PythonでCGを作るのに必要なこと

  • モデリングをしてみよう

  • テクスチャを追加してみよう

  • マテリアルを追加してみよう

  • 👉 ライティングをしてみよう

  • 空間のデータ分析をしてみよう

  • インタラクティブに可視化をしてみよう

ライティングをしてみよう

# Plotterクラスでlightingを無効にします。
plotter = pv.Plotter(lighting='none')
# 仮想3D空間に光を配置します。
light = pv.Light(
    position=(0, 1, 0),
    light_type='scene light'
)
# Plotterクラスに光を追加します。
pl.add_light(light)
plotter.show()
_images/index-9_00_00.png

空間のデータ分析をしてみよう

  • PythonでCGを作るのに必要なこと

  • モデリングをしてみよう

  • テクスチャを追加してみよう

  • マテリアルを追加してみよう

  • ライティングをしてみよう

  • 👉 空間のデータ分析をしてみよう

  • インタラクティブに可視化をしてみよう

空間のデータ分析をしてみよう

  • Pythonを使用しているので3D空間のデータ分析も行いたい。

  • PyVistaではポリゴンにデータを持たせてPandasのように処理をするメソッドが整備されている。

Minecraftのような洞窟を作ってみよう

# 右図のグリッドを構成するポリゴンの数
>>> grid.number_of_points
180999

# 各点の値のデータを定義したNumPy配列
>>> data
array([-0.29131388, ...])

# サイズはポリゴンの数と同じであることを確認
>>> len(data)
180999
# 辞書のように定義できます
>>> grid['data'] = data
>>> grid['data']
pyvista_ndarray([-0.29131388, ...])
_images/index-10_00_00.png

Minecraftのような洞窟を作ってみよう

# データの最小値と最大値を取得
>>> grid['data'].min()
-0.85
>>> grid['data'].max()
0.903
# データが0.0565より大きいグリッドを抽出
out = grid.threshold(value=0.0565)
# 抽出後の最小値と最大値を取得
>>> out['data'].min()
0.0565
>>> out['data'].max()
0.903
_images/index-11_00_00.png

インタラクティブに可視化をしてみよう

  • PythonでCGを作るのに必要なこと

  • モデリングをしてみよう

  • テクスチャを追加してみよう

  • マテリアルを追加してみよう

  • ライティングをしてみよう

  • 空間のデータ分析をしてみよう

  • 👉 インタラクティブに可視化をしてみよう

Sphinxによる可視化

.. pyvista-plot::
   :include-source: False

   # pyvista-plotディレクティブを使って、
   # Sphinxドキュメントに右のような
   # 3D可視化を追加することができます。

   import pyvista as pv
   mesh = pv.Cylinder()
   mesh.plot()

   # このスライドもSphinxで作成しています。
   # 詳しくはsphinx-revealjsで検索!
_images/index-12_00_00.png

Jupyterによる可視化

Streamlitによる可視化

Streamlit Cloud

ご清聴ありがとうございました

Star

contrib.rocks