mat3

Header: cglm/mat3.h

Table of contents (click to go):

Macros:

  1. GLM_MAT3_IDENTITY_INIT

  2. GLM_MAT3_ZERO_INIT

  3. GLM_MAT3_IDENTITY

  4. GLM_MAT3_ZERO

  5. glm_mat3_dup(mat, dest)

Functions:

  1. glm_mat3_make()

  2. glm_mat3_copy()

  3. glm_mat3_identity()

  4. glm_mat3_identity_array()

  5. glm_mat3_zero()

  6. glm_mat3_mul()

  7. glm_mat3_mulv()

  8. glm_mat3_transpose_to()

  9. glm_mat3_transpose()

  10. glm_mat3_scale()

  11. glm_mat3_inv()

  12. glm_mat3_swap_col()

  13. glm_mat3_swap_row()

  14. glm_mat3_quat()

  15. glm_mat3_textrans()

  16. glm_mat3_det()

  17. glm_mat3_trace()

  18. glm_mat3_rmc()

Represented

mat3x3

column 1

column 2

column 3

row 1

m00

m10

m20

row 2

m01

m11

m21

row 3

m02

m12

m22

Functions documentation

void glm_mat3_make(const float *__restrict src, mat3 dest)

Create mat3 (dest) from pointer (src).

Note

@src must contain at least 9 elements.

Parameters:
[in] src pointer to an array of floats (left)
[out] dest destination (result, mat3)

Note

Mathematical explanation

float array (1x9) (src)

column 1

row 1

v0

row 2

v1

row 3

v2

row 4

v3

row 5

v4

row 6

v5

row 7

v6

row 8

v7

row 9

v8

mat3 (dest)

column 1

column 2

column 3

row 1

v0

v3

v6

row 2

v1

v4

v7

row 3

v2

v5

v8

Note

Example

float src[9] = {
    1.00, 5.00, 8.00,
    11.00, 42.00, 33.00,
    95.00, 59.00, 88.00,
};
mat3 dest = GLM_MAT3_ZERO_INIT;
glm_mat3_make(src, dest);
float array (1x9) (src)

column 1

row 1

1.00

row 2

5.00

row 3

8.00

row 4

11.00

row 5

42.00

row 6

33.00

row 7

95.00

row 8

59.00

row 9

88.00

mat3 (dest) Before

column 1

column 2

column 3

row 1

0.00

0.00

0.00

row 2

0.00

0.00

0.00

row 3

0.00

0.00

0.00

mat3 (dest) After

column 1

column 2

column 3

row 1

1.00

11.00

95.00

row 2

5.00

42.00

59.00

row 3

8.00

33.00

88.00

void glm_mat3_copy(mat3 mat, mat3 dest)

Copy mat3 (mat) to mat3 (dest).

Parameters:
[in] mat mat3 (left, src)
[out] dest destination (result, mat3)

Note

Mathematical explanation

mat3 (mat)

column 1

column 2

column 3

row 1

m00

m10

m20

row 2

m01

m11

m21

row 3

m02

m12

m22

mat3 (dest)

column 1

column 2

column 3

row 1

m00

m10

m20

row 2

m01

m11

m21

row 3

m02

m12

m22

Note

Example

mat3 mat = {
    {3.00,4.00,5.00},
    {7.00,8.00,9.00},
    {17.00,18.00,19.00},
};
mat3 dest = GLM_MAT2_ZERO_INIT;
glm_mat3_copy(mat, dest);
mat3 (mat)

column 1

column 2

column 3

row 1

3.00

4.00

5.00

row 2

7.00

8.00

9.00

row 3

17.00

18.00

19.00

mat3 (dest) Before

column 1

column 2

column 3

row 1

0.00

0.00

0.00

row 2

0.00

0.00

0.00

row 3

0.00

0.00

0.00

mat3 (dest) After

column 1

column 2

column 3

row 1

3.00

4.00

5.00

row 2

7.00

8.00

