点群を作成

点群を作成#

頂点のポイントクラウドとそれらのポイントのスカラー配列から pyvista.PolyData オブジェクトを作成します.

import numpy as np
import pyvista as pv
from pyvista import examples

点群は一般的に pyvista.PolyData を使用して構築され, 個々の点に関連付けられたスカラーまたはベクトルデータ配列を簡単に持つことができます.この例では, まず examples モジュールから入手可能な点群を使って逆算してみます.ただし,これは独自の頂点位置のNumPy配列を使用してPyVistaメッシュを作成するのと同じです.

# Define some helpers - ignore these and use your own data if you like!
def generate_points(subset=0.02):
    """A helper to make a 3D NumPy array of points (n_points by 3)."""
    dataset = examples.download_lidar()
    ids = np.random.randint(low=0, high=dataset.n_points - 1, size=int(dataset.n_points * subset))
    return dataset.points[ids]


points = generate_points()
# Output the first 5 rows to prove it's a numpy array (n_points by 3)
# Columns are (X, Y, Z)
points[0:5, :]
pyvista_ndarray([[4.80937475e+05, 4.40009510e+06, 1.76883997e+03],
                 [4.81102875e+05, 4.40017790e+06, 1.76019995e+03],
                 [4.81007775e+05, 4.40022090e+06, 1.76697998e+03],
                 [4.80956675e+05, 4.40021490e+06, 1.75840002e+03],
                 [4.81043175e+05, 4.40008090e+06, 1.76243005e+03]])

サンプルデータまたは自分のプロジェクトからの点/頂点のNumPy配列ができたので,それらの点からPyVistaメッシュを作成します.

PolyDataInformation
N Cells67841
N Points67841
N Strips0
X Bounds4.809e+05, 4.811e+05
Y Bounds4.400e+06, 4.400e+06
Z Bounds1.754e+03, 1.787e+03
N Arrays0


ここで,ポイントが正しくロードされたことを示すために、サニティチェックを実行します.

True

これでPyVistaメッシュができたので,プロットすることができます.ここでは,eye domeライティングを使用するオプションを追加します.これは,ポイントクラウド( EDL についてもっと学ぶ)を使用して深さの認識を向上させるシェーディング技法です.

point_cloud.plot(eye_dome_lighting=True)
b create point cloud

ここで,メッシュのすべてのノードに関連付けるデータアトリビュート(スカラーまたはベクトル配列)があるとします.最初の軸に沿ったメッシュ内のノードの数と同じ長さのNumPyデータ配列を簡単に追加できます.例えば,この新しい point_cloud メッシュにいくつかの配列を追加しましょう.

points配列と同じ長さのスカラ値の配列を作成します.この配列の各要素は,同じインデックスのポイントに対応します.

注釈

points 配列のコンポーネントを使用するか,メッシュの n_points プロパティを使用すると,その長さの配列を作成することができます.

# Make data array using z-component of points array
data = points[:, -1]

そのデータを "elevation" という名前でメッシュに追加します.

point_cloud["elevation"] = data

今回は, render_points_as_spheres を使って,すべての点を球体としてレンダリングしてみましょう.

point_cloud.plot(render_points_as_spheres=True)
b create point cloud

そのデータは退屈ですよね?複数のスカラ値を持つデータ配列,例えば3つの要素を持つベクトルを追加することもできます.ポイントクラウド内のすべてのノードのベクトルを計算し,それらのベクトルをメッシュに追加する簡単な関数を作成します.

今回は numpy.random.random() を使って,100点からなる全く新しいランダムな点群を作成する.

# Create a random point cloud with Cartesian coordinates
points = np.random.rand(100, 3)
# Construct PolyData from those points
point_cloud = pv.PolyData(points)


def compute_vectors(mesh):
    """Create normalized vectors pointing outward from the center of the cloud."""
    origin = mesh.center
    vectors = mesh.points - origin
    return vectors / np.linalg.norm(vectors, axis=1)[:, None]


vectors = compute_vectors(point_cloud)
vectors[0:5, :]
pyvista_ndarray([[ 0.30506433, -0.94233575,  0.13761939],
                 [-0.7689157 , -0.37535147, -0.51757118],
                 [-0.73891273, -0.15283554,  0.65623874],
                 [ 0.76253371, -0.64103253, -0.08729053],
                 [-0.4652055 , -0.3673128 ,  0.80539751]])

ベクトル配列を点データとして新しいメッシュに追加します:

point_cloud["vectors"] = vectors

さて,これらのベクトルを使って,グリフフィルタで矢印を作ることができます(詳しくは グリフの例 を参照してください).

arrows = point_cloud.glyph(
    orient="vectors",
    scale=False,
    factor=0.15,
)

# Display the arrows
plotter = pv.Plotter()
plotter.add_mesh(point_cloud, color="maroon", point_size=10.0, render_points_as_spheres=True)
plotter.add_mesh(arrows, color="lightblue")
# plotter.add_point_labels([point_cloud.center,], ['Center',],
#                          point_color='yellow', point_size=20)
plotter.show_grid()
plotter.show()
b create point cloud
Open In Colab

Total running time of the script: (0 minutes 3.297 seconds)

Sphinx-Galleryによるギャラリー