```
#[repr(C)]pub struct Mat4 {
pub x_axis: Vec4,
pub y_axis: Vec4,
pub z_axis: Vec4,
pub w_axis: Vec4,
}
```

## Expand description

A 4x4 column major matrix.

This 4x4 matrix type features convenience methods for creating and using affine transforms and
perspective projections. If you are primarily dealing with 3D affine transformations
considering using `Affine3A`

which is faster than a 4x4 matrix
for some affine operations.

Affine transformations including 3D translation, rotation and scale can be created
using methods such as `Self::from_translation()`

, `Self::from_quat()`

,
`Self::from_scale()`

and `Self::from_scale_rotation_translation()`

.

Orthographic projections can be created using the methods `Self::orthographic_lh()`

for
left-handed coordinate systems and `Self::orthographic_rh()`

for right-handed
systems. The resulting matrix is also an affine transformation.

The `Self::transform_point3()`

and `Self::transform_vector3()`

convenience methods
are provided for performing affine transformations on 3D vectors and points. These
multiply 3D inputs as 4D vectors with an implicit `w`

value of `1`

for points and `0`

for vectors respectively. These methods assume that `Self`

contains a valid affine
transform.

Perspective projections can be created using methods such as
`Self::perspective_lh()`

, `Self::perspective_infinite_lh()`

and
`Self::perspective_infinite_reverse_lh()`

for left-handed co-ordinate systems and
`Self::perspective_rh()`

, `Self::perspective_infinite_rh()`

and
`Self::perspective_infinite_reverse_rh()`

for right-handed co-ordinate systems.

The resulting perspective project can be use to transform 3D vectors as points with
perspective correction using the `Self::project_point3()`

convenience method.

## Fields§

§`x_axis: Vec4`

§`y_axis: Vec4`

§`z_axis: Vec4`

§`w_axis: Vec4`

## Implementations§

source§### impl Mat4

### impl Mat4

source#### pub const IDENTITY: Self = _

#### pub const IDENTITY: Self = _

A 4x4 identity matrix, where all diagonal elements are `1`

, and all off-diagonal elements are `0`

.

source#### pub const fn from_cols(
x_axis: Vec4,
y_axis: Vec4,
z_axis: Vec4,
w_axis: Vec4
) -> Self

#### pub const fn from_cols( x_axis: Vec4, y_axis: Vec4, z_axis: Vec4, w_axis: Vec4 ) -> Self

Creates a 4x4 matrix from four column vectors.

source#### pub const fn from_cols_array(m: &[f32; 16]) -> Self

#### pub const fn from_cols_array(m: &[f32; 16]) -> Self

Creates a 4x4 matrix from a `[f32; 16]`

array stored in column major order.
If your data is stored in row major you will need to `transpose`

the returned
matrix.

source#### pub const fn to_cols_array(&self) -> [f32; 16]

#### pub const fn to_cols_array(&self) -> [f32; 16]

Creates a `[f32; 16]`

array storing data in column major order.
If you require data in row major order `transpose`

the matrix first.

source#### pub const fn from_cols_array_2d(m: &[[f32; 4]; 4]) -> Self

#### pub const fn from_cols_array_2d(m: &[[f32; 4]; 4]) -> Self

Creates a 4x4 matrix from a `[[f32; 4]; 4]`

4D array stored in column major order.
If your data is in row major order you will need to `transpose`

the returned
matrix.

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

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

Creates a `[[f32; 4]; 4]`

4D array storing data in column major order.
If you require data in row major order `transpose`

the matrix first.

source#### pub const fn from_diagonal(diagonal: Vec4) -> Self

#### pub const fn from_diagonal(diagonal: Vec4) -> Self

Creates a 4x4 matrix with its diagonal set to `diagonal`

and all other entries set to 0.

source#### pub fn from_scale_rotation_translation(
scale: Vec3,
rotation: Quat,
translation: Vec3
) -> Self

#### pub fn from_scale_rotation_translation( scale: Vec3, rotation: Quat, translation: Vec3 ) -> Self

Creates an affine transformation matrix from the given 3D `scale`

, `rotation`

and
`translation`

.

