pub enum BvhBuildStrategy {
Binned,
Ploc,
}Expand description
The strategy for one-time build of the BVH tree.
This enum controls which algorithm is used when constructing a BVH from scratch. Different strategies offer different trade-offs between construction speed and final tree quality (measured by ray-casting performance and other query efficiency).
§Strategy Comparison
- Binned: Fast construction with good overall quality. Best for general-purpose use.
- PLOC: Slower construction but produces higher quality trees. Best when ray-casting performance is critical and construction time is less important.
§Performance Notes
- Neither strategy is currently parallelized, though PLOC is designed to support parallelization.
- Tree quality affects query performance: better trees mean fewer node visits during traversals.
- For dynamic scenes with frequent updates, choose based on initial construction performance.
§Example
use parry3d::partitioning::{Bvh, BvhBuildStrategy};
use parry3d::bounding_volume::Aabb;
use nalgebra::Point3;
// Create some AABBs for objects in the scene
let aabbs = vec![
Aabb::new(Point3::origin(), Point3::new(1.0, 1.0, 1.0)),
Aabb::new(Point3::new(2.0, 0.0, 0.0), Point3::new(3.0, 1.0, 1.0)),
Aabb::new(Point3::new(0.0, 2.0, 0.0), Point3::new(1.0, 3.0, 1.0)),
];
// Use binned strategy for general purpose (default)
let bvh_binned = Bvh::from_leaves(BvhBuildStrategy::Binned, &aabbs);
assert_eq!(bvh_binned.leaf_count(), 3);
// Use PLOC strategy for ray-casting heavy applications
let bvh_ploc = Bvh::from_leaves(BvhBuildStrategy::Ploc, &aabbs);
assert_eq!(bvh_ploc.leaf_count(), 3);§See Also
Bvh::from_leaves- Construct a BVH using a specific strategyBvh::from_iter- Construct a BVH from an iterator
Variants§
Binned
The tree is built using the binned strategy.
This implements the strategy from “On fast Construction of SAH-based Bounding Volume Hierarchies” by Ingo Wald. It uses binning to quickly approximate the Surface Area Heuristic (SAH) cost function, resulting in fast construction times with good tree quality.
Recommended for: General-purpose usage, dynamic scenes, initial prototyping.
Ploc
The tree is built using the Locally-Ordered Clustering technique.
This implements the strategy from “Parallel Locally-Ordered Clustering for Bounding Volume Hierarchy Construction” by Meister and Bittner. It produces higher quality trees at the cost of slower construction. The algorithm is designed for parallelization but the current implementation is sequential.
Recommended for: Ray-casting heavy workloads, static scenes, when query performance is more important than construction time.
Trait Implementations§
Source§impl Clone for BvhBuildStrategy
impl Clone for BvhBuildStrategy
Source§fn clone(&self) -> BvhBuildStrategy
fn clone(&self) -> BvhBuildStrategy
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for BvhBuildStrategy
impl Debug for BvhBuildStrategy
Source§impl Default for BvhBuildStrategy
impl Default for BvhBuildStrategy
Source§fn default() -> BvhBuildStrategy
fn default() -> BvhBuildStrategy
Source§impl PartialEq for BvhBuildStrategy
impl PartialEq for BvhBuildStrategy
impl Copy for BvhBuildStrategy
impl Eq for BvhBuildStrategy
impl StructuralPartialEq for BvhBuildStrategy
Auto Trait Implementations§
impl Freeze for BvhBuildStrategy
impl RefUnwindSafe for BvhBuildStrategy
impl Send for BvhBuildStrategy
impl Sync for BvhBuildStrategy
impl Unpin for BvhBuildStrategy
impl UnwindSafe for BvhBuildStrategy
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> DowncastSend for T
impl<T> DowncastSend for T
Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.