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.
To install it, just add the dependency in your Cargo.toml
.
toml
[dependencies]
kdtree-ray="1.2.0"
```rust use cgmath::*; use kdtree_ray::{AABB, Bounded, KDTree};
struct Triangle(Vector3
// 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
// Get a reduced list of triangles that a ray could intersect let rayorigin = Vector3::zero(); let raydirection = Vector3::new(1., 0., 0.); let candidatestriangles = kdtree.intersect(&rayorigin, &ray_direction); ```
Examples of projects using this crate: