53 lines
2.3 KiB
Python
53 lines
2.3 KiB
Python
# ==============================================================================================================
|
|
# The following snippet demonstrates how to build kaolin's compressed octree,
|
|
# "Structured Point Cloud (SPC)", from raw point cloud data.
|
|
# ==============================================================================================================
|
|
# See also:
|
|
#
|
|
# - Tutorial: Understanding Structured Point Clouds (SPCs)
|
|
# https://github.com/NVIDIAGameWorks/kaolin/blob/master/examples/tutorial/understanding_spcs_tutorial.ipynb
|
|
#
|
|
# - Documentation: Structured Point Clouds
|
|
# https://kaolin.readthedocs.io/en/latest/modules/kaolin.ops.spc.html?highlight=spc#kaolin-ops-spc
|
|
# ==============================================================================================================
|
|
|
|
import torch
|
|
import kaolin
|
|
|
|
# Create some point data with features
|
|
# Point coordinates are expected to be normalized to the range [-1, 1].
|
|
points = torch.tensor([
|
|
[-1.0, -1.0, -1.0],
|
|
[-0.9, -0.95, -1.0],
|
|
[1.0, 0.0, 0.0],
|
|
[0.0, -0.1, 0.3],
|
|
[1.0, 1.0, 1.0]
|
|
], device='cuda')
|
|
features = torch.tensor([
|
|
[0.1, 1.1, 2.1],
|
|
[0.2, 1.2, 2.2],
|
|
[0.3, 1.3, 2.3],
|
|
[0.4, 1.4, 2.4],
|
|
[0.5, 1.5, 2.5],
|
|
], device='cuda')
|
|
|
|
# Structured Point Cloud will be using 3 levels of detail
|
|
level = 3
|
|
|
|
# In kaolin, operations are batched by default
|
|
# Here, in contrast, we use a single point cloud and therefore invoke an unbatched conversion function.
|
|
# For more information about batched operations, see:
|
|
# https://kaolin.readthedocs.io/en/latest/modules/kaolin.ops.batch.html#kaolin-ops-batch
|
|
spc = kaolin.ops.conversions.pointcloud.unbatched_pointcloud_to_spc(pointcloud=points,
|
|
level=level,
|
|
features=features)
|
|
|
|
# SPC is an object which keep tracks of the various octree component
|
|
print(spc)
|
|
print(f'SPC keeps track of the following cells in {level} levels of detail (parents + leaves):\n'
|
|
f' {spc.point_hierarchies}\n')
|
|
|
|
# Note that the point cloud coordinates are quantized to integer coordinates.
|
|
# During conversion, when points fall within the same cell, their features are averaged
|
|
print(f'Features for leaf cells:\n {spc.features}')
|