The resulting matrix can be used to transform 3D points and vectors. See
`Self::transform_point3()`

and `Self::transform_vector3()`

.

##### Panics

Will panic if `rotation`

is not normalized when `glam_assert`

is enabled.

source#### pub fn from_rotation_translation(rotation: Quat, translation: Vec3) -> Self

#### pub fn from_rotation_translation(rotation: Quat, translation: Vec3) -> Self

Creates an affine transformation matrix from the given 3D `translation`

.

The resulting matrix can be used to transform 3D points and vectors. See
`Self::transform_point3()`

and `Self::transform_vector3()`

.

##### Panics

Will panic if `rotation`

is not normalized when `glam_assert`

is enabled.

source#### pub fn to_scale_rotation_translation(&self) -> (Vec3, Quat, Vec3)

#### pub fn to_scale_rotation_translation(&self) -> (Vec3, Quat, Vec3)

Extracts `scale`

, `rotation`

and `translation`

from `self`

. The input matrix is
expected to be a 3D affine transformation matrix otherwise the output will be invalid.

##### Panics

Will panic if the determinant of `self`

is zero or if the resulting scale vector
contains any zero elements when `glam_assert`

is enabled.

source#### pub fn from_quat(rotation: Quat) -> Self

#### pub fn from_quat(rotation: Quat) -> Self

Creates an affine transformation matrix from the given `rotation`

quaternion.

The resulting matrix can be used to transform 3D points and vectors. See
`Self::transform_point3()`

and `Self::transform_vector3()`

.

##### Panics

Will panic if `rotation`

is not normalized when `glam_assert`

is enabled.

source#### pub fn from_mat3(m: Mat3) -> Self

#### pub fn from_mat3(m: Mat3) -> Self

Creates an affine transformation matrix from the given 3x3 linear transformation matrix.

`Self::transform_point3()`

and `Self::transform_vector3()`

.

source#### pub fn from_mat3a(m: Mat3A) -> Self

#### pub fn from_mat3a(m: Mat3A) -> Self

Creates an affine transformation matrix from the given 3x3 linear transformation matrix.

`Self::transform_point3()`

and `Self::transform_vector3()`

.

source#### pub fn from_translation(translation: Vec3) -> Self

#### pub fn from_translation(translation: Vec3) -> Self

Creates an affine transformation matrix from the given 3D `translation`

.

`Self::transform_point3()`

and `Self::transform_vector3()`

.

source#### pub fn from_axis_angle(axis: Vec3, angle: f32) -> Self

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

Creates an affine transformation matrix containing a 3D rotation around a normalized
rotation `axis`

of `angle`

(in radians).

`Self::transform_point3()`

and `Self::transform_vector3()`

.

##### Panics

Will panic if `axis`

is not normalized when `glam_assert`

is enabled.

source#### pub fn from_euler(order: EulerRot, a: f32, b: f32, c: f32) -> Self

#### pub fn from_euler(order: EulerRot, a: f32, b: f32, c: f32) -> Self

Creates a affine transformation matrix containing a rotation from the given euler rotation sequence and angles (in radians).

`Self::transform_point3()`

and `Self::transform_vector3()`

.

source#### pub fn to_euler(&self, order: EulerRot) -> (f32, f32, f32)

#### pub fn to_euler(&self, order: EulerRot) -> (f32, f32, f32)

Extract Euler angles with the given Euler rotation order.

Note if the upper 3x3 matrix contain scales, shears, or other non-rotation transformations then the resulting Euler angles will be ill-defined.

##### Panics

Will panic if any column of the upper 3x3 rotation matrix is not normalized when
`glam_assert`

is enabled.

source#### pub fn from_rotation_x(angle: f32) -> Self

#### pub fn from_rotation_x(angle: f32) -> Self

Creates an affine transformation matrix containing a 3D rotation around the x axis of
`angle`

(in radians).

`Self::transform_point3()`

and `Self::transform_vector3()`

.

source#### pub fn from_rotation_y(angle: f32) -> Self

#### pub fn from_rotation_y(angle: f32) -> Self

Creates an affine transformation matrix containing a 3D rotation around the y axis of
`angle`

