Blenderで凸包を作ろう
頂点座標だけ与えられているとき、その凸包を確認したいとします。
ここでは、Blenderを使って凸包を作成してみましょう。
やり方
編集モードで頂点を選択し、メッシュメニューの「凸包」で凸包が作成できます。
デフォルトでは、凸包に使われなかった頂点は削除されます。細かい調整は、左下に表示されるオペレーターパネルでできます。
以下は、「凸包」機能に気づく前に作成したものです。参考までに残しておきます。
SciPyを使う方法
準備
SciPyとmore-itertoolsを使います。
Blenderのコマンドサンプルを参考にして、下記のようにインストールしてください。
blender_pip install scipy more-itertools
ランダムデータで確認
以下では、ランダムな30個の頂点を作成し、その凸包を作成しています。
Scriptingワークスペースで新規作成して、コピペして実行してください。
from typing import Any, Iterable
import bpy
import numpy as np
from mathutils import Vector
from more_itertools import pairwise
from scipy.spatial import ConvexHull
def add_convex_hull(points: Iterable[Any], name: str = "") -> None:
"""凸包のオブジェクトを作成する
:param points: 頂点のイテラブル
:param name: 名前
"""
ch = ConvexHull(points)
ar = np.c_[ch.simplices, ch.simplices[:, 0]]
verts = [Vector(pt) for pt in points]
edges = list(set(tuple(sorted(j)) for i in ar for j in pairwise(i)))
faces = ch.simplices
mesh = bpy.data.meshes.new(name=name or "ConvexHull")
mesh.from_pydata(verts, edges, faces)
obj = bpy.data.objects.new(mesh.name, mesh)
bpy.context.scene.collection.objects.link(obj)
if __name__ == "__main__":
points = np.random.random((30, 3))
add_convex_hull(points)
実行例
補足
簡単に試したところ、面は全て三角形面でした。もし、多角形面にしたければ、編集モードの削除の「限定的溶解」でできるかもしれません。
以上