Skip to content
Plugins (190)

pointcloud

stable

A 3D point cloud class for managing collections of coloured XYZ points with operations for nearest-neighbour search, bounding box, centroid, transforms, subsampling, and binary serialisation.

use plugin pointcloud
15 functions Game
Runs with the native Zolo host

Plugin snippets can be edited in the Playground, but native capabilities are executed locally with the Zolo CLI.

/ filter jk navigate Esc clear
Functions (15)
  1. PointCloud.new Create an empty point cloud
  2. add_point Add an XYZ + RGB point
  3. remove_point Remove a point by index
  4. count Return number of points
  5. get_point Get a point by index
  6. clear Remove all points
  7. nearest_neighbor Find closest point to a query position
  8. bounding_box Compute axis-aligned bounding box
  9. centroid Compute mean position of all points
  10. translate Translate all points by an offset
  11. scale Scale all points by a factor
  12. subsample Create a new cloud keeping every Nth point
  13. rotate_y Rotate all points around the Y axis
  14. to_bytes Serialise points to packed binary bytes
  15. PointCloud.merge Merge two clouds into a new cloud

From import to result

  1. 01Import only what you use
  2. 02Copy the smallest example
  3. 03Run it with the Zolo CLI

Create an empty point cloud

Creates a new empty point cloud. Points store XYZ position as floats and RGB colour as 0–255 integer bytes.

use plugin pointcloud::{PointCloud}

let cloud = PointCloud.new()
cloud.add_point(0.0, 0.0, 0.0, 255, 0, 0)
cloud.add_point(1.0, 0.0, 0.0, 0, 255, 0)
print("Points: {cloud.count()}")

Add an XYZ + RGB point

Appends a point at position (x, y, z) with colour (r, g, b) where colour components are integers 0–255.

use plugin pointcloud::{PointCloud}

let cloud = PointCloud.new()
cloud.add_point(1.5, 2.3, 0.1, 128, 200, 255)
cloud.add_point(0.0, 1.0, 3.0, 255, 128, 0)

Remove a point by index

Removes the point at zero-based index idx. Shifts all subsequent points down by one. Raises an error if idx is out of bounds.

use plugin pointcloud::{PointCloud}

let cloud = PointCloud.new()
cloud.add_point(0.0, 0.0, 0.0, 255, 0, 0)
cloud.add_point(1.0, 0.0, 0.0, 0, 255, 0)
cloud.remove_point(0)
print("Remaining: {cloud.count()}")

Return number of points

Returns the number of points currently stored in the cloud.

use plugin pointcloud::{PointCloud}

let cloud = PointCloud.new()
cloud.add_point(0.0, 0.0, 0.0, 0, 0, 0)
print("Count: {cloud.count()}")

Get a point by index

Returns the point at zero-based index idx as a table with x, y, z (float) and r, g, b (int) fields.

use plugin pointcloud::{PointCloud}

let cloud = PointCloud.new()
cloud.add_point(3.14, 2.71, 1.0, 100, 150, 200)
let p = cloud.get_point(0)
print("x={p["x"]} y={p["y"]} z={p["z"]}")

Remove all points

Removes all points from the cloud without deallocating the underlying storage.

use plugin pointcloud::{PointCloud}

let cloud = PointCloud.new()
cloud.add_point(1.0, 2.0, 3.0, 0, 0, 0)
cloud.clear()
print("After clear: {cloud.count()}")

Find closest point to a query position

Finds the point closest to query position (x, y, z) using brute-force Euclidean distance. Returns a table with index, x, y, z, and distance fields, or nil if the cloud is empty.

use plugin pointcloud::{PointCloud}

let cloud = PointCloud.new()
cloud.add_point(0.0, 0.0, 0.0, 255, 0, 0)
cloud.add_point(5.0, 5.0, 5.0, 0, 0, 255)
let nn = cloud.nearest_neighbor(1.0, 1.0, 1.0)
print("Nearest index: {nn["index"]}, dist: {nn["distance"]}")

Compute axis-aligned bounding box

