Skip to main content

Mat4

Struct Mat4 

#[repr(C)]
pub struct Mat4 { pub cols: [Vec4; 4], }
Expand description

A 4x4 column-major matrix, used for 3D affine transformations.

This is the primary type for representing transformations (translation, rotation, scale) in 3D space. It is also used for camera view and projection matrices. The memory layout is column-major, which is compatible with modern graphics APIs like Vulkan, Metal, and DirectX.

§Examples

use khora_core::math::{Mat4, Quaternion, Vec3};
use std::f32::consts::FRAC_PI_2;

// The identity matrix leaves a point unchanged.
assert_eq!(Mat4::IDENTITY.transform_point(Vec3::ONE), Vec3::ONE);

// Compose translation ∘ rotation ∘ scale by multiplying matrices
// (applied right-to-left).
let model = Mat4::from_translation(Vec3::new(0.0, 1.0, 0.0))
    * Mat4::from_quat(Quaternion::from_axis_angle(Vec3::Y, FRAC_PI_2))
    * Mat4::from_scale(Vec3::ONE * 2.0);
let moved = model.transform_point(Vec3::ZERO);
assert!((moved - Vec3::new(0.0, 1.0, 0.0)).length() < 1e-5);

// A perspective projection for a 16:9 viewport.
let proj = Mat4::perspective_rh_zo(FRAC_PI_2, 16.0 / 9.0, 0.1, 1000.0);
assert!(proj != Mat4::IDENTITY);

Fields§

§cols: [Vec4; 4]

The columns of the matrix. cols[0] is the first column, and so on.

Implementations§

§

impl Mat4

pub const IDENTITY: Mat4

The 4x4 identity matrix.

pub const ZERO: Mat4

A 4x4 matrix with all elements set to 0.

pub fn from_cols(c0: Vec4, c1: Vec4, c2: Vec4, c3: Vec4) -> Mat4

Creates a new matrix from four column vectors.

pub fn get_row(&self, index: usize) -> Vec4

Returns a row of the matrix as a Vec4.

pub const fn to_cols_array_2d(&self) -> [[f32; 4]; 4]

Returns the matrix as a 2D array of columns: [[x, y, z, w]; 4].

pub fn from_translation(v: Vec3) -> Mat4

Creates a translation matrix.

§Arguments
  • v: The translation vector to apply.

pub fn from_scale(scale: Vec3) -> Mat4

Creates a non-uniform scaling matrix.

pub fn from_rotation_x(angle: f32) -> Mat4

Creates a matrix for a rotation around the X-axis.

§Arguments
  • angle: The angle of rotation in radians.

pub fn from_rotation_y(angle: f32) -> Mat4

Creates a matrix for a right-handed rotation around the Y-axis.

§Arguments
  • angle: The angle of rotation in radians.

pub fn from_rotation_z(angle: f32) -> Mat4

Creates a matrix for a rotation around the Z-axis.

§Arguments
  • angle: The angle of rotation in radians.

pub fn from_axis_angle(axis: Vec3, angle: f32) -> Mat4

Creates a rotation matrix from a normalized axis and an angle.

§Arguments
  • axis: The axis of rotation. Must be a unit vector.
  • angle: The angle of rotation in radians.

pub fn from_quat(q: Quaternion) -> Mat4

Creates a rotation matrix from a quaternion.

pub fn perspective_rh_zo( fov_y_radians: f32, aspect_ratio: f32, z_near: f32, z_far: f32, ) -> Mat4

Creates a right-handed perspective projection matrix with a [0, 1] depth range (ZO).

§Arguments
  • fov_y_radians: Vertical field of view in radians.
  • aspect_ratio: Width divided by height of the viewport.
  • z_near: Distance to the near clipping plane (must be positive).
  • z_far: Distance to the far clipping plane (must be positive and > z_near).

pub fn orthographic_rh_zo( left: f32, right: f32, bottom: f32, top: f32, z_near: f32, z_far: f32, ) -> Mat4

Creates a right-handed orthographic projection matrix with a [0, 1] depth range (ZO).

pub fn look_at_rh(eye: Vec3, target: Vec3, up: Vec3) -> Option<Mat4>

Creates a right-handed view matrix for a camera looking from eye towards target.

§Arguments
  • eye: The position of the camera in world space.
  • target: The point in world space that the camera is looking at.
  • up: A vector indicating the “up” direction of the world (commonly Vec3::Y).
§Returns

