7 releases (4 stable)

1.2.1 Nov 4, 2023
1.2.0 Jan 29, 2023
0.1.2 Mar 20, 2021
0.1.1 Jan 4, 2021
0.1.0 Dec 15, 2020

#194 in Graphics APIs

24 downloads per month

MIT license

28KB
516 lines

kdtree-ray

github crates.io docs.rs


This crate is a fast implementation of KD-Tree for raytracer (or other rendering method using ray).

It's based on this paper written by Ingo Wald and Vlastimil Havran.

For more information on how this library is implemented check out my article.

Installation

To install it, just add the dependency in your Cargo.toml.

[dependencies]
kdtree-ray="1.2.1"

Usage

use cgmath::*;
use kdtree_ray::{AABB, Bounded, KDTree};

struct Triangle(Vector3<f32>, Vector3<f32>, Vector3<f32>);

// To use the KDTree on an object you need first to implement the BoundingBox trait.
impl Bounded for Triangle {
  fn bound(&self) -> AABB {
    let min = Vector3::new(
      self.0.x.min(self.1.x).min(self.2.x),
      self.0.y.min(self.1.y).min(self.2.y),
      self.0.z.min(self.1.z).min(self.2.z),
    );
    let max = Vector3::new(
      self.0.x.max(self.1.x).max(self.2.x),
      self.0.y.max(self.1.y).max(self.2.y),
      self.0.z.max(self.1.z).max(self.2.z),
    );
    AABB::new(min, max)
  }
}

// Kdtree creation
let triangle = Triangle(Vector3::zero(), Vector3::zero(), Vector3::zero());
let triangles: Vec<Triangle> = vec![triangle, /* ... */];
let kdtree = KDTree::build(&triangles);

// Get a reduced list of triangles that a ray could intersect
let ray_origin = Vector3::zero();
let ray_direction = Vector3::new(1., 0., 0.);
let candidates_triangles = kdtree.intersect(&ray_origin, &ray_direction);

Examples of projects using this crate:

Dependencies

~1.8–2.5MB
~51K SLoC