見出し画像

Kaolin / 3D表現

Kaolin」では、「メッシュ」「ボクセル」「ポイントクラウド」「符号付き距離関数」といった3D表現を、簡単に変換できることを確かめます。
(元ネタはKaolinのドキュメント)

画像3

1. インポート

Pythonインタプリタを起動し、Kaolinをインポートします。

>>> import kaolin as kal

2. メッシュ

Kaolinで「メッシュ」を読み込むには、TriangleMesh.from_obj()を呼びます。今回は、Kaolinリポジトリの「tests」フォルダにある「models.obj」を読み込みました。

>>> mesh = kal.rep.TriangleMesh.from_obj('model.obj')

メッシュは、一連の3D頂点と面で構成されています。頂点は「mesh.vertices」、面は「mesh.faces」でアクセスできます。

>>> mesh.vertices.shape
torch.Size([482, 3])
>>> mesh.faces.shape
torch.Size([482, 3])

メッシュを視覚化するには、show()を呼びます。

>>> kal.visualize.show(mesh)

画像1

3. ボクセル

「ボクセル」は、もうひとつの一般的な3D表現です。ピクセルの3D拡張と言えます。「メッシュ」を「ボクセル」に変換するのは、trianglemesh_to_voxelgrid()を呼びます。

>>> voxels = kal.conversions.trianglemesh_to_voxelgrid(mesh, 32)

「ボクセル」を視覚化するには、show()を呼びます。

>>> kal.visualize.show(voxels, mode='voxels')

画像2

4. ポイントクラウド

「ポイントクラウド」は、もうひとつの一般的な3D表現です。「ポイントクラウド」の各点はオブジェクトの表面上の点(通常は3D)を表します。「メッシュ」を「ポイントクラウド」に変換するには、trianglemesh_to_pointcloud()を呼びます。この関数は微分可能です。つまり、このサンプリングプロセスを通じて逆伝播することができます。以下の引数1000は、メッシュの表面から均一にサンプリングされるポイントの数を示しています。

>>> points, _ = kal.conversions.trianglemesh_to_pointcloud(mesh, 1000)

5. 符号付き距離関数

これまで見てきた3D表現は、「明示的な表面表現」と呼ばれます。「メッシュ」「ボクセル」「ポイントクラウド」は、3Dオブジェクトの表面上の点を明示的に表すためです。「符号付き距離関数」(SDF)は、表面を明示的に表さないため、「暗黙的な表面表現」と呼ばれます。表面の位置(および方向)を推測するために使用できます。「メッシュ」を「SDF」に変換するには、trianglemesh_to_sdf()を呼びます。これは、多数の点の距離を照会するために使用できます。

>>> sdf = kal.conversions.trianglemesh_to_sdf(mesh)

A. 3D表現を変換する関数一覧

3D表現を変換する関数の一覧は次のとおりです。

◎ TriangleMesh → VoxelGrid

>>> voxels = kal.conversions.trianglemesh_to_voxelgrid(mesh, 32)

◎ TriangleMesh → PointCloud

>>> voxels = kal.conversions.trianglemesh_to_pointcloud(mesh, 1000)

◎ TriangleMesh → SDF

>>> sdf = kal.conversions.trianglemesh_to_sdf(mesh)

◎ VoxelGrid → PointCloud

>>> sdf = kal.conversions.voxelgrid_to_pointcloud(voxels, 1000)

◎ VoxelGrid → TriangleMesh

verts, faces = kal.conversions.voxelgrid_to_trianglemesh(voxel, mode='marching_cubes')

◎ VoxelGrid → QuadMesh

>>> verts, faces = kal.conversions.voxelgrid_to_quadmesh(voxels, thresh=.1)

◎ VoxelGrid → SDF

>>> sdf = kal.conversions.voxelgrid_to_sdf(voxels, thresh=.5)

◎ SDF → PointCloud

>>> points = kal.conversions.sdf_to_pointcloud(sdf, bbox_center=0., resolution=10, bbox_dim=1,  num_points = 10000)

◎ SDF → TriangleMesh

>>> verts, faces = kal.conversions.sdf_to_trianglemesh(sdf, bbox_center=0., resolution=10, bbox_dim=1)

◎ SDF → VoxelGrid

>>> voxels = kal.conversions.sdf_to_voxelgrid(sdf, bbox_center=0., resolution=10, bbox_dim=1)

◎ PointCloud → VoxelGrid

>>> voxels = kal.conversions.pointcloud_to_voxelgrid(points, 32, 0.1)

◎ PointCloud → TriangleMesh

>>> mesh_ = kal.conversions.pointcloud_to_trianglemesh(points)

◎ PointCloud → SDF

>>> sdf_ = kal.conversions.pointcloud_to_trianglemesh(points)


この記事が気に入ったらサポートをしてみませんか?