Octree structure containing a 3D triangular mesh model. To be used for ray tracing / shadow casting.
Written in C++ for speed, but exposed to Python using Cython.
.. image:: https://img.shields.io/pypi/v/pyoctree.svg :target: https://pypi.python.org/pypi/pyoctree/ :alt: Latest PyPI version
Pyoctree uses an adaptive structure, so it will automatically divide branches to ensure that there are no more than 200 objects per leaf.
Note that a compiler is not required if installing using the provided Python wheel.
Intersection testing uses parallel processing via OpenMP. To use more than a single processor, use the provided Python wheel or compile from source using a compiler that supports OpenMP. Then set value of environment variable OMP_NUM_THREADS to the number of desired processors.
Note that the compilers provided by the Anaconda Python distribution do not support OpenMP.
To compile without OpenMP, open a command prompt, browse to the base directory containing the setup.py file and type:
.. code::
python setup.py install
To compile with OpenMP, open a command prompt, browse to the base directory containing the setup.py file and type:
.. code::
python setup.py install --openmp
Download the python wheel from releases <https://github.com/mhogg/pyoctree/releases>
_ i.e.
pyoctree-0.2.10-cp36-cp36m-win_amd64.whl for Python 3.6 on Windows 64-bit. Then, open a command
prompt, browse to the download directory and type:
.. code::
pip install pyoctree-0.2.10-cp36-cp36m-win_amd64.whl
Note that Python wheels have been built with OpenMP.
.. code:: python
from pyoctree import pyoctree as ot
tree = ot.PyOctree(pointCoords,connectivity)
where:
pointCoords is a Nx3 numpy array of floats (dtype=float) representing the 3D coordinates of the mesh points
connectivity is a Nx3 numpy array of integers (dtype=np.int32) representing the point connectivity of each tri element in the mesh
The octree can be used to quickly find intersections between the object and a ray. For example:
.. code:: python
import numpy as np
startPoint = [0.0,0.0,0.0]
endPoint = [0.0,0.0,1.0]
rayList = np.array([[startPoint,endPoint]],dtype=np.float32)
intersectionFound = tree.rayIntersection(rayList)
Some Jupyter notebooks are provided in the Examples directory on how to use pyoctree.
If help is required, please create an issue on Github.