#kdtree #ray-tracer #3d #sah #3d-rendering

kdtree-ray

为光线追踪器(或使用光线的其他渲染方法)快速实现的Kdtree

7个版本 (4个稳定)

1.2.1 2023年11月4日
1.2.0 2023年1月29日
0.1.2 2021年3月20日
0.1.1 2021年1月4日
0.1.0 2020年12月15日

#117图形API

每月21次下载

MIT 许可证

28KB
516

kdtree-ray

github crates.io docs.rs


这个crate是对KD-Tree的快速实现,用于光线追踪器(或使用光线的其他渲染方法)。

它基于由Ingo WaldVlastimil Havran撰写的这篇论文

有关该库实现方式的更多信息,请参阅我的文章

安装

要安装它,只需在您的Cargo.toml中添加依赖项。

[dependencies]
kdtree-ray="1.2.1"

用法

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);

使用此crate的项目示例

依赖项

~1.8–2.5MB
~52K SLoC