Struct nalgebra::geometry::Orthographic3
source · [−]pub struct Orthographic3<T: RealField> { /* private fields */ }Expand description
A 3D orthographic projection stored as a homogeneous 4x4 matrix.
Implementations
Creates a new orthographic projection matrix.
This follows the OpenGL convention, so this will flip the z axis.
Example
let proj = Orthographic3::new(1.0, 10.0, 2.0, 20.0, 0.1, 1000.0);
// Check this projection actually transforms the view cuboid into the double-unit cube.
// See https://www.nalgebra.org/projections/#orthographic-projection for more details.
let p1 = Point3::new(1.0, 2.0, -0.1);
let p2 = Point3::new(1.0, 2.0, -1000.0);
let p3 = Point3::new(1.0, 20.0, -0.1);
let p4 = Point3::new(1.0, 20.0, -1000.0);
let p5 = Point3::new(10.0, 2.0, -0.1);
let p6 = Point3::new(10.0, 2.0, -1000.0);
let p7 = Point3::new(10.0, 20.0, -0.1);
let p8 = Point3::new(10.0, 20.0, -1000.0);
assert_relative_eq!(proj.project_point(&p1), Point3::new(-1.0, -1.0, -1.0));
assert_relative_eq!(proj.project_point(&p2), Point3::new(-1.0, -1.0, 1.0));
assert_relative_eq!(proj.project_point(&p3), Point3::new(-1.0, 1.0, -1.0));
assert_relative_eq!(proj.project_point(&p4), Point3::new(-1.0, 1.0, 1.0));
assert_relative_eq!(proj.project_point(&p5), Point3::new( 1.0, -1.0, -1.0));
assert_relative_eq!(proj.project_point(&p6), Point3::new( 1.0, -1.0, 1.0));
assert_relative_eq!(proj.project_point(&p7), Point3::new( 1.0, 1.0, -1.0));
assert_relative_eq!(proj.project_point(&p8), Point3::new( 1.0, 1.0, 1.0));
// This also works with flipped axis. In other words, we allow that
// `left > right`, `bottom > top`, and/or `znear > zfar`.
let proj = Orthographic3::new(10.0, 1.0, 20.0, 2.0, 1000.0, 0.1);
assert_relative_eq!(proj.project_point(&p1), Point3::new( 1.0, 1.0, 1.0));
assert_relative_eq!(proj.project_point(&p2), Point3::new( 1.0, 1.0, -1.0));
assert_relative_eq!(proj.project_point(&p3), Point3::new( 1.0, -1.0, 1.0));
assert_relative_eq!(proj.project_point(&p4), Point3::new( 1.0, -1.0, -1.0));
assert_relative_eq!(proj.project_point(&p5), Point3::new(-1.0, 1.0, 1.0));
assert_relative_eq!(proj.project_point(&p6), Point3::new(-1.0, 1.0, -1.0));
assert_relative_eq!(proj.project_point(&p7), Point3::new(-1.0, -1.0, 1.0));
assert_relative_eq!(proj.project_point(&p8), Point3::new(-1.0, -1.0, -1.0));Wraps the given matrix to interpret it as a 3D orthographic matrix.
It is not checked whether or not the given matrix actually represents an orthographic projection.
Example
let mat = Matrix4::new(
2.0 / 9.0, 0.0, 0.0, -11.0 / 9.0,
0.0, 2.0 / 18.0, 0.0, -22.0 / 18.0,
0.0, 0.0, -2.0 / 999.9, -1000.1 / 999.9,
0.0, 0.0, 0.0, 1.0
);
let proj = Orthographic3::from_matrix_unchecked(mat);
assert_eq!(proj, Orthographic3::new(1.0, 10.0, 2.0, 20.0, 0.1, 1000.0));Creates a new orthographic projection matrix from an aspect ratio and the vertical field of view.
Retrieves the inverse of the underlying homogeneous matrix.
Example
let proj = Orthographic3::new(1.0, 10.0, 2.0, 20.0, 0.1, 1000.0);
let inv = proj.inverse();
assert_relative_eq!(inv * proj.as_matrix(), Matrix4::identity());
assert_relative_eq!(proj.as_matrix() * inv, Matrix4::identity());
let proj = Orthographic3::new(10.0, 1.0, 20.0, 2.0, 1000.0, 0.1);
let inv = proj.inverse();
assert_relative_eq!(inv * proj.as_matrix(), Matrix4::identity());
assert_relative_eq!(proj.as_matrix() * inv, Matrix4::identity());Computes the corresponding homogeneous matrix.
Example
let proj = Orthographic3::new(1.0, 10.0, 2.0, 20.0, 0.1, 1000.0);
let expected = Matrix4::new(
2.0 / 9.0, 0.0, 0.0, -11.0 / 9.0,
0.0, 2.0 / 18.0, 0.0, -22.0 / 18.0,
0.0, 0.0, -2.0 / 999.9, -1000.1 / 999.9,
0.0, 0.0, 0.0, 1.0
);
assert_eq!(proj.to_homogeneous(), expected);A reference to the underlying homogeneous transformation matrix.
Example
let proj = Orthographic3::new(1.0, 10.0, 2.0, 20.0, 0.1, 1000.0);
let expected = Matrix4::new(
2.0 / 9.0, 0.0, 0.0, -11.0 / 9.0,
0.0, 2.0 / 18.0, 0.0, -22.0 / 18.0,
0.0, 0.0, -2.0 / 999.9, -1000.1 / 999.9,
0.0, 0.0, 0.0, 1.0
);
assert_eq!(*proj.as_matrix(), expected);A reference to this transformation seen as a Projective3.
Example
let proj = Orthographic3::new(1.0, 10.0, 2.0, 20.0, 0.1, 1000.0);
assert_eq!(proj.as_projective().to_homogeneous(), proj.to_homogeneous());This transformation seen as a Projective3.
Example
let proj = Orthographic3::new(1.0, 10.0, 2.0, 20.0, 0.1, 1000.0);
assert_eq!(proj.to_projective().to_homogeneous(), proj.to_homogeneous());Retrieves the underlying homogeneous matrix.
Example
let proj = Orthographic3::new(1.0, 10.0, 2.0, 20.0, 0.1, 1000.0);
let expected = Matrix4::new(
2.0 / 9.0, 0.0, 0.0, -11.0 / 9.0,
0.0, 2.0 / 18.0, 0.0, -22.0 / 18.0,
0.0, 0.0, -2.0 / 999.9, -1000.1 / 999.9,
0.0, 0.0, 0.0, 1.0
);
assert_eq!(proj.into_inner(), expected);👎 Deprecated: use .into_inner() instead
use .into_inner() instead
Retrieves the underlying homogeneous matrix. Deprecated: Use Orthographic3::into_inner instead.
The left offset of the view cuboid.
let proj = Orthographic3::new(1.0, 10.0, 2.0, 20.0, 0.1, 1000.0);
assert_relative_eq!(proj.left(), 1.0, epsilon = 1.0e-6);
let proj = Orthographic3::new(10.0, 1.0, 20.0, 2.0, 1000.0, 0.1);
assert_relative_eq!(proj.left(), 10.0, epsilon = 1.0e-6);The right offset of the view cuboid.
let proj = Orthographic3::new(1.0, 10.0, 2.0, 20.0, 0.1, 1000.0);
assert_relative_eq!(proj.right(), 10.0, epsilon = 1.0e-6);
let proj = Orthographic3::new(10.0, 1.0, 20.0, 2.0, 1000.0, 0.1);
assert_relative_eq!(proj.right(), 1.0, epsilon = 1.0e-6);The bottom offset of the view cuboid.
let proj = Orthographic3::new(1.0, 10.0, 2.0, 20.0, 0.1, 1000.0);
assert_relative_eq!(proj.bottom(), 2.0, epsilon = 1.0e-6);
let proj = Orthographic3::new(10.0, 1.0, 20.0, 2.0, 1000.0, 0.1);
assert_relative_eq!(proj.bottom(), 20.0, epsilon = 1.0e-6);The top offset of the view cuboid.
let proj = Orthographic3::new(1.0, 10.0, 2.0, 20.0, 0.1, 1000.0);
assert_relative_eq!(proj.top(), 20.0, epsilon = 1.0e-6);
let proj = Orthographic3::new(10.0, 1.0, 20.0, 2.0, 1000.0, 0.1);
assert_relative_eq!(proj.top(), 2.0, epsilon = 1.0e-6);The near plane offset of the view cuboid.
let proj = Orthographic3::new(1.0, 10.0, 2.0, 20.0, 0.1, 1000.0);
assert_relative_eq!(proj.znear(), 0.1, epsilon = 1.0e-6);
let proj = Orthographic3::new(10.0, 1.0, 20.0, 2.0, 1000.0, 0.1);
assert_relative_eq!(proj.znear(), 1000.0, epsilon = 1.0e-6);The far plane offset of the view cuboid.
let proj = Orthographic3::new(1.0, 10.0, 2.0, 20.0, 0.1, 1000.0);
assert_relative_eq!(proj.zfar(), 1000.0, epsilon = 1.0e-6);
let proj = Orthographic3::new(10.0, 1.0, 20.0, 2.0, 1000.0, 0.1);
assert_relative_eq!(proj.zfar(), 0.1, epsilon = 1.0e-6);Projects a point. Faster than matrix multiplication.
Example
let proj = Orthographic3::new(1.0, 10.0, 2.0, 20.0, 0.1, 1000.0);
let p1 = Point3::new(1.0, 2.0, -0.1);
let p2 = Point3::new(1.0, 2.0, -1000.0);
let p3 = Point3::new(1.0, 20.0, -0.1);
let p4 = Point3::new(1.0, 20.0, -1000.0);
let p5 = Point3::new(10.0, 2.0, -0.1);
let p6 = Point3::new(10.0, 2.0, -1000.0);
let p7 = Point3::new(10.0, 20.0, -0.1);
let p8 = Point3::new(10.0, 20.0, -1000.0);
assert_relative_eq!(proj.project_point(&p1), Point3::new(-1.0, -1.0, -1.0));
assert_relative_eq!(proj.project_point(&p2), Point3::new(-1.0, -1.0, 1.0));
assert_relative_eq!(proj.project_point(&p3), Point3::new(-1.0, 1.0, -1.0));
assert_relative_eq!(proj.project_point(&p4), Point3::new(-1.0, 1.0, 1.0));
assert_relative_eq!(proj.project_point(&p5), Point3::new( 1.0, -1.0, -1.0));
assert_relative_eq!(proj.project_point(&p6), Point3::new( 1.0, -1.0, 1.0));
assert_relative_eq!(proj.project_point(&p7), Point3::new( 1.0, 1.0, -1.0));
assert_relative_eq!(proj.project_point(&p8), Point3::new( 1.0, 1.0, 1.0));Un-projects a point. Faster than multiplication by the underlying matrix inverse.
Example
let proj = Orthographic3::new(1.0, 10.0, 2.0, 20.0, 0.1, 1000.0);
let p1 = Point3::new(-1.0, -1.0, -1.0);
let p2 = Point3::new(-1.0, -1.0, 1.0);
let p3 = Point3::new(-1.0, 1.0, -1.0);
let p4 = Point3::new(-1.0, 1.0, 1.0);
let p5 = Point3::new( 1.0, -1.0, -1.0);
let p6 = Point3::new( 1.0, -1.0, 1.0);
let p7 = Point3::new( 1.0, 1.0, -1.0);
let p8 = Point3::new( 1.0, 1.0, 1.0);
assert_relative_eq!(proj.unproject_point(&p1), Point3::new(1.0, 2.0, -0.1), epsilon = 1.0e-6);
assert_relative_eq!(proj.unproject_point(&p2), Point3::new(1.0, 2.0, -1000.0), epsilon = 1.0e-6);
assert_relative_eq!(proj.unproject_point(&p3), Point3::new(1.0, 20.0, -0.1), epsilon = 1.0e-6);
assert_relative_eq!(proj.unproject_point(&p4), Point3::new(1.0, 20.0, -1000.0), epsilon = 1.0e-6);
assert_relative_eq!(proj.unproject_point(&p5), Point3::new(10.0, 2.0, -0.1), epsilon = 1.0e-6);
assert_relative_eq!(proj.unproject_point(&p6), Point3::new(10.0, 2.0, -1000.0), epsilon = 1.0e-6);
assert_relative_eq!(proj.unproject_point(&p7), Point3::new(10.0, 20.0, -0.1), epsilon = 1.0e-6);
assert_relative_eq!(proj.unproject_point(&p8), Point3::new(10.0, 20.0, -1000.0), epsilon = 1.0e-6);Projects a vector. Faster than matrix multiplication.
Vectors are not affected by the translation part of the projection.
Example
let proj = Orthographic3::new(1.0, 10.0, 2.0, 20.0, 0.1, 1000.0);
let v1 = Vector3::x();
let v2 = Vector3::y();
let v3 = Vector3::z();
assert_relative_eq!(proj.project_vector(&v1), Vector3::x() * 2.0 / 9.0);
assert_relative_eq!(proj.project_vector(&v2), Vector3::y() * 2.0 / 18.0);
assert_relative_eq!(proj.project_vector(&v3), Vector3::z() * -2.0 / 999.9);Sets the left offset of the view cuboid.
let mut proj = Orthographic3::new(1.0, 10.0, 2.0, 20.0, 0.1, 1000.0);
proj.set_left(2.0);
assert_relative_eq!(proj.left(), 2.0, epsilon = 1.0e-6);
// It is OK to set a left offset greater than the current right offset.
proj.set_left(20.0);
assert_relative_eq!(proj.left(), 20.0, epsilon = 1.0e-6);Sets the right offset of the view cuboid.
let mut proj = Orthographic3::new(1.0, 10.0, 2.0, 20.0, 0.1, 1000.0);
proj.set_right(15.0);
assert_relative_eq!(proj.right(), 15.0, epsilon = 1.0e-6);
// It is OK to set a right offset smaller than the current left offset.
proj.set_right(-3.0);
assert_relative_eq!(proj.right(), -3.0, epsilon = 1.0e-6);Sets the bottom offset of the view cuboid.
let mut proj = Orthographic3::new(1.0, 10.0, 2.0, 20.0, 0.1, 1000.0);
proj.set_bottom(8.0);
assert_relative_eq!(proj.bottom(), 8.0, epsilon = 1.0e-6);
// It is OK to set a bottom offset greater than the current top offset.
proj.set_bottom(50.0);
assert_relative_eq!(proj.bottom(), 50.0, epsilon = 1.0e-6);Sets the top offset of the view cuboid.
let mut proj = Orthographic3::new(1.0, 10.0, 2.0, 20.0, 0.1, 1000.0);
proj.set_top(15.0);
assert_relative_eq!(proj.top(), 15.0, epsilon = 1.0e-6);
// It is OK to set a top offset smaller than the current bottom offset.
proj.set_top(-3.0);
assert_relative_eq!(proj.top(), -3.0, epsilon = 1.0e-6);Sets the near plane offset of the view cuboid.
let mut proj = Orthographic3::new(1.0, 10.0, 2.0, 20.0, 0.1, 1000.0);
proj.set_znear(8.0);
assert_relative_eq!(proj.znear(), 8.0, epsilon = 1.0e-6);
// It is OK to set a znear greater than the current zfar.
proj.set_znear(5000.0);
assert_relative_eq!(proj.znear(), 5000.0, epsilon = 1.0e-6);Sets the far plane offset of the view cuboid.
let mut proj = Orthographic3::new(1.0, 10.0, 2.0, 20.0, 0.1, 1000.0);
proj.set_zfar(15.0);
assert_relative_eq!(proj.zfar(), 15.0, epsilon = 1.0e-6);
// It is OK to set a zfar smaller than the current znear.
proj.set_zfar(-3.0);
assert_relative_eq!(proj.zfar(), -3.0, epsilon = 1.0e-6);Sets the view cuboid offsets along the x axis.
let mut proj = Orthographic3::new(1.0, 10.0, 2.0, 20.0, 0.1, 1000.0);
proj.set_left_and_right(7.0, 70.0);
assert_relative_eq!(proj.left(), 7.0, epsilon = 1.0e-6);
assert_relative_eq!(proj.right(), 70.0, epsilon = 1.0e-6);
// It is also OK to have `left > right`.
proj.set_left_and_right(70.0, 7.0);
assert_relative_eq!(proj.left(), 70.0, epsilon = 1.0e-6);
assert_relative_eq!(proj.right(), 7.0, epsilon = 1.0e-6);Sets the view cuboid offsets along the y axis.
let mut proj = Orthographic3::new(1.0, 10.0, 2.0, 20.0, 0.1, 1000.0);
proj.set_bottom_and_top(7.0, 70.0);
assert_relative_eq!(proj.bottom(), 7.0, epsilon = 1.0e-6);
assert_relative_eq!(proj.top(), 70.0, epsilon = 1.0e-6);
// It is also OK to have `bottom > top`.
proj.set_bottom_and_top(70.0, 7.0);
assert_relative_eq!(proj.bottom(), 70.0, epsilon = 1.0e-6);
assert_relative_eq!(proj.top(), 7.0, epsilon = 1.0e-6);Sets the near and far plane offsets of the view cuboid.
let mut proj = Orthographic3::new(1.0, 10.0, 2.0, 20.0, 0.1, 1000.0);
proj.set_znear_and_zfar(50.0, 5000.0);
assert_relative_eq!(proj.znear(), 50.0, epsilon = 1.0e-6);
assert_relative_eq!(proj.zfar(), 5000.0, epsilon = 1.0e-6);
// It is also OK to have `znear > zfar`.
proj.set_znear_and_zfar(5000.0, 0.5);
assert_relative_eq!(proj.znear(), 5000.0, epsilon = 1.0e-6);
assert_relative_eq!(proj.zfar(), 0.5, epsilon = 1.0e-6);Trait Implementations
impl<T: RealField> Distribution<Orthographic3<T>> for Standard where
Standard: Distribution<T>,
impl<T: RealField> Distribution<Orthographic3<T>> for Standard where
Standard: Distribution<T>,
Generate an arbitrary random variate for testing purposes.
Create an iterator that generates random values of T, using rng as
the source of randomness. Read more
Performs the conversion.
Auto Trait Implementations
impl<T> RefUnwindSafe for Orthographic3<T> where
T: RefUnwindSafe,
impl<T> Send for Orthographic3<T>
impl<T> Sync for Orthographic3<T>
impl<T> Unpin for Orthographic3<T> where
T: Unpin,
impl<T> UnwindSafe for Orthographic3<T> where
T: UnwindSafe,
Blanket Implementations
Mutably borrows from an owned value. Read more
The inverse inclusion map: attempts to construct self from the equivalent element of its
superset. Read more
Checks if self is actually part of its subset T (and can be converted to it).
Use with care! Same as self.to_subset but without any property checks. Always succeeds.
The inclusion map: converts self to the equivalent element of its superset.