スポンサーリンク
PointCloudのサンプルは沢山あるのだがランダム頂点を表示するような物ばかりで、任意の頂点を追加する方法がわからず一月近く調べていた。Pythonは普段使わないのでそういうことになったのだが以下がとりあえずの答。
import open3d import numpy # 点群型データ作成 pcd = open3d.geometry.PointCloud() # 座標設定 pcd.points.append([0.0,0.0,0.0]) pcd.points.append([1.0,1.0,1.0]) pcd.points.append([1.0,2.0,0.0]) # 色設定 pcd.colors.append([1.0,0.0,0.0]); pcd.colors.append([0.0,1.0,0.0]); pcd.colors.append([0.0,0.0,1.0]); # 法線設定 pcd.normals.append([1.0,0.0,0.0]); pcd.normals.append([0.0,1.0,0.0]); pcd.normals.append([0.0,0.0,1.0]); open3d.visualization.draw_geometries( [pcd], width=400, height=400, point_show_normal = True )
一応、私のように必要に迫られてPythonやってる人のためにどうやって調べたかを書いておくと、以下のプログラムを書いて走らせる。
import open3d pcd = open3d.io.read_point_cloud("bun000.ply") print( type ( pcd.points ) ) print( type ( pcd.points[0] ) )
すると以下のような結果を得られる。
<class 'open3d.cpu.pybind.utility.Vector3dVector'>
<class 'numpy.ndarray'>
これでどうやらVector3dVectorという型が頂点リストになっているらしいので以下を検索する。
http://www.open3d.org/docs/release/python_api/open3d.utility.Vector3dVector.html
append
(self: open3d.cpu.pybind.utility.Vector3dVector, x: numpy.ndarray[float64[3, 1]])
するとappendぽい関数がある。この読み方、
引数名:データ型 , 引き数名:データ型 , ...
となっているらしい。で、pythonのselfはC++におけるthisなので無視して、与えるのがxでその型がnumpy.ndarrayだと言うのでndarrayについて調べる。
受け手側がndarrayなので、ndarrayには普通の配列[x,y,z]などをそのまま入れられるらしい?ので、最初のコードになる。