9.00

row 3

17.00

18.00

19.00

void glm_mat3_identity(mat3 m)
Copy a mat3 identity to mat3 (m), or makes mat3 (m) an identity.

The same thing may be achieved with either of bellow methods,
but it is more easy to do that with this func especially for members
e.g. glm_mat3_identity(aStruct->aMatrix);.
glm_mat3_copy(GLM_MAT3_IDENTITY, m);

// or
mat3 mat = GLM_MAT3_IDENTITY_INIT;
Parameters:
[in, out] m mat3 (src, dest)

Note

Mathematical explanation

mat3 (m)

column 1

column 2

column 3

row 1

m00

m10

m20

row 2

m01

m11

m21

row 3

m02

m12

m22

mat3 (m)

column 1

column 2

column 3

row 1

1.00

0.00

0.00

row 2

0.00

1.00

0.00

row 3

0.00

0.00

1.00

Note

Example

mat3 m = {
    {3.00,4.00,5.00},
    {7.00,8.00,9.00},
    {17.00,18.00,19.00},
};
glm_mat3_identity(m);
mat3 (m)

column 1

column 2

column 3

row 1

3.00

4.00

5.00

row 2

7.00

8.00

9.00

row 3

17.00

18.00

19.00

mat3 (m)

column 1

column 2

column 3

row 1

1.00

0.00

0.00

row 2

0.00

1.00

0.00

row 3

0.00

0.00

1.00

void glm_mat3_identity_array(mat3 *__restrict mats, size_t count)

Given an array of mat3’s (mats) make each matrix an identity matrix.

Parameters:
[in, out] mats Array of mat3’s (must be aligned (16/32) if alignment is not disabled)
[in] count Array size of mats or number of matrices

Note

Mathematical explanation

mat3 (mats[index])

column 1

column 2

column 3

row 1

m00

m10

m20

row 2

m01

m11

m21

row 3

m02

m12

m22

mat3 (mats[index])

column 1

column 2

column 3

row 1

1.00

0.00

0.00

row 2

0.00

1.00

0.00

row 3

0.00

0.00

1.00

Note

Example

size_t count = 3;
mat3 matrices[count] = {
    {{1.00,2.00,3.00},{10.00,11.00,12.00},{19.00,20.00,21.00}},
    {{4.00,5.00,6.00},{13.00,14.00,15.00},{22.00,23.00,24.00}},
    {{7.00,8.00,9.00},{16.00,17.00,18.00},{25.00,26.00,27.00}},
};
glm_mat3_identity_array(matrices, count);
mat3 (mats[0]) Before

column 1

column 2

column 3

row 1

1.00

10.00

19.00

row 2

2.00

11.00

20.00

row 3

3.00

12.00

21.00

mat3 (mats[0]) After

column 1

column 2

column 3

row 1

1.00

0.00

0.00

row 2

0.00

1.00

0.00

row 3

0.00

0.00

1.00

mat3 (mats[1]) Before

column 1

column 2

column 3

row 1

4.00

13.00

22.00

row 2

5.00

14.00

23.00

row 3

6.00

15.00

24.00

mat3 (mats[1]) After

column 1

column 2

column 3

row 1

1.00

0.00

0.00

row 2

0.00

1.00

0.00

row 3

0.00

0.00

1.00

mat3 (mats[2]) Before

column 1

column 2

column 3

row 1

7.00

16.00

25.00

row 2

8.00

17.00

26.00

row 3

9.00

18.00

27.00

mat3 (mats[2]) After

column 1

column 2

column 3

row 1

1.00

0.00

0.00

row 2

0.00

1.00

0.00

row 3

0.00

0.00

1.00

void glm_mat3_zero(mat3 m)

Zero out the mat3 (m).

Parameters:
[in, out] m mat3 (src, dest)

Note

Mathematical explanation

mat3 (m)

column 1

column 2

column 3

row 1

m00

m10

m20

row 2

m01

m11

m21