Returns Some(Mat4) if a valid view matrix can be constructed, or None if eye and target are too close, or if up is parallel to the view direction.

pub fn cube_face_view_proj(position: Vec3, face: CubeFace, far: f32) -> Mat4

View-projection matrix for one face of an omnidirectional cubemap rendered from position.

Builds a 90°-FOV perspective with [NEAR, far] depth range, then a look-at matrix using CubeFace::forward and CubeFace::up in the wgpu cubemap convention. The near plane is fixed at 0.1 — the matching shader-side depth recompute (used in omnidirectional shadow sampling) assumes the same constant.

far should be the light’s effective range in world units.

pub fn cube_face_view_projs(position: Vec3, far: f32) -> [Mat4; 6]

Six view-projection matrices, one per cube face, in CubeFace::ALL order ([+X, -X, +Y, -Y, +Z, -Z]).

Equivalent to:

CubeFace::ALL.map(|f| Mat4::cube_face_view_proj(position, f, far))

pub fn transpose(&self) -> Mat4

Returns the transpose of the matrix, where rows and columns are swapped.

pub fn determinant(&self) -> f32

Computes the determinant of the matrix.

pub fn inverse(&self) -> Option<Mat4>

Computes the inverse of the matrix. Returns None if the matrix is not invertible.

pub fn affine_inverse(&self) -> Option<Mat4>

Computes the inverse of an affine transformation matrix more efficiently and with better numerical stability than the general inverse method.

An affine matrix is one composed of only translation, rotation, and scale.

§Returns

None if the matrix is not affine or is not invertible.

pub fn transform_point(&self, p: Vec3) -> Vec3

Transforms a 3D point by this matrix (treating it as a homogeneous point with w=1).

This applies the full affine transformation including translation, rotation, and scale.

pub fn transform_vector(&self, v: Vec3) -> Vec3

Transforms a 3D direction vector by this matrix (treating it as w=0).

This applies rotation and scale but not translation. Use this for normals, axes, and other direction vectors.

Trait Implementations§

§

impl<'__de, __Context> BorrowDecode<'__de, __Context> for Mat4

§

fn borrow_decode<__D>(decoder: &mut __D) -> Result<Mat4, DecodeError>
where __D: BorrowDecoder<'__de, Context = __Context>,

Attempt to decode this type with the given BorrowDecode.
§

impl Clone for Mat4

§

fn clone(&self) -> Mat4

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
§

impl Debug for Mat4

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
§

impl<__Context> Decode<__Context> for Mat4

§

fn decode<__D>(decoder: &mut __D) -> Result<Mat4, DecodeError>
where __D: Decoder<Context = __Context>,

Attempt to decode this type with the given Decode.
§

impl Default for Mat4

§

fn default() -> Mat4

Returns the 4x4 identity matrix.

§

impl<'de> Deserialize<'de> for Mat4

§

fn deserialize<__D>( __deserializer: __D, ) -> Result<Mat4, <__D as Deserializer<'de>>::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
§

impl Encode for Mat4

§

fn encode<__E>(&self, encoder: &mut __E) -> Result<(), EncodeError>
where __E: Encoder,

Encode a given type.
§

impl From<AffineTransform> for Mat4

§

fn from(transform: AffineTransform) -> Mat4

Converts the AffineTransform into its inner Mat4.

§

impl From<Mat4> for AffineTransform

§

fn from(val: Mat4) -> AffineTransform

Converts a Mat4 into an AffineTransform.

§Panics

Panics if the matrix is not a valid affine transformation.

§

impl Mul<Vec4> for Mat4

§

fn mul(self, rhs: Vec4) -> <Mat4 as Mul<Vec4>>::Output

Transforms a Vec4 by this matrix.

§

type Output = Vec4

The resulting type after applying the * operator.
§

impl Mul for Mat4

§

fn mul(self, rhs: Mat4) -> <Mat4 as Mul>::Output

Multiplies this matrix by another Mat4. Note that matrix multiplication is not commutative.

§

type Output = Mat4

The resulting type after applying the * operator.
§

impl PartialEq for Mat4

§

fn eq(&self, other: &Mat4) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
§

impl Serialize for Mat4

§

fn serialize<__S>( &self, __serializer: __S, ) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more
§

impl Zeroable for Mat4

§

fn zeroed() -> Self

§

impl Copy for Mat4

§

impl Pod for Mat4

§

impl StructuralPartialEq for Mat4

Auto Trait Implementations§

§

impl Freeze for Mat4

§

