Skip to main content

A Python tool for 3D adaptive binary space partitioning

Project description

abspy: a Python tool for 3D adaptive binary space partitioning and beyond

License: MITPyPI version

Introduction

This repository implements adaptive binary space partitioning: an ambient 3D space is recessively partitioned into non-overlapping convexes with pre-detected planar primitives. It is implemented initially for surface reconstruction, but can be extrapolated to other applications nevertheless.

docs/partition.png

An exact kernel of SageMath is used for robust Boolean spatial operations. This rational-based representation help avoid degenerate cases that may otherwise result in inconsistencies in the geometry.

Installation

Install SageMath

For Linux and macOS users, the easist is to install from conda-forge:

conda config --add channels conda-forge
conda install sage

Alternatively, you can use mamba for faster parsing and package installation:

conda config --add channels conda-forge
conda install mamba
mamba install sage

For Windows users, consider building SageMath from source or install all other dependencies into a pre-built SageMath environment.

Install other requirements

pip install -r requirements.txt

Optionally, install trimesh and pyglet for benchmarking and visualisation, respectively:

pip install trimesh pyglet

Install pyabsp

pip install abspy

Quick start

Here is an example of loading a point cloud in VertexGroup (.vg), partitioning the ambient space into candidate convexes, creating the adjacency graph and extracting the outer surface of the object. For the data structure of a .vg file, please refer to VertexGroup.

import numpy as np
from abspy import VertexGroup, AdjacencyGraph, CellComplex

# load a point cloud in VertexGroup 
vertex_group = VertexGroup(filepath='points.vg')

# normalise the point cloud
vertex_group.normalise_to_centroid_and_scale()

# retrieve planes, bounds and points from VertexGroup
planes, bounds, points = np.array(vertex_group.planes), np.array(vertex_group.bounds), np.array(vertex_group.points_grouped, dtype=object)

# additional planes to append (e.g., the bounding planes)
additional_planes = [[0, 0, 1, -bounds[:, 0, 2].min()]]

# initialise CellComplex from planar prititives
cell_complex = CellComplex(planes, bounds, points, build_graph=True, additional_planes=additional_planes)

# refine planar primitives
cell_complex.refine_planes()

# prioritise certain planes
cell_complex.prioritise_planes()

# construct CellComplex 
cell_complex.construct()

# print info on the cell complex
cell_complex.print_info()

# visualise the cell complex (only if trimesh installation is found)
cell_complex.visualise()

# build adjacency graph of the cell complex
graph = AdjacencyGraph(cell_complex.graph)

# apply random weights (could instead be the predicted probability
# for each convex being selected as composing the object in practice)
weights_list = np.array([random.random() for _ in range(cell_complex.num_cells)])
weights_list *= cell_complex.volumes(multiplier=10e5)
weights_dict = graph.to_dict(weights_list)

# assign weights to n-links and st-links to the graph
graph.assign_weights_to_n_links(cell_complex.cells, attribute='area_overlap', factor=0.1, cache_interfaces=True)
graph.assign_weights_to_st_links(weights_dict)

# perform graph-cut
_, _ = graph.cut()

# save surface model to an obj file
graph.save_surface_obj('surface.obj', engine='rendering')

License

MIT

Citation

If you use pyabsp in a scientific work, please cite:

@article{chen2021reconstructing,
  title={Reconstructing Compact Building Models from Point Clouds Using Deep Implicit Fields},
  author={Chen, Zhaiyu and Khademi, Seyran and Ledoux, Hugo and Nan, Liangliang},
  journal={arXiv preprint arXiv:2112.13142},
  year={2021}
}

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

abspy-0.0.1.tar.gz (49.0 kB view details)

Uploaded Source

Built Distribution

abspy-0.0.1-py3-none-any.whl (18.6 kB view details)

Uploaded Python 3

File details

Details for the file abspy-0.0.1.tar.gz.

File metadata

  • Download URL: abspy-0.0.1.tar.gz
  • Upload date:
  • Size: 49.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.7.1 importlib_metadata/4.10.0 pkginfo/1.8.2 requests/2.27.1 requests-toolbelt/0.9.1 tqdm/4.58.0 CPython/3.9.9

File hashes

Hashes for abspy-0.0.1.tar.gz
Algorithm Hash digest
SHA256 885dec793ee73e5d7f91bbc7a4b797fab422e4f3b6aac85d687d91c7d374f5e7
MD5 6c2925f7bc5bc664e67cfd6034b3d9eb
BLAKE2b-256 a4fbe435d5b5ca8e28221e5f5bb73068760a7a20dfb1f7d552e82d290e816069

See more details on using hashes here.

File details

Details for the file abspy-0.0.1-py3-none-any.whl.

File metadata

  • Download URL: abspy-0.0.1-py3-none-any.whl
  • Upload date:
  • Size: 18.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.7.1 importlib_metadata/4.10.0 pkginfo/1.8.2 requests/2.27.1 requests-toolbelt/0.9.1 tqdm/4.58.0 CPython/3.9.9

File hashes

Hashes for abspy-0.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 cf5f816724767eba2e58f6ee1e1b4304154711d410cf0ecd2142b638ec9c0d1c
MD5 646d2c15cf1b5427229f35a6f0677c19
BLAKE2b-256 50677a48305d47194ef1e8705162da6798f323670d17df03306751f4ee0c1c03

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page