row 3

m02

m12

m22

mat3 (m)

column 1

column 2

column 3

row 1

0.00

0.00

0.00

row 2

0.00

0.00

0.00

row 3

0.00

0.00

0.00

Note

Example

mat3 m = {
    {19.00,5.00,7.00},
    {2.00,4.00,6.00},
    {12.00,24.00,54.00},
};
glm_mat3_zero(m);
mat3 (m) Before

column 1

column 2

column 3

row 1

19.00

2.00

12.00

row 2

5.00

4.00

24.00

row 3

7.00

6.00

54.00

mat3 (m) After

column 1

column 2

column 3

row 1

0.00

0.00

0.00

row 2

0.00

0.00

0.00

row 3

0.00

0.00

0.00

void glm_mat3_mul(mat3 m1, mat3 m2, mat3 dest)

Multiply mat3 (m1) by mat3 (m2) and store in mat3 (dest).

m1, m2 and dest matrices can be same matrix, it is possible to write this:

mat3 m = GLM_MAT3_IDENTITY_INIT;
glm_mat3_mul(m, m, m);
Parameters:
[in] m1 mat3 (left)
[in] m2 mat3 (right)
[out] dest destination (result, mat3)

Note

Mathematical explanation

mat3 (m1)

column 1

column 2

column 3

row 1

a00

a10

a20

row 2

a01

a11

a21

row 3

a02

a12

a22

mat3 (m2)

column 1

column 2

column 3

row 1

b00

b10

b20

row 2

b01

b11

b21

row 3

b02

b12

b22

mat3 (dest)

column 1

column 2

column 3

row 1

a00 * b00 + a10 * b01 + a20 * b02

a00 * b10 + a10 * b11 + a20 * b12

a00 * b20 + a10 * b21 + a20 * b22

row 2

a01 * b00 + a11 * b01 + a21 * b02

a01 * b10 + a11 * b11 + a21 * b12

a01 * b20 + a11 * b21 + a21 * b22

row 3

a02 * b00 + a12 * b01 + a22 * b02

a02 * b10 + a12 * b11 + a22 * b12

a02 * b20 + a12 * b21 + a22 * b22

Note

Example

mat3 m = {
    {19.00,5.00,6.00},
    {2.00,4.00,8.00},
    {1.00,3.00,7.00},
};
glm_mat3_mul(m, m, m);
mat3 (m1)

column 1

column 2

column 3

row 1

19.00

2.00

1.00

row 2

5.00

4.00

3.00

row 3

6.00

8.00

7.00

mat3 (m2)

column 1

column 2

column 3

row 1

19.00

2.00

1.00

row 2

5.00

4.00

3.00

row 3

6.00

8.00

7.00

mat3 (dest)

column 1

column 2

column 3

row 1

377.00 = 19.00 * 19.00 + 2.00 * 5.00 + 1.00 * 6.00

54.00 = 19.00 * 2.00 + 2.00 * 4.00 + 1.00 * 8.00

32.00 = 19.00 * 1.00 + 2.00 * 3.00 + 1.00 * 7.00

row 2

133.00 = 5.00 * 19.00 + 4.00 * 5.00 + 3.00 * 6.00

50.00 = 5.00 * 2.00 + 4.00 * 4.00 + 3.00 * 8.00

38.00 = 5.00 * 1.00 + 4.00 * 3.00 + 3.00 * 7.00

row 3

196.00 = 6.00 * 19.00 + 8.00 * 5.00 + 7.00 * 6.00

100.00 = 6.00 * 2.00 + 8.00 * 4.00 + 7.00 * 8.00

79.00 = 6.00 * 1.00 + 8.00 * 3.00 + 7.00 * 7.00

void glm_mat3_mulv(mat3 m, vec3 v, vec3 dest)

Multiply mat3 (m) by vec3 (v) and store in vec3 (dest).

Parameters:
[in] m mat3 (left)
[in] v vec3 (right, column vector)
[out] dest destination (result, column vector)

