#[repr(C)]
pub struct Orthographic3<T> { /* private fields */ }
Expand description

A 3D orthographic projection stored as a homogeneous 4x4 matrix.

Implementations

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.

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/docs/user_guide/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));

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

Retrieves the underlying homogeneous matrix. Deprecated: Use Orthographic3::into_inner instead.

The left offset of the view cuboid.

Example
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.

Example
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.

Example
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.

Example
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.

Example
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.

Example
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.

Example
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.

Example
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.

Example
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.

Example
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.

Example
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.

Example
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.

Example
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.

Example
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.

Example
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

Return an arbitrary value. Read more
Return an iterator of values that are smaller than itself. Read more
The archived representation of this type. Read more
The resolver for this type. It must contain all the additional information from serializing needed to make the archived type from the normal type. Read more
Creates the archived version of this value at the given position and writes it to the given output. Read more
The error that may result from checking the type.
Checks whether the given pointer points to a valid value within the given context. Read more
Returns a copy of the value. Read more
Performs copy-assignment from source. Read more
Formats the value using the given formatter. Read more
Deserialize this value from the given Serde deserializer. Read more
Deserializes using the given deserializer

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
Create a distribution of values of ‘S’ by mapping the output of Self through the closure F Read more
Converts to this type from the input type.
This method tests for self and other values to be equal, and is used by ==. Read more
This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason. Read more
Writes the dependencies for the object and returns a resolver that can create the archived type. Read more
Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more
The archived version of the pointer metadata for this type.
Converts some archived metadata to the pointer metadata for itself.
The archived counterpart of this type. Unlike Archive, it may be unsized. Read more
The resolver for the metadata of this type. Read more
Creates the archived version of the metadata for this value at the given position and writes it to the given output. Read more
Resolves a relative pointer to this value with the given from and to and writes it to the given output. Read more
Immutably borrows from an owned value. Read more
Mutably borrows from an owned value. Read more
Self must have the same layout as the specified Bits except for the possible invalid bit patterns being checked during is_valid_bit_pattern. Read more
If this function returns true, then it must be valid to reinterpret bits as &Self.
Deserializes using the given deserializer

Returns the argument unchanged.

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

The type for metadata in pointers and references to Self.
Should always be Self
Writes the object and returns the position of the archived type.
Serializes the metadata for the given type.
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.
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.
The resulting type after obtaining ownership.
Creates owned data from borrowed data, usually by cloning. Read more
Uses borrowed data to replace owned data, usually by cloning. Read more
The type returned in the event of a conversion error.
Performs the conversion.
The type returned in the event of a conversion error.
Performs the conversion.