(in radians).

`Self::transform_point3()`

and `Self::transform_vector3()`

.

source#### pub fn from_rotation_z(angle: f32) -> Self

#### pub fn from_rotation_z(angle: f32) -> Self

Creates an affine transformation matrix containing a 3D rotation around the z axis of
`angle`

(in radians).

`Self::transform_point3()`

and `Self::transform_vector3()`

.

source#### pub fn from_scale(scale: Vec3) -> Self

#### pub fn from_scale(scale: Vec3) -> Self

Creates an affine transformation matrix containing the given 3D non-uniform `scale`

.

`Self::transform_point3()`

and `Self::transform_vector3()`

.

##### Panics

Will panic if all elements of `scale`

are zero when `glam_assert`

is enabled.

source#### pub const fn from_cols_slice(slice: &[f32]) -> Self

#### pub const fn from_cols_slice(slice: &[f32]) -> Self

Creates a 4x4 matrix from the first 16 values in `slice`

.

##### Panics

Panics if `slice`

is less than 16 elements long.

source#### pub fn write_cols_to_slice(self, slice: &mut [f32])

#### pub fn write_cols_to_slice(self, slice: &mut [f32])

Writes the columns of `self`

to the first 16 elements in `slice`

.

##### Panics

Panics if `slice`

is less than 16 elements long.

source#### pub fn col_mut(&mut self, index: usize) -> &mut Vec4

#### pub fn col_mut(&mut self, index: usize) -> &mut Vec4

Returns a mutable reference to the matrix column for the given `index`

.

##### Panics

Panics if `index`

is greater than 3.

source#### pub fn is_finite(&self) -> bool

#### pub fn is_finite(&self) -> bool

Returns `true`

if, and only if, all elements are finite.
If any element is either `NaN`

, positive or negative infinity, this will return `false`

.

source#### pub fn determinant(&self) -> f32

#### pub fn determinant(&self) -> f32

Returns the determinant of `self`

.

source#### pub fn inverse(&self) -> Self

#### pub fn inverse(&self) -> Self

Returns the inverse of `self`

.

If the matrix is not invertible the returned matrix will be invalid.

##### Panics

Will panic if the determinant of `self`

is zero when `glam_assert`

is enabled.

source#### pub fn look_to_lh(eye: Vec3, dir: Vec3, up: Vec3) -> Self

#### pub fn look_to_lh(eye: Vec3, dir: Vec3, up: Vec3) -> Self

Creates a left-handed view matrix using a camera position, an up direction, and a facing direction.

For a view coordinate system with `+X=right`

, `+Y=up`

and `+Z=forward`

.

source#### pub fn look_to_rh(eye: Vec3, dir: Vec3, up: Vec3) -> Self

#### pub fn look_to_rh(eye: Vec3, dir: Vec3, up: Vec3) -> Self

Creates a right-handed view matrix using a camera position, an up direction, and a facing direction.

For a view coordinate system with `+X=right`

, `+Y=up`

and `+Z=back`

.

source#### pub fn look_at_lh(eye: Vec3, center: Vec3, up: Vec3) -> Self

#### pub fn look_at_lh(eye: Vec3, center: Vec3, up: Vec3) -> Self

Creates a left-handed view matrix using a camera position, an up direction, and a focal
point.
For a view coordinate system with `+X=right`

, `+Y=up`

and `+Z=forward`

.

##### Panics

Will panic if `up`

is not normalized when `glam_assert`

is enabled.

source#### pub fn look_at_rh(eye: Vec3, center: Vec3, up: Vec3) -> Self

#### pub fn look_at_rh(eye: Vec3, center: Vec3, up: Vec3) -> Self

Creates a right-handed view matrix using a camera position, an up direction, and a focal
point.
For a view coordinate system with `+X=right`

, `+Y=up`

and `+Z=back`

.

##### Panics

Will panic if `up`

is not normalized when `glam_assert`

is enabled.

source#### pub fn perspective_rh_gl(
fov_y_radians: f32,
aspect_ratio: f32,
z_near: f32,
z_far: f32
) -> Self

#### pub fn perspective_rh_gl( fov_y_radians: f32, aspect_ratio: f32, z_near: f32, z_far: f32 ) -> Self

Creates a right-handed perspective projection matrix with [-1,1] depth range.
This is the same as the OpenGL `gluPerspective`

function.
See https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluPerspective.xml

source#### pub fn perspective_lh(
fov_y_radians: f32,
aspect_ratio: f32,
z_near: f32,
z_far: f32
) -> Self

#### pub fn perspective_lh( fov_y_radians: f32, aspect_ratio: f32, z_near: f32, z_far: f32 ) -> Self

Creates a left-handed perspective projection matrix with `[0,1]`

depth range.

##### Panics

Will panic if `z_near`

or `z_far`

are less than or equal to zero when `glam_assert`

is
enabled.

source#### pub fn perspective_rh(
fov_y_radians: f32,
aspect_ratio: f32,
z_near: f32,
z_far: f32
) -> Self

#### pub fn perspective_rh( fov_y_radians: f32, aspect_ratio: f32, z_near: f32, z_far: f32 ) -> Self

Creates a right-handed perspective projection matrix with `[0,1]`

depth range.

##### Panics

Will panic if `z_near`

or `z_far`

are less than or equal to zero when `glam_assert`

is
enabled.

source#### pub fn perspective_infinite_lh(
fov_y_radians: f32,
aspect_ratio: f32,
z_near: f32
) -> Self

#### pub fn perspective_infinite_lh( fov_y_radians: f32, aspect_ratio: f32, z_near: f32 ) -> Self

Creates an infinite left-handed perspective projection matrix with `[0,1]`

depth range.

##### Panics

Will panic if `z_near`

is less than or equal to zero when `glam_assert`

is enabled.

source#### pub fn perspective_infinite_reverse_lh(
fov_y_radians: f32,
aspect_ratio: f32,
z_near: f32
) -> Self

#### pub fn perspective_infinite_reverse_lh( fov_y_radians: f32, aspect_ratio: f32, z_near: f32 ) -> Self

Creates an infinite left-handed perspective projection matrix with `[0,1]`

depth range.

##### Panics

Will panic if `z_near`

is less than or equal to zero when `glam_assert`

is enabled.

source#### pub fn perspective_infinite_rh(
fov_y_radians: f32,
aspect_ratio: f32,
z_near: f32
) -> Self

#### pub fn perspective_infinite_rh( fov_y_radians: f32, aspect_ratio: f32, z_near: f32 ) -> Self

Creates an infinite right-handed perspective projection matrix with
`[0,1]`

depth range.

source#### pub fn perspective_infinite_reverse_rh(
fov_y_radians: f32,
aspect_ratio: f32,
z_near: f32
) -> Self

#### pub fn perspective_infinite_reverse_rh( fov_y_radians: f32, aspect_ratio: f32, z_near: f32 ) -> Self

Creates an infinite reverse right-handed perspective projection matrix
with `[0,1]`

depth range.

source#### pub fn orthographic_rh_gl(
left: f32,
right: f32,
bottom: f32,
top: f32,
near: f32,
far: f32
) -> Self

#### pub fn orthographic_rh_gl( left: f32, right: f32, bottom: f32, top: f32, near: f32, far: f32 ) -> Self

Creates a right-handed orthographic projection matrix with `[-1,1]`

depth
range. This is the same as the OpenGL `glOrtho`

function in OpenGL.
See
https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glOrtho.xml

source#### pub fn orthographic_lh(
left: f32,
right: f32,
bottom: f32,
top: f32,
near: f32,
far: f32
) -> Self

#### pub fn orthographic_lh( left: f32, right: f32, bottom: f32, top: f32, near: f32, far: f32 ) -> Self

Creates a left-handed orthographic projection matrix with `[0,1]`

depth range.

source#### pub fn orthographic_rh(
left: f32,
right: f32,
bottom: f32,
top: f32,
near: f32,
far: f32
) -> Self

#### pub fn orthographic_rh( left: f32, right: f32, bottom: f32, top: f32, near: f32, far: f32 ) -> Self

Creates a right-handed orthographic projection matrix with `[0,1]`

depth range.

source#### pub fn project_point3(&self, rhs: Vec3) -> Vec3

#### pub fn project_point3(&self, rhs: Vec3) -> Vec3

Transforms the given 3D vector as a point, applying perspective correction.

This is the equivalent of multiplying the 3D vector as a 4D vector where `w`

is `1.0`

.
The perspective divide is performed meaning the resulting 3D vector is divided by `w`

.

This method assumes that `self`

contains a projective transform.

source#### pub fn transform_point3(&self, rhs: Vec3) -> Vec3

#### pub fn transform_point3(&self, rhs: Vec3) -> Vec3

Transforms the given 3D vector as a point.

This is the equivalent of multiplying the 3D vector as a 4D vector where `w`

is
`1.0`

.

This method assumes that `self`

contains a valid affine transform. It does not perform
a perspective divide, if `self`

contains a perspective transform, or if you are unsure,
the `Self::project_point3()`

method should be used instead.

##### Panics

Will panic if the 3rd row of `self`

is not `(0, 0, 0, 1)`

when `glam_assert`

is enabled.

source#### pub fn transform_vector3(&self, rhs: Vec3) -> Vec3

#### pub fn transform_vector3(&self, rhs: Vec3) -> Vec3

Transforms the give 3D vector as a direction.

This is the equivalent of multiplying the 3D vector as a 4D vector where `w`

is
`0.0`

.

This method assumes that `self`

contains a valid affine transform.

##### Panics

Will panic if the 3rd row of `self`

is not `(0, 0, 0, 1)`

when `glam_assert`

is enabled.

source#### pub fn transform_point3a(&self, rhs: Vec3A) -> Vec3A

#### pub fn transform_point3a(&self, rhs: Vec3A) -> Vec3A

source#### pub fn transform_vector3a(&self, rhs: Vec3A) -> Vec3A

#### pub fn transform_vector3a(&self, rhs: Vec3A) -> Vec3A

source#### pub fn mul_scalar(&self, rhs: f32) -> Self

#### pub fn mul_scalar(&self, rhs: f32) -> Self

Multiplies a 4x4 matrix by a scalar.

source#### pub fn div_scalar(&self, rhs: f32) -> Self

#### pub fn div_scalar(&self, rhs: f32) -> Self

Divides a 4x4 matrix by a scalar.

source#### pub fn abs_diff_eq(&self, rhs: Self, max_abs_diff: f32) -> bool

#### pub fn abs_diff_eq(&self, rhs: Self, max_abs_diff: f32) -> bool

Returns true if the absolute difference of all elements between `self`

and `rhs`

is less than or equal to `max_abs_diff`

.

This can be used to compare if two matrices contain similar elements. It works best
when comparing with a known value. The `max_abs_diff`

that should be used used
depends on the values being compared against.

For more see comparing floating point numbers.

#### pub fn as_dmat4(&self) -> DMat4

## Trait Implementations§

source§### impl AddAssign<Mat4> for Mat4

### impl AddAssign<Mat4> for Mat4

source§#### fn add_assign(&mut self, rhs: Self)

#### fn add_assign(&mut self, rhs: Self)

`+=`

operation. Read moresource§### impl DivAssign<f32> for Mat4

### impl DivAssign<f32> for Mat4

source§#### fn div_assign(&mut self, rhs: f32)

#### fn div_assign(&mut self, rhs: f32)

`/=`

operation. Read moresource§### impl MulAssign<Mat4> for Mat4

### impl MulAssign<Mat4> for Mat4

source§#### fn mul_assign(&mut self, rhs: Self)

#### fn mul_assign(&mut self, rhs: Self)

`*=`

operation. Read moresource§### impl MulAssign<f32> for Mat4

### impl MulAssign<f32> for Mat4

source§#### fn mul_assign(&mut self, rhs: f32)

#### fn mul_assign(&mut self, rhs: f32)

`*=`

operation. Read moresource§### impl SubAssign<Mat4> for Mat4

### impl SubAssign<Mat4> for Mat4

source§#### fn sub_assign(&mut self, rhs: Self)

#### fn sub_assign(&mut self, rhs: Self)

`-=`

operation. Read more