Note

Mathematical explanation

mat3 (m)

column 1

column 2

column 3

row 1

m00

m10

m20

row 2

m01

m11

m21

row 3

m02

m12

m22

column vec3 (1x3) (v)

column 1

row 1

v0

row 2

v1

row 3

v2

column vec3 (1x3) (dest)

column 1

row 1

m00 * v0 + m10 * v1 + m20 * v2

row 2

m01 * v0 + m11 * v1 + m21 * v2

row 3

m02 * v0 + m12 * v1 + m22 * v2

Note

Example

vec3 dest;
vec3 v = {33.00,55.00,77.00};
mat3 m = {
    {1.00,2.00,3.00},
    {4.00,5.00,6.00},
    {7.00,8.00,9.00},
};
glm_mat3_mulv(m, v, dest);
mat3 (m)

column 1

column 2

column 3

row 1

1.00

4.00

7.00

row 2

2.00

5.00

8.00

row 3

3.00

6.00

9.00

column vec3 (v)

column 1

row 1

33.00

row 2

55.00

row 3

77.00

vec2 (dest) Result

column 1

row 1

792.00 = 1.00 * 33.00 + 4.00 * 55.00 + 7.00 * 77.00

row 2

957.00 = 2.00 * 33.00 + 5.00 * 55.00 + 8.00 * 77.00

row 3

1122.00 = 3.00 * 33.00 + 6.00 * 55.00 + 9.00 * 77.00

void glm_mat3_transpose_to(mat3 mat, mat3 dest)

Transpose mat3 (mat) and store in mat3 (dest).

Parameters:
[in] mat mat3 (left,src)
[out] dest destination (result, mat3)

Note

Mathematical explanation

mat3 (mat)

column 1

column 2

column 3

row 1

m00

m10

m20

row 2

m01

m11

m21

row 3

m02

m12

m22

mat3 (dest)

column 1

column 2

column 3

row 1

m00

m01

m02

row 2

m10

m11

m12

row 3

m20

m21

m22

Note

Example

mat3 mat = {
    {1.00,2.00,3.00},
    {4.00,5.00,6.00},
    {7.00,8.00,9.00},
};
mat3 dest = GLM_MAT3_ZERO_INIT;
glm_mat3_transpose_to(mat, dest);
mat3 (mat)

column 1

column 2

column 3

row 1

1.00

4.00

7.00

row 2

2.00

5.00

8.00

row 3

3.00

6.00

9.00

mat3 (dest) Before

column 1

column 2

column 3

row 1

0.00

0.00

0.00

row 2

0.00

0.00

0.00

row 3

0.00

0.00

0.00

mat3 (dest) After

column 1

column 2

column 3

row 1

1.00

2.00

3.00

row 2

4.00

5.00

6.00

row 2

7.00

8.00

9.00

void glm_mat3_transpose(mat3 m)

Transpose mat3 (m) and store result in the same matrix.

Parameters:
[in, out] m mat3 (src, dest)

Note

Mathematical explanation

mat3 (m) src

column 1

column 2

column 3

row 1

m00

m10

m20

row 2

m01

m11

m21

row 2

m02

m12

m22

mat3 (m) dest

column 1

column 2

column 3

row 1

m00

m01

m02

row 2

m10

m11

m12

row 3

m20

m21

m22

Note

Example

mat3 mat = {
    {1.00,2.00,3.00},
    {4.00,5.00,6.00},
    {7.00,8.00,9.00},
};
glm_mat3_transpose(m);
mat3 (m) Before

column 1

column 2

column 3

row 1

1.00

4.00

7.00

row 2

2.00

5.00

8.00

row 3

3.00

6.00

9.00

mat3 (m) After

column 1

column 2

column 3

row 1

1.00

2.00

3.00

row 2

4.00

5.00

6.00

row 2

7.00

8.00

9.00

void glm_mat3_scale(mat3 m, float s)

