pub struct InfinitePlane3d {
pub normal: Dir3,
}
Expand description
An unbounded plane in 3D space. It forms a separating surface through the origin, stretching infinitely far
Fields§
§normal: Dir3
The normal of the plane. The plane will be placed perpendicular to this direction
Implementations§
Source§impl InfinitePlane3d
impl InfinitePlane3d
Sourcepub fn new<T: TryInto<Dir3>>(normal: T) -> Self
pub fn new<T: TryInto<Dir3>>(normal: T) -> Self
Create a new InfinitePlane3d
from a normal
§Panics
Panics if the given normal
is zero (or very close to zero), or non-finite.
Sourcepub fn from_points(a: Vec3, b: Vec3, c: Vec3) -> (Self, Vec3)
pub fn from_points(a: Vec3, b: Vec3, c: Vec3) -> (Self, Vec3)
Create a new InfinitePlane3d
based on three points and compute the geometric center
of those points.
The direction of the plane normal is determined by the winding order of the triangular shape formed by the points.
§Panics
Panics if a valid normal can not be computed, for example when the points are collinear and lie on the same line.
Sourcepub fn signed_distance(
&self,
isometry: impl Into<Isometry3d>,
point: Vec3,
) -> f32
pub fn signed_distance( &self, isometry: impl Into<Isometry3d>, point: Vec3, ) -> f32
Computes the shortest distance between a plane transformed with the given isometry
and a
point
. The result is a signed value; it’s positive if the point lies in the half-space
that the plane’s normal vector points towards.
Sourcepub fn project_point(
&self,
isometry: impl Into<Isometry3d>,
point: Vec3,
) -> Vec3
pub fn project_point( &self, isometry: impl Into<Isometry3d>, point: Vec3, ) -> Vec3
Injects the point
into this plane transformed with the given isometry
.
This projects the point orthogonally along the shortest path onto the plane.
Sourcepub fn isometry_into_xy(&self, origin: Vec3) -> Isometry3d
pub fn isometry_into_xy(&self, origin: Vec3) -> Isometry3d
Computes an Isometry3d
which transforms points from the plane in 3D space with the given
origin
to the XY-plane.
§Guarantees
- the transformation is a congruence meaning it will preserve all distances and angles of the transformed geometry
- uses the least rotation possible to transform the geometry
- if two geometries are transformed with the same isometry, then the relations between them, like distances, are also preserved
- compared to projections, the transformation is lossless (up to floating point errors) reversible
§Non-Guarantees
- the rotation used is generally not unique
- the orientation of the transformed geometry in the XY plane might be arbitrary, to enforce some kind of alignment the user has to use an extra transformation ontop of this one
See isometries_xy
for example usescases.
Sourcepub fn isometry_from_xy(&self, origin: Vec3) -> Isometry3d
pub fn isometry_from_xy(&self, origin: Vec3) -> Isometry3d
Computes an Isometry3d
which transforms points from the XY-plane to this plane with the
given origin
.
§Guarantees
- the transformation is a congruence meaning it will preserve all distances and angles of the transformed geometry
- uses the least rotation possible to transform the geometry
- if two geometries are transformed with the same isometry, then the relations between them, like distances, are also preserved
- compared to projections, the transformation is lossless (up to floating point errors) reversible
§Non-Guarantees
- the rotation used is generally not unique
- the orientation of the transformed geometry in the XY plane might be arbitrary, to enforce some kind of alignment the user has to use an extra transformation ontop of this one
See isometries_xy
for example usescases.
Sourcepub fn isometries_xy(&self, origin: Vec3) -> (Isometry3d, Isometry3d)
pub fn isometries_xy(&self, origin: Vec3) -> (Isometry3d, Isometry3d)
Computes both isometries which transforms points from the plane in 3D space with the
given origin
to the XY-plane and back.
§Example
The projection and its inverse can be used to run 2D algorithms on flat shapes in 3D. The workflow would usually look like this:
let triangle_3d @ [a, b, c] = [Vec3::X, Vec3::Y, Vec3::Z];
let center = (a + b + c) / 3.0;
let plane = InfinitePlane3d::new(Vec3::ONE);
let (to_xy, from_xy) = plane.isometries_xy(center);
let triangle_2d = triangle_3d.map(|vec3| to_xy * vec3).map(|vec3| vec3.truncate());
// apply some algorithm to `triangle_2d`
let triangle_3d = triangle_2d.map(|vec2| vec2.extend(0.0)).map(|vec3| from_xy * vec3);
Trait Implementations§
Source§impl Bounded3d for InfinitePlane3d
impl Bounded3d for InfinitePlane3d
Source§fn aabb_3d(&self, isometry: impl Into<Isometry3d>) -> Aabb3d
fn aabb_3d(&self, isometry: impl Into<Isometry3d>) -> Aabb3d
Source§fn bounding_sphere(&self, isometry: impl Into<Isometry3d>) -> BoundingSphere
fn bounding_sphere(&self, isometry: impl Into<Isometry3d>) -> BoundingSphere
Source§impl Clone for InfinitePlane3d
impl Clone for InfinitePlane3d
Source§fn clone(&self) -> InfinitePlane3d
fn clone(&self) -> InfinitePlane3d
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moreSource§impl Debug for InfinitePlane3d
impl Debug for InfinitePlane3d
Source§impl Default for InfinitePlane3d
impl Default for InfinitePlane3d
Source§fn default() -> Self
fn default() -> Self
Returns the default InfinitePlane3d
with a normal pointing in the +Y
direction.
Source§impl<'de> Deserialize<'de> for InfinitePlane3d
impl<'de> Deserialize<'de> for InfinitePlane3d
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl FromReflect for InfinitePlane3dwhere
InfinitePlane3d: Any + Send + Sync,
Dir3: FromReflect + TypePath + MaybeTyped + RegisterForReflection,
impl FromReflect for InfinitePlane3dwhere
InfinitePlane3d: Any + Send + Sync,
Dir3: FromReflect + TypePath + MaybeTyped + RegisterForReflection,
Source§fn from_reflect(reflect: &dyn PartialReflect) -> Option<Self>
fn from_reflect(reflect: &dyn PartialReflect) -> Option<Self>
Self
from a reflected value.Source§fn take_from_reflect(
reflect: Box<dyn PartialReflect>,
) -> Result<Self, Box<dyn PartialReflect>>
fn take_from_reflect( reflect: Box<dyn PartialReflect>, ) -> Result<Self, Box<dyn PartialReflect>>
Self
using,
constructing the value using from_reflect
if that fails. Read moreSource§impl GetTypeRegistration for InfinitePlane3dwhere
InfinitePlane3d: Any + Send + Sync,
Dir3: FromReflect + TypePath + MaybeTyped + RegisterForReflection,
impl GetTypeRegistration for InfinitePlane3dwhere
InfinitePlane3d: Any + Send + Sync,
Dir3: FromReflect + TypePath + MaybeTyped + RegisterForReflection,
Source§fn get_type_registration() -> TypeRegistration
fn get_type_registration() -> TypeRegistration
TypeRegistration
for this type.Source§fn register_type_dependencies(registry: &mut TypeRegistry)
fn register_type_dependencies(registry: &mut TypeRegistry)
Source§impl PartialEq for InfinitePlane3d
impl PartialEq for InfinitePlane3d
Source§impl PartialReflect for InfinitePlane3dwhere
InfinitePlane3d: Any + Send + Sync,
Dir3: FromReflect + TypePath + MaybeTyped + RegisterForReflection,
impl PartialReflect for InfinitePlane3dwhere
InfinitePlane3d: Any + Send + Sync,
Dir3: FromReflect + TypePath + MaybeTyped + RegisterForReflection,
Source§fn get_represented_type_info(&self) -> Option<&'static TypeInfo>
fn get_represented_type_info(&self) -> Option<&'static TypeInfo>
Source§fn clone_value(&self) -> Box<dyn PartialReflect>
fn clone_value(&self) -> Box<dyn PartialReflect>
Reflect
trait object. Read moreSource§fn try_apply(&mut self, value: &dyn PartialReflect) -> Result<(), ApplyError>
fn try_apply(&mut self, value: &dyn PartialReflect) -> Result<(), ApplyError>
Source§fn reflect_kind(&self) -> ReflectKind
fn reflect_kind(&self) -> ReflectKind
Source§fn reflect_ref(&self) -> ReflectRef<'_>
fn reflect_ref(&self) -> ReflectRef<'_>
Source§fn reflect_mut(&mut self) -> ReflectMut<'_>
fn reflect_mut(&mut self) -> ReflectMut<'_>
Source§fn reflect_owned(self: Box<Self>) -> ReflectOwned
fn reflect_owned(self: Box<Self>) -> ReflectOwned
Source§fn try_into_reflect(
self: Box<Self>,
) -> Result<Box<dyn Reflect>, Box<dyn PartialReflect>>
fn try_into_reflect( self: Box<Self>, ) -> Result<Box<dyn Reflect>, Box<dyn PartialReflect>>
Source§fn try_as_reflect(&self) -> Option<&dyn Reflect>
fn try_as_reflect(&self) -> Option<&dyn Reflect>
Source§fn try_as_reflect_mut(&mut self) -> Option<&mut dyn Reflect>
fn try_as_reflect_mut(&mut self) -> Option<&mut dyn Reflect>
Source§fn into_partial_reflect(self: Box<Self>) -> Box<dyn PartialReflect>
fn into_partial_reflect(self: Box<Self>) -> Box<dyn PartialReflect>
Source§fn as_partial_reflect(&self) -> &dyn PartialReflect
fn as_partial_reflect(&self) -> &dyn PartialReflect
Source§fn as_partial_reflect_mut(&mut self) -> &mut dyn PartialReflect
fn as_partial_reflect_mut(&mut self) -> &mut dyn PartialReflect
Source§fn reflect_partial_eq(&self, value: &dyn PartialReflect) -> Option<bool>
fn reflect_partial_eq(&self, value: &dyn PartialReflect) -> Option<bool>
Source§fn apply(&mut self, value: &(dyn PartialReflect + 'static))
fn apply(&mut self, value: &(dyn PartialReflect + 'static))
Source§fn reflect_hash(&self) -> Option<u64>
fn reflect_hash(&self) -> Option<u64>
Source§fn serializable(&self) -> Option<Serializable<'_>>
fn serializable(&self) -> Option<Serializable<'_>>
Source§fn is_dynamic(&self) -> bool
fn is_dynamic(&self) -> bool
Source§impl Reflect for InfinitePlane3dwhere
InfinitePlane3d: Any + Send + Sync,
Dir3: FromReflect + TypePath + MaybeTyped + RegisterForReflection,
impl Reflect for InfinitePlane3dwhere
InfinitePlane3d: Any + Send + Sync,
Dir3: FromReflect + TypePath + MaybeTyped + RegisterForReflection,
Source§fn as_any_mut(&mut self) -> &mut dyn Any
fn as_any_mut(&mut self) -> &mut dyn Any
&mut dyn Any
. Read moreSource§fn into_reflect(self: Box<Self>) -> Box<dyn Reflect>
fn into_reflect(self: Box<Self>) -> Box<dyn Reflect>
Source§fn as_reflect(&self) -> &dyn Reflect
fn as_reflect(&self) -> &dyn Reflect
Source§fn as_reflect_mut(&mut self) -> &mut dyn Reflect
fn as_reflect_mut(&mut self) -> &mut dyn Reflect
Source§impl Serialize for InfinitePlane3d
impl Serialize for InfinitePlane3d
Source§impl Struct for InfinitePlane3dwhere
InfinitePlane3d: Any + Send + Sync,
Dir3: FromReflect + TypePath + MaybeTyped + RegisterForReflection,
impl Struct for InfinitePlane3dwhere
InfinitePlane3d: Any + Send + Sync,
Dir3: FromReflect + TypePath + MaybeTyped + RegisterForReflection,
Source§fn field(&self, name: &str) -> Option<&dyn PartialReflect>
fn field(&self, name: &str) -> Option<&dyn PartialReflect>
name
as a &dyn PartialReflect
.Source§fn field_mut(&mut self, name: &str) -> Option<&mut dyn PartialReflect>
fn field_mut(&mut self, name: &str) -> Option<&mut dyn PartialReflect>
name
as a
&mut dyn PartialReflect
.Source§fn field_at(&self, index: usize) -> Option<&dyn PartialReflect>
fn field_at(&self, index: usize) -> Option<&dyn PartialReflect>
index
as a
&dyn PartialReflect
.Source§fn field_at_mut(&mut self, index: usize) -> Option<&mut dyn PartialReflect>
fn field_at_mut(&mut self, index: usize) -> Option<&mut dyn PartialReflect>
index
as a &mut dyn PartialReflect
.Source§fn name_at(&self, index: usize) -> Option<&str>
fn name_at(&self, index: usize) -> Option<&str>
index
.Source§fn iter_fields(&self) -> FieldIter<'_>
fn iter_fields(&self) -> FieldIter<'_>
Source§fn clone_dynamic(&self) -> DynamicStruct
fn clone_dynamic(&self) -> DynamicStruct
DynamicStruct
.Source§fn get_represented_struct_info(&self) -> Option<&'static StructInfo>
fn get_represented_struct_info(&self) -> Option<&'static StructInfo>
None
if TypeInfo
is not available.Source§impl TypePath for InfinitePlane3d
impl TypePath for InfinitePlane3d
Source§fn type_path() -> &'static str
fn type_path() -> &'static str
Source§fn short_type_path() -> &'static str
fn short_type_path() -> &'static str
Source§fn type_ident() -> Option<&'static str>
fn type_ident() -> Option<&'static str>
Source§fn crate_name() -> Option<&'static str>
fn crate_name() -> Option<&'static str>
Source§impl Typed for InfinitePlane3dwhere
InfinitePlane3d: Any + Send + Sync,
Dir3: FromReflect + TypePath + MaybeTyped + RegisterForReflection,
impl Typed for InfinitePlane3dwhere
InfinitePlane3d: Any + Send + Sync,
Dir3: FromReflect + TypePath + MaybeTyped + RegisterForReflection,
impl Copy for InfinitePlane3d
impl Primitive3d for InfinitePlane3d
impl StructuralPartialEq for InfinitePlane3d
Auto Trait Implementations§
impl Freeze for InfinitePlane3d
impl RefUnwindSafe for InfinitePlane3d
impl Send for InfinitePlane3d
impl Sync for InfinitePlane3d
impl Unpin for InfinitePlane3d
impl UnwindSafe for InfinitePlane3d
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>
. Box<dyn Any>
can
then be further downcast
into Box<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>
. Rc<Any>
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> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<T> DynamicTypePath for Twhere
T: TypePath,
impl<T> DynamicTypePath for Twhere
T: TypePath,
Source§fn reflect_type_path(&self) -> &str
fn reflect_type_path(&self) -> &str
TypePath::type_path
.Source§fn reflect_short_type_path(&self) -> &str
fn reflect_short_type_path(&self) -> &str
Source§fn reflect_type_ident(&self) -> Option<&str>
fn reflect_type_ident(&self) -> Option<&str>
TypePath::type_ident
.Source§fn reflect_crate_name(&self) -> Option<&str>
fn reflect_crate_name(&self) -> Option<&str>
TypePath::crate_name
.Source§fn reflect_module_path(&self) -> Option<&str>
fn reflect_module_path(&self) -> Option<&str>
Source§impl<T> DynamicTyped for Twhere
T: Typed,
impl<T> DynamicTyped for Twhere
T: Typed,
Source§fn reflect_type_info(&self) -> &'static TypeInfo
fn reflect_type_info(&self) -> &'static TypeInfo
Typed::type_info
.Source§impl<S> GetField for Swhere
S: Struct,
impl<S> GetField for Swhere
S: Struct,
Source§impl<T> GetPath for T
impl<T> GetPath for T
Source§fn reflect_path<'p>(
&self,
path: impl ReflectPath<'p>,
) -> Result<&(dyn PartialReflect + 'static), ReflectPathError<'p>>
fn reflect_path<'p>( &self, path: impl ReflectPath<'p>, ) -> Result<&(dyn PartialReflect + 'static), ReflectPathError<'p>>
path
. Read moreSource§fn reflect_path_mut<'p>(
&mut self,
path: impl ReflectPath<'p>,
) -> Result<&mut (dyn PartialReflect + 'static), ReflectPathError<'p>>
fn reflect_path_mut<'p>( &mut self, path: impl ReflectPath<'p>, ) -> Result<&mut (dyn PartialReflect + 'static), ReflectPathError<'p>>
path
. Read moreSource§fn path<'p, T>(
&self,
path: impl ReflectPath<'p>,
) -> Result<&T, ReflectPathError<'p>>where
T: Reflect,
fn path<'p, T>(
&self,
path: impl ReflectPath<'p>,
) -> Result<&T, ReflectPathError<'p>>where
T: Reflect,
path
. Read moreSource§fn path_mut<'p, T>(
&mut self,
path: impl ReflectPath<'p>,
) -> Result<&mut T, ReflectPathError<'p>>where
T: Reflect,
fn path_mut<'p, T>(
&mut self,
path: impl ReflectPath<'p>,
) -> Result<&mut T, ReflectPathError<'p>>where
T: Reflect,
path
. Read moreSource§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
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 more