Pythonで
3次元CG を作りたい
人のための PyVista 入門
- Speaker:
小山哲央
- Date:
2024-06-20
自己紹介
3D 可視化ライブラリ @pyvista メンテナ兼ドキュメント翻訳者
もくじ
PythonでCGを作るのに必要なこと
モデリングをしてみよう
テクスチャを追加してみよう
マテリアルを追加してみよう
ライティングをしてみよう
空間のデータ分析をしてみよう
インタラクティブに可視化をしてみよう
PythonでCGを作るのに必要なこと
👉 PythonでCGを作るのに必要なこと
モデリングをしてみよう
テクスチャを追加してみよう
マテリアルを追加してみよう
ライティングをしてみよう
空間のデータ分析をしてみよう
インタラクティブに可視化をしてみよう
モデリング
仮想3次元空間上に個々のポリゴンをつくる。
CGを作る際に最も基本的な作業。
仮想3次元空間上に自分の作成したい物体を配置することができる。
テクスチャマッピング
質感を表現するための画像をモデルに貼り付ける。
モデリングで作成したオブジェクトに、テクスチャを貼り付けることで、CGをよりリアルに表現することができる。
ライティング
仮想3D空間に光を配置してオブジェクトを照らす。
光源を配置することで、モデリングしたオブジェクトに影をつけることができる。
PyVistaとは?
Pythonフレンドリな3D可視化ライブラリです。
MatplotlibやPandasのAPIに似ています。
Matplotlibで実現できないCGの表現もPyVistaで実現できます。
Jupyter NotebookやSphinxでのインタラクティブな可視化もサポートしています。
インストール
$ pip install "pyvista[all]"
モデリングをしてみよう
PythonでCGを作るのに必要なこと
👉 モデリングをしてみよう
テクスチャを追加してみよう
マテリアルを追加してみよう
ライティングをしてみよう
空間のデータ分析をしてみよう
インタラクティブに可視化をしてみよう
モデリングをしてみよう
# PyVistaをインポートする。
import pyvista as pv
# 円柱のモデルを作成する。
mesh = pv.Cylinder()
# 球体のモデルを描画する。
mesh.plot()
モデリングをしてみよう
# 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()
テクスチャを追加してみよう
PythonでCGを作るのに必要なこと
モデリングをしてみよう
👉 テクスチャを追加してみよう
マテリアルを追加してみよう
ライティングをしてみよう
空間のデータ分析をしてみよう
インタラクティブに可視化をしてみよう
テクスチャを追加してみよう
# テクスチャに使用する画像を読み込み
from pyvista import examples as ex
filename = ex.mapfile
# 画像をテクスチャとして読み込み
texture = pv.read_texture(filename=filename)
# テクスチャをオブジェクトに貼り付け
mesh.plot(texture=texture)
マテリアルを追加してみよう
PythonでCGを作るのに必要なこと
モデリングをしてみよう
テクスチャを追加してみよう
👉 マテリアルを追加してみよう
ライティングをしてみよう
空間のデータ分析をしてみよう
インタラクティブに可視化をしてみよう
スカイボックスを表示してみよう
質感と背景の映り込みを追加してみよう
# スカイボックスを背景に設定する
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
)
ライティングをしてみよう
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()
空間のデータ分析をしてみよう
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, ...])
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
インタラクティブに可視化をしてみよう
PythonでCGを作るのに必要なこと
モデリングをしてみよう
テクスチャを追加してみよう
マテリアルを追加してみよう
ライティングをしてみよう
空間のデータ分析をしてみよう
👉 インタラクティブに可視化をしてみよう
Sphinxによる可視化
.. pyvista-plot::
:include-source: False
# pyvista-plotディレクティブを使って、
# Sphinxドキュメントに右のような
# 3D可視化を追加することができます。
import pyvista as pv
mesh = pv.Cylinder()
mesh.plot()
# このスライドもSphinxで作成しています。
# 詳しくはsphinx-revealjsで検索!