Multiply mat3 (m) by scalar constant (s).

Parameters:
[in, out] m mat3 (src, dest)
[in] s float (scalar)

Note

Mathematical explanation

mat3 (m)

column 1

column 2

column 3

row 1

m00 * s

m10 * s

m20 * s

row 2

m01 * s

m11 * s

m21 * s

row 3

m02 * s

m12 * s

m22 * s

Note

Example

mat3 m = {
    {1.00,2.00,3.00},
    {4.00,5.00,6.00},
    {7.00,8.00,9.00},
};
float s = 3.00f;
glm_mat3_scale(m, s);
mat3 (m) Before

column 1

column 2

column 3

row 1

1.00

4.00

7.00

row 2

2.00

5.00

8.00

row 3

3.00

6.00

9.00

mat3 (m) After

column 1

column 2

column 3

row 1

3.00 = 1.00 * 3.00

12.00 = 4.00 * 3.00

21.00 = 7.00 * 3.00

row 2

6.00 = 2.00 * 3.00

15.00 = 5.00 * 3.00

24.00 = 8.00 * 3.00

row 3

9.00 = 3.00 * 3.00

18.00 = 6.00 * 3.00

27.00 = 9.00 * 3.00

void glm_mat3_inv(mat3 mat, mat3 dest)

Inverse mat3 (mat) and store in mat3 (dest).

Parameters:
[in] mat mat3 (left, src)
[out] dest destination (result, inverse mat3)

Note

Mathematical explanation

mat3 (mat)

column 1

column 2

column 3

row 1

m00

m10

m20

m00

m10

row 2

m01

m11

m21

m01

m11

row 3

m02

m12

m22

m02

m12

m00

m10

m20

m00

m10

m01

m11

m21

m01

m11

Remember we are in column major not row major. So, the way the table is populated is slightly different.
In terms of multiplication priority goes from m00,m01,m02,m11,…,m22.
May utilize the distributive law to acquire bellow equations
\[(m00 * m11 * m22) - (m00 * m21 * m12) = m00 * (m11 * m22 - m21 * m12)\]
mat3 (dest)

column 1

column 2

column 3

row 1

1.0f / (
m00 * (m11 * m22 - m12 * m21) -
m01 * (m10 * m22 - m20 * m12) +
m02 * (m10 * m21 - m20 * m11)
) * (m11 * m22 - m12 * m21)
-( 1.0f / (
m00 * (m11 * m22 - m12 * m21) -
m01 * (m10 * m22 - m20 * m12) +
m02 * (m10 * m21 - m20 * m11)
) ) * (m10 * m22 - m20 * m12)
1.0f / (
m00 * (m11 * m22 - m12 * m21) -
m01 * (m10 * m22 - m20 * m12) +
m02 * (m10 * m21 - m20 * m11)
) * (m10 * m21 - m11 * m20)

row 2

-( 1.0f / (
m00 * (m11 * m22 - m12 * m21) -
m01 * (m10 * m22 - m20 * m12) +
m02 * (m10 * m21 - m20 * m11)
) ) * (m01 * m22 - m21 * m02)
1.0f / (
m00 * (m11 * m22 - m12 * m21) -
m01 * (m10 * m22 - m20 * m12) +
m02 * (m10 * m21 - m20 * m11)
) * (m00 * m22 - m20 * m02)
-( 1.0f / (
m00 * (m11 * m22 - m12 * m21) -
m01 * (m10 * m22 - m20 * m12) +
m02 * (m10 * m21 - m20 * m11)
) ) * (m00 * m21 - m20 * m01)

row 3

1.0f / (
m00 * (m11 * m22 - m12 * m21) -
m01 * (m10 * m22 - m20 * m12) +
m02 * (m10 * m21 - m20 * m11)
) * (m01 * m12 - m11 * m02)
-( 1.0f / (
m00 * (m11 * m22 - m12 * m21) -
m01 * (m10 * m22 - m20 * m12) +
m02 * (m10 * m21 - m20 * m11)
) ) * (m00 * m12 - m10 * m02)
1.0f / (
m00 * (m11 * m22 - m12 * m21) -
m01 * (m10 * m22 - m20 * m12) +
m02 * (m10 * m21 - m20 * m11)
) * (m00 * m11 - m10 * m01)