impl RefUnwindSafe for Mat4

§

impl Send for Mat4

§

impl Sync for Mat4

§

impl Unpin for Mat4

§

impl UnsafeUnpin for Mat4

§

impl UnwindSafe for Mat4

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> AppLifecycle for T
where T: ?Sized,

§

fn on_start(&mut self, ctx: &mut dyn AppContext)

Called once after the backend is up but before the first update. Apps install their theme / fonts here.
§

fn on_exit(&mut self)

Called once when the window is closing. Persist state here.
§

impl<T> AsAny for T
where T: Any,

§

fn as_any(&self) -> &(dyn Any + 'static)

Returns a reference to the inner value as &dyn Any.
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CheckedBitPattern for T
where T: AnyBitPattern,

§

type Bits = T

Self must have the same layout as the specified Bits except for the possible invalid bit patterns being checked during is_valid_bit_pattern.
§

fn is_valid_bit_pattern(_bits: &T) -> bool

If this function returns true, then it must be valid to reinterpret bits as &Self.
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> Downcast<T> for T

§

fn downcast(&self) -> &T

§

impl<T> Downcast for T
where T: Any,

§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert 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.
§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
§

impl<T> Downcast for T
where T: Any,

§

fn into_any(self: Box<T>) -> Box<dyn Any>

Converts Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.
§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Converts Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
§

fn as_any(&self) -> &(dyn Any + 'static)

Converts &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Converts &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
§

impl<T> DowncastSend for T
where T: Any + Send,

§

fn into_any_send(self: Box<T>) -> Box<dyn Any + Send>

Converts Box<Trait> (where Trait: DowncastSend) to Box<dyn Any + Send>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

§

fn into_any_sync(self: Box<T>) -> Box<dyn Any + Send + Sync>

Converts Box<Trait> (where Trait: DowncastSync) to Box<dyn Any + Send + Sync>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Converts Arc<Trait> (where Trait: DowncastSync) to Arc<Any>, which can then be downcast into Arc<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<S> FromSample<S> for S

§

fn from_sample_(s: S) -> S

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

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

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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
§

impl<F, T> IntoSample<T> for F
where T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> Pointable for T

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<R, P> ReadPrimitive<R> for P
where R: Read + ReadEndian<P>, P: Default,

Source§

fn read_from_little_endian(read: &mut R) -> Result<Self, Error>

Read this value from the supplied reader. Same as ReadEndian::read_from_little_endian().
Source§

fn read_from_big_endian(read: &mut R) -> Result<Self, Error>

Read this value from the supplied reader. Same as ReadEndian::read_from_big_endian().
Source§

fn read_from_native_endian(read: &mut R) -> Result<Self, Error>

Read this value from the supplied reader. Same as ReadEndian::read_from_native_endian().
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T, S> SimdFrom<T, S> for T
where S: Simd,

§

fn simd_from(value: T, _simd: S) -> T

§

impl<F, T, S> SimdInto<T, S> for F
where T: SimdFrom<F, S>, S: Simd,

§

fn simd_into(self, simd: S) -> T

§

impl<SS, SP> SupersetOf<SS> for SP
where SS: SubsetOf<SP>,

§

fn to_subset(&self) -> Option<SS>

The inverse inclusion map: attempts to construct self from the equivalent element of its superset. Read more
§

fn is_in_subset(&self) -> bool

Checks if self is actually part of its subset T (and can be converted to it).
§

fn to_subset_unchecked(&self) -> SS

Use with care! Same as self.to_subset but without any property checks. Always succeeds.
§

fn from_subset(element: &SS) -> SP

The inclusion map: converts self to the equivalent element of its superset.
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
§

impl<T, U> ToSample<U> for T
where U: FromSample<T>,

§

fn to_sample_(self) -> U

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> Upcast<T> for T

§

fn upcast(&self) -> Option<&T>

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

impl<T> AnyBitPattern for T
where T: Pod,

§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,

§

impl<S, T> Duplex<S> for T
where T: FromSample<S> + ToSample<S>,

§

impl<T> NoUninit for T
where T: Pod,

§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Scalar for T
where T: 'static + Clone + PartialEq + Debug,

§

impl<T> SerializableAny for T
where T: 'static + Any + Clone + for<'a> Send + Sync,

§

impl<T> WasmNotSend for T
where T: Send,

§

impl<T> WasmNotSendSync for T
where T: WasmNotSend + WasmNotSync,

§

impl<T> WasmNotSync for T
where T: Sync,