Computes the axis-aligned bounding box of all points. Returns a table with min_x, min_y, min_z, max_x, max_y, max_z fields. Returns nil if the cloud is empty.

use plugin pointcloud::{PointCloud}

let cloud = PointCloud.new()
cloud.add_point(-1.0, 0.0, 2.0, 0, 0, 0)
cloud.add_point(3.0, 4.0, -1.0, 0, 0, 0)
let bb = cloud.bounding_box()
print("Min: {bb["min_x"]},{bb["min_y"]},{bb["min_z"]}")
print("Max: {bb["max_x"]},{bb["max_y"]},{bb["max_z"]}")

Compute mean position of all points

Computes the arithmetic mean position of all points. Returns a table with x, y, z float fields, or nil if the cloud is empty.

use plugin pointcloud::{PointCloud}

let cloud = PointCloud.new()
cloud.add_point(0.0, 0.0, 0.0, 0, 0, 0)
cloud.add_point(2.0, 4.0, 6.0, 0, 0, 0)
let c = cloud.centroid()
print("Centroid: {c["x"]}, {c["y"]}, {c["z"]}")

Translate all points by an offset

Shifts all points in the cloud by the vector (dx, dy, dz). Modifies the cloud in-place.

use plugin pointcloud::{PointCloud}

let cloud = PointCloud.new()
cloud.add_point(1.0, 2.0, 3.0, 255, 0, 0)
cloud.translate(-1.0, -2.0, -3.0)
let p = cloud.get_point(0)
print("After translate: {p["x"]},{p["y"]},{p["z"]}")

Scale all points by a factor

Multiplies the XYZ coordinates of every point by factor. Useful for unit conversion or normalisation. Modifies the cloud in-place.

use plugin pointcloud::{PointCloud}

let cloud = PointCloud.new()
cloud.add_point(1.0, 2.0, 3.0, 0, 255, 0)
cloud.scale(0.001)
let p = cloud.get_point(0)
print("Scaled x: {p["x"]}")

Create a new cloud keeping every Nth point

Returns a new cloud containing every Nth point (stride subsampling). Useful for reducing density before expensive operations. n must be at least 1.

use plugin pointcloud::{PointCloud}

let cloud = PointCloud.new()
// add many points...
cloud.add_point(0.0, 0.0, 0.0, 0, 0, 0)
cloud.add_point(1.0, 0.0, 0.0, 0, 0, 0)
cloud.add_point(2.0, 0.0, 0.0, 0, 0, 0)
cloud.add_point(3.0, 0.0, 0.0, 0, 0, 0)
let sparse = cloud.subsample(2)
print("Sparse count: {sparse.count()}")

Rotate all points around the Y axis

Rotates all points around the Y axis by angle_rad radians. Modifies the cloud in-place.

use plugin pointcloud::{PointCloud}

let cloud = PointCloud.new()
cloud.add_point(1.0, 0.0, 0.0, 255, 0, 0)
cloud.rotate_y(3.14159)
let p = cloud.get_point(0)
print("After 180 rotation: x={p["x"]}, z={p["z"]}")

Serialise points to packed binary bytes

Serialises all points to a compact binary format: each point is 27 bytes (3 × 8-byte little-endian float64 for XYZ, 3 × 1-byte uint8 for RGB).

use plugin pointcloud::{PointCloud}

let cloud = PointCloud.new()
cloud.add_point(1.0, 2.0, 3.0, 100, 150, 200)
let bytes = cloud.to_bytes()
print("Binary size: {bytes.len} bytes")

Merge two clouds into a new cloud

Static method. Combines two point clouds into a new cloud containing all points from both. Does not modify either input cloud.

use plugin pointcloud::{PointCloud}

let a = PointCloud.new()
a.add_point(0.0, 0.0, 0.0, 255, 0, 0)

let b = PointCloud.new()
b.add_point(1.0, 1.0, 1.0, 0, 0, 255)

let combined = PointCloud.merge(a, b)
print("Merged count: {combined.count()}")

Global index

Find your way through Zolo

Try an idea

Start here

9 results

9 results

en