Note

Example

mat3 mat = {
    {8.00,6.00,5.00},
    {16.00,31.00,25.00},
    {13.00,18.00,7.00},
};
mat3 dest = GLM_MAT3_ZERO_INIT;
glm_mat3_inv(mat, dest);
mat3 (mat) Before

column 1

column 2

column 3

row 1

8.00

16.00

13.00

8.00

16.00

row 2

6.00

31.00

18.00

6.00

31.00

row 3

5.00

25.00

7.00

5.00

25.00

8.00

16.00

13.00

8.00

16.00

6.00

31.00

18.00

6.00

31.00

mat3 (dest) After

column 1

column 2

column 3

row 1

0.200 = 1.0 / (
8.00 * (31.00 * 7.00 - 25.00 * 18.00) -
6.00 * (16.00 * 7.00 - 13.00 * 25.00) +
5.00 * (16.00 * 18.00 - 13.00 * 31.00)
) * (31.00 * 7.00 - 25.00 * 18.00)
-0.184 = -( 1.0 / (
8.00 * (31.00 * 7.00 - 25.00 * 18.00) -
6.00 * (16.00 * 7.00 - 13.00 * 25.00) +
5.00 * (16.00 * 18.00 - 13.00 * 31.00)
) ) * (16.00 * 7.00 - 13.00 * 25.00)
0.099 = 1.0 / (
8.00 * (31.00 * 7.00 - 25.00 * 18.00) -
6.00 * (16.00 * 7.00 - 13.00 * 25.00) +
5.00 * (16.00 * 18.00 - 13.00 * 31.00)
) * (16.00 * 18.00 - 31.00 * 13.00)

row 2

-0.041 = -( 1.0 / (
8.00 * (31.00 * 7.00 - 25.00 * 18.00) -
6.00 * (16.00 * 7.00 - 13.00 * 25.00) +
5.00 * (16.00 * 18.00 - 13.00 * 31.00)
) ) * (6.00 * 7.00 - 18.00 * 5.00)
0.007 = 1.0 / (
8.00 * (31.00 * 7.00 - 25.00 * 18.00) -
6.00 * (16.00 * 7.00 - 13.00 * 25.00) +
5.00 * (16.00 * 18.00 - 13.00 * 31.00)
) * (8.00 * 7.00 - 13.00 * 5.00)
-0.056 = -( 1.0 / (
8.00 * (31.00 * 7.00 - 25.00 * 18.00) -
6.00 * (16.00 * 7.00 - 13.00 * 25.00) +
5.00 * (16.00 * 18.00 - 13.00 * 31.00)
) ) * (8.00 * 18.00 - 13.00 * 6.00)

row 3

0.004 = 1.0 / (
8.00 * (31.00 * 7.00 - 25.00 * 18.00) -
6.00 * (16.00 * 7.00 - 13.00 * 25.00) +
5.00 * (16.00 * 18.00 - 13.00 * 31.00)
) * (6.00 * 25.00 - 31.00 * 5.00)
0.103 = -( 1.0 / (
8.00 * (31.00 * 7.00 - 25.00 * 18.00) -
6.00 * (16.00 * 7.00 - 13.00 * 25.00) +
5.00 * (16.00 * 18.00 - 13.00 * 31.00)
) ) * (8.00 * 25.00 - 16.00 * 5.00)
-0.130 = 1.0 / (
8.00 * (31.00 * 7.00 - 25.00 * 18.00) -
6.00 * (16.00 * 7.00 - 13.00 * 25.00) +
5.00 * (16.00 * 18.00 - 13.00 * 31.00)
) * (8.00 * 31.00 - 16.00 * 6.00)
void glm_mat3_swap_col(mat3 mat, int col1, int col2)

