1
0

Blenderで凸包を作ろう

Last updated at Posted at 2022-01-10

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)

参考:BlenderでPythonを実行する方法

実行例

補足

簡単に試したところ、面は全て三角形面でした。もし、多角形面にしたければ、編集モードの削除の「限定的溶解」でできるかもしれません。

以上

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0