```
#[repr(C)]pub struct Mat3 {
pub x_axis: Vec3,
pub y_axis: Vec3,
pub z_axis: Vec3,
}
```

## Expand description

A 3x3 column major matrix.

This 3x3 matrix type features convenience methods for creating and using linear and
affine transformations. If you are primarily dealing with 2D affine transformations the
`Affine2`

type is much faster and more space efficient than
using a 3x3 matrix.

Linear transformations including 3D rotation and scale can be created using methods
such as `Self::from_diagonal()`

, `Self::from_quat()`

, `Self::from_axis_angle()`

,
`Self::from_rotation_x()`

, `Self::from_rotation_y()`

, or
`Self::from_rotation_z()`

.

The resulting matrices can be use to transform 3D vectors using regular vector multiplication.

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

, `Self::from_angle()`

,
`Self::from_scale()`

and `Self::from_scale_angle_translation()`

.

The `Self::transform_point2()`

and `Self::transform_vector2()`

convenience methods
are provided for performing affine transforms on 2D vectors and points. These multiply
2D inputs as 3D vectors with an implicit `z`

value of `1`

for points and `0`

for
vectors respectively. These methods assume that `Self`

contains a valid affine
transform.

## Fields§

§`x_axis: Vec3`

§`y_axis: Vec3`

§`z_axis: Vec3`

## Implementations§

source§### impl Mat3

### impl Mat3

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

#### pub const IDENTITY: Self = _

A 3x3 identity matrix, where all diagonal elements are `1`

, and all off-diagonal elements are `0`

.

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

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

Creates a 3x3 matrix from three column vectors.

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

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

Creates a 3x3 matrix from a `[f32; 9]`

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; 9]

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

Creates a `[f32; 9]`

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; 3]; 3]) -> Self

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

Creates a 3x3 matrix from a `[[f32; 3]; 3]`

3D 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; 3]; 3]

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

Creates a `[[f32; 3]; 3]`

3D 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: Vec3) -> Self

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

Creates a 3x3 matrix with its diagonal set to `diagonal`

and all other entries set to 0.

source#### pub fn from_mat4(m: Mat4) -> Self

#### pub fn from_mat4(m: Mat4) -> Self

Creates a 3x3 matrix from a 4x4 matrix, discarding the 4th row and column.

source#### pub fn from_mat4_minor(m: Mat4, i: usize, j: usize) -> Self

#### pub fn from_mat4_minor(m: Mat4, i: usize, j: usize) -> Self

Creates a 3x3 matrix from the minor of the given 4x4 matrix, discarding the `i`

th column
and `j`

th row.

##### Panics

Panics if `i`

or `j`

is greater than 3.

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

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

Creates a 3D rotation matrix from the given quaternion.

##### Panics

Will panic if `rotation`

is not normalized when `glam_assert`

is enabled.

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

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

Creates a 3D rotation matrix from a normalized rotation `axis`

and `angle`

(in
radians).

##### 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 3D rotation matrix from the given euler rotation sequence and the angles (in radians).

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 input matrix contains scales, shears, or other non-rotation transformations then the resulting Euler angles will be ill-defined.

##### Panics

Will panic if any input matrix column 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 a 3D rotation matrix from `angle`

(in radians) around the x axis.

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

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

Creates a 3D rotation matrix from `angle`

(in radians) around the y axis.

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

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

Creates a 3D rotation matrix from `angle`

(in radians) around the z axis.

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

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

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

.

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

and `Self::transform_vector2()`

.

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

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

Creates an affine transformation matrix from the given 2D rotation `angle`

(in
radians).

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

and `Self::transform_vector2()`

.

source#### pub fn from_scale_angle_translation(
scale: Vec2,
angle: f32,
translation: Vec2
) -> Self

#### pub fn from_scale_angle_translation( scale: Vec2, angle: f32, translation: Vec2 ) -> Self

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

, rotation `angle`

(in
radians) and `translation`

.

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

and `Self::transform_vector2()`

.

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

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

Creates an affine transformation matrix from the given non-uniform 2D `scale`

.

`Self::transform_point2()`

and `Self::transform_vector2()`

.

##### Panics

Will panic if all elements of `scale`

are zero when `glam_assert`

is enabled.

source#### pub fn from_mat2(m: Mat2) -> Self

#### pub fn from_mat2(m: Mat2) -> Self

Creates an affine transformation matrix from the given 2x2 matrix.

`Self::transform_point2()`

and `Self::transform_vector2()`

.

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

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

Creates a 3x3 matrix from the first 9 values in `slice`

.

##### Panics

Panics if `slice`

is less than 9 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 9 elements in `slice`

.

##### Panics

Panics if `slice`

is less than 9 elements long.

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

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

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

.

##### Panics

Panics if `index`

is greater than 2.

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 transform_point2(&self, rhs: Vec2) -> Vec2

#### pub fn transform_point2(&self, rhs: Vec2) -> Vec2

Transforms the given 2D vector as a point.

This is the equivalent of multiplying `rhs`

as a 3D vector where `z`

is `1`

.

This method assumes that `self`

contains a valid affine transform.

##### Panics

Will panic if the 2nd row of `self`

is not `(0, 0, 1)`

when `glam_assert`

is enabled.

source#### pub fn transform_vector2(&self, rhs: Vec2) -> Vec2

#### pub fn transform_vector2(&self, rhs: Vec2) -> Vec2

Rotates the given 2D vector.

This is the equivalent of multiplying `rhs`

as a 3D vector where `z`

is `0`

.

This method assumes that `self`

contains a valid affine transform.

##### Panics

Will panic if the 2nd row of `self`

is not `(0, 0, 1)`

when `glam_assert`

is enabled.

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

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

Multiplies a 3x3 matrix by a scalar.

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

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

Divides a 3x3 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_dmat3(&self) -> DMat3

## Trait Implementations§

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

### impl AddAssign<Mat3> for Mat3

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

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

`+=`

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

### impl DivAssign<f32> for Mat3

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

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

`/=`

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

### impl MulAssign<Mat3> for Mat3

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

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

`*=`

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

### impl MulAssign<f32> for Mat3

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

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

`*=`

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

### impl SubAssign<Mat3> for Mat3

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

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

`-=`

operation. Read more