Swap two columns in mat3 (mat) and store in same matrix.

Parameters:
[in, out] mat mat3 (src, dest)
[in] col1 Column 1 array index
[in] col2 Column 2 array index

Note

Mathematical explanation

mat3 (mat) Before

column 1

column 2

column 3

row 1

m00

m10

m20

row 2

m01

m11

m21

row 3

m02

m12

m22

glm_mat3_swap_col(mat, 0, 1);
mat3 (mat) After

column 1

column 2

column 3

row 1

m10

m00

m20

row 2

m11

m01

m21

row 3

m12

m02

m22

Note

Example

mat3 mat = {
    {8.00,6.00,5.00},
    {16.00,31.00,25.00},
    {13.00,18.00,7.00},
};
glm_mat3_swap_col(mat, 0, 1);
mat3 (mat) Before

column 1

column 2

column 3

row 1

8.00

16.00

13.00

row 2

6.00

31.00

18.00

row 3

5.00

25.00

7.00

mat3 (mat) After

column 1

column 2

column 3

row 1

16.00

8.00

13.00

row 2

31.00

6.00

18.00

row 3

25.00

5.00

7.00

void glm_mat3_swap_row(mat3 mat, int row1, int row2)

Swap two rows in mat3 (mat) and store in same matrix.

Parameters:
[in, out] mat mat3 (src, dest)
[in] row1 Row 1 array index
[in] row2 Row 2 array index

Note

Mathematical explanation

mat3 (mat) Before

column 1

column 2

column 3

row 1

m00

m10

m20

row 2

m01

m11

m21

row 3

m02

m12

m22

glm_mat3_swap_row(mat, 0, 1);
mat3 (mat) After

column 1

column 2

column 3

row 1

m01

m11

m21

row 2

m00

m10

m20

row 3

m02

m12

m22

Note

Example

mat3 mat = {
    {8.00,6.00,5.00},
    {16.00,31.00,25.00},
    {13.00,18.00,7.00},
};
glm_mat3_swap_col(mat, 0, 1);
mat3 (mat) Before

column 1

column 2

column 3

row 1

8.00

16.00

13.00

row 2

6.00

31.00

18.00

row 3

5.00

25.00

7.00

mat3 (mat) After

column 1

column 2

column 3

row 1

6.00

31.00

18.00

row 2

8.00

16.00

13.00

row 3

5.00

25.00

7.00

void glm_mat3_quat(mat3 m, versor dest)

convert mat3 to quaternion

Parameters:
[in] m rotation matrix
[out] dest destination quaternion
void glm_mat3_textrans(float sx, float sy, float rot, float tx, float ty, mat3 dest)

Create texture transformation matrix, rotation is in radians CCW/RH

Parameters:
[in] sx scale x
[in] sy scale y
[in] rot rotation in radians CCW/RH
[in] tx translation x
[in] ty translation y
[out] dest destination matrix3x3
float glm_mat3_det(mat3 m)

Returns mat3 determinant.

Parameters:
[in] m mat3 (src)
Returns:
mat3 determinant (float)

Note

Mathematical explanation

mat3 (mat)

column 1

column 2

column 3

row 1

m00

m10

m20

m00

m10

row 2

m01

m11

m21

m01

m11

row 3

m02

m12

m22

m02

m12

m00

m10

m20

m00

m10

m01

m11

m21

m01

m11

For more information see first portion of
m00 * (m11 * m22 - m12 * m21) -
m01 * (m10 * m22 - m20 * m12) +
m02 * (m10 * m21 - m20 * m11)

Note

Example

mat3 m = {
    {8.00,6.00,5.00},
    {16.00,31.00,25.00},
    {13.00,18.00,7.00},
};
glm_mat3_det(m);
mat3 (m)

column 1

column 2

column 3

row 1

8.00

16.00

13.00

