pub struct Ray<T: BHValue, const D: usize> {
pub origin: Point<T, D>,
pub direction: SVector<T, D>,
pub inv_direction: SVector<T, D>,
}
Expand description
A struct which defines a ray and some of its cached values.
Fields§
§origin: Point<T, D>
The ray origin.
direction: SVector<T, D>
The ray direction.
inv_direction: SVector<T, D>
Inverse (1/x) ray direction. Cached for use in Aabb
intersections.
Implementations§
source§impl<T: BHValue, const D: usize> Ray<T, D>
impl<T: BHValue, const D: usize> Ray<T, D>
sourcepub fn new(origin: Point<T, D>, direction: SVector<T, D>) -> Ray<T, D>where
T: One + ComplexField,
pub fn new(origin: Point<T, D>, direction: SVector<T, D>) -> Ray<T, D>where
T: One + ComplexField,
Creates a new Ray
from an origin
and a direction
.
direction
will be normalized.
§Examples
use bvh::ray::Ray;
use nalgebra::{Point3,Vector3};
let origin = Point3::new(0.0,0.0,0.0);
let direction = Vector3::new(1.0,0.0,0.0);
let ray = Ray::new(origin, direction);
assert_eq!(ray.origin, origin);
assert_eq!(ray.direction, direction);
sourcepub fn intersects_aabb(&self, aabb: &Aabb<T, D>) -> bool
pub fn intersects_aabb(&self, aabb: &Aabb<T, D>) -> bool
Tests the intersection of a Ray
with an Aabb
using the optimized algorithm
from this paper.
§Examples
use bvh::aabb::Aabb;
use bvh::ray::Ray;
use nalgebra::{Point3,Vector3};
let origin = Point3::new(0.0,0.0,0.0);
let direction = Vector3::new(1.0,0.0,0.0);
let ray = Ray::new(origin, direction);
let point1 = Point3::new(99.9,-1.0,-1.0);
let point2 = Point3::new(100.1,1.0,1.0);
let aabb = Aabb::with_bounds(point1, point2);
assert!(ray.intersects_aabb(&aabb));
sourcepub fn intersects_triangle(
&self,
a: &Point<T, D>,
b: &Point<T, D>,
c: &Point<T, D>
) -> Intersection<T>
pub fn intersects_triangle( &self, a: &Point<T, D>, b: &Point<T, D>, c: &Point<T, D> ) -> Intersection<T>
Implementation of the Möller-Trumbore triangle/ray intersection algorithm. Returns the distance to the intersection, as well as the u and v coordinates of the intersection. The distance is set to +INFINITY if the ray does not intersect the triangle, or hits it from behind.
Trait Implementations§
impl<T: Copy + BHValue, const D: usize> Copy for Ray<T, D>
Auto Trait Implementations§
impl<T, const D: usize> Freeze for Ray<T, D>where
T: Freeze,
impl<T, const D: usize> RefUnwindSafe for Ray<T, D>where
T: RefUnwindSafe,
impl<T, const D: usize> Send for Ray<T, D>where
T: Send,
impl<T, const D: usize> Sync for Ray<T, D>where
T: Sync,
impl<T, const D: usize> Unpin for Ray<T, D>where
T: Unpin,
impl<T, const D: usize> UnwindSafe for Ray<T, D>where
T: UnwindSafe,
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
Mutably borrows from an owned value. Read more
source§impl<T> Pointable for T
impl<T> Pointable for T
source§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>
The inverse inclusion map: attempts to construct
self
from the equivalent element of its
superset. Read moresource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
Checks if
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
Use with care! Same as
self.to_subset
but without any property checks. Always succeeds.source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
The inclusion map: converts
self
to the equivalent element of its superset.