8.00

16.00

row 2

6.00

31.00

18.00

6.00

31.00

row 3

5.00

25.00

7.00

5.00

25.00

-1161.00 = 8.00 * (31.00 * 7.00 - 25.00 * 18.00) -
           6.00 * (16.00 * 7.00 - 13.00 * 25.00) +
           5.00 * (16.00 * 18.00 - 13.00 * 31.00)
void glm_mat3_trace(mat3 m)
Returns trace of matrix. Which is:

The sum of the elements on the main diagonal from
upper left corner to the bottom right corner.
Parameters:
[in] m mat3 (src)
Returns:
mat3 trace (float)

Note

Mathematical explanation

mat3 (m)

column 1

column 2

column 3

row 1

m00

m10

m20

row 2

m01

m11

m21

row 3

m02

m12

m22

m00 + m11 + m22

Note

Example

mat3 m = {
    {8.00,6.00,5.00},
    {16.00,31.00,25.00},
    {13.00,18.00,7.00},
};
glm_mat3_trace(m);
mat3 (m)

column 1

column 2

column 3

row 1

8.00

16.00

13.00

row 2

6.00

31.00

18.00

row 3

5.00

25.00

7.00

82.00 = 8.00 + 31.00 + 7.00
float glm_mat3_rmc(vec3 r, mat3 m, vec3 c)
Helper for R (row vector) * M (matrix) * C (column vector)

rmc stands for Row * Matrix * Column

the result is scalar because M * C = ResC (1x2, column vector),
then if you take the dot_product(R (3x1), ResC (1x3)) = scalar value.
Parameters:
[in] r vec3 (3x1, row vector)
[in] m mat3 (2x2, matrix)
[in] c vec3 (1x3, column vector)
Returns:
Scalar value (float, 1x1)

Note

Mathematical explanation

row vec3 (3x1) (r)

column 1

column 2

column 3

row 1

a00

a10

a20

mat3 (m)

column 1

column 2

column 3

row 1

b00

b10

b20

row 2

b01

b11

b21

row 3

b02

b12

b22

column vec3 (1x3) (c)

column 1

row 1

c00

row 2

c01

row 3

c02

M * C = C (column vector)
dot_product(R, C)
column vec3 (1x3) (C)

column 1

row 1

b00 * c00 + b10 * c01 + b20 * c02

row 2

b01 * c00 + b11 * c01 + b21 * c02

row 3

b02 * c00 + b11 * c01 + b22 * c02

float (scalar)

column 1

row 1

a00 * (b00 * c00 + b10 * c01 + b20 * c02) +
a10 * (b01 * c00 + b11 * c01 + b21 * c02) +
a20 * (b02 * c00 + b11 * c01 + b22 * c02)

Note

Example

vec3 r = {8.00,4.00,13.00};
vec3 c = {7.00,2.00,9.00};
mat3 m = {
    {8.00,6.00,5.00},
    {16.00,31.00,25.00},
    {13.00,18.00,7.00},
};
glm_mat3_rmc(r, m, c);
row vec3 (3x1) (r)

column 1

column 2

column 3

row 1

8.00

4.00

13.00

mat3 (m)

column 1

column 2

column 3

row 1

8.00

16.00

13.00

row 2

6.00

31.00

18.00

row 3

5.00

25.00

7.00

column vec3 (1x3) (c)

column 1

row 1

7.00

row 2

2.00

row 3

9.00

column vec3 (1x3) (C)

column 1

row 1

205.00 = 8.00 * 7.00 + 16.00 * 2.00 + 13.00 * 9.00

row 2

266.00 = 6.00 * 7.00 + 31.00 * 2.00 + 18.00 * 9.00

row 3

148.00 = 5.00 * 7.00 + 25.00 * 2.00 + 7.00 * 9.00

float (1x1) (scalar)

column 1

row 1

4628.00 = 8.00 * 205.00 + 4.00 * 266.00 + 13.00 * 148.00