This module implements a right-handed 3D mathematics library supporting three-component vectors, four-by-four matrices, quaternions, and Euler angles. These values are represented using ordinary C arrays of type real
.
By default, real
is typedef
-ed to double
. However, float
is used instead if the preprocessor symbol CONFIG_MATH3D_FLOAT
is defined during inclusion of math3d.h
and compilation of math3d.c
.
Array layout is as follows. Note that the quaternion scalar part follows the vector part, allowing vector functions to operate upon the vector part of a quaternion. Also, the matrix representation is column-wise, matching the layout expected by OpenGL. Here, aij is the element at row i, column j.
Vector: | x | y | z | |||||||||||||
Quaternion: | x | y | z | s | ||||||||||||
Euler: | α | β | γ | |||||||||||||
Matrix: | a00 | a10 | a20 | a30 | a01 | a11 | a21 | a31 | a02 | a12 | a22 | a32 | a03 | a13 | a23 | a33 |
Euler angle α gives rotation about the x axis, β about the y axis, and γ about the z axis. (Please beware the difference between the y and the Greek gamma γ.) These rotations are concatenated in zxy-order, as this is a common standard for interactive 3D. Angle α ranges from −½ π to ½ π while β and γ range from −π to π.
The signatures of all functions follow. The first argument to most functions is a pointer to an array to receive the result. Subsequent arguments are constant pointers to operands, or real values. Pointers are declared restrict
when two or more arguments may not reasonably refer to the same array. Light-weight functions are declared static inline
in the header while heavy functions are exported from the C module.
Rotation arguments and Euler angles are given in radians.
-
real radians(real a)
Convert angle
a
from degrees to radians. -
real degrees(real a)
Convert angle
a
from radians to degrees.
-
real vlen(const real *a)
Length.
||a||
-
void vcpy(real *restrict a, const real *restrict b)
Copy.
a = b
-
void vneg(real *a, const real *b)
Negation.
a = -b
-
real vdot(const real *a, const real *b)
Dot product.
a
⋅b
-
void vmul(real *a, const real *b, real k)
Scalar product.
a = b * k
-
void vcrs(real *restrict a, const real *restrict b, const real *restrict c)
Cross product.
a = b
×c
-
void vadd(real *a, const real *b, const real *c)
Addition.
a = b + c
-
void vsub(real *a, const real *b, const real *c)
Subtraction.
a = b - c
-
void vmad(real *a, const real *b, const real *c, real k)
Scalar-multiply-add.
a = b + c * k
-
void vproject(real *a, const real *b, const real *c)
Project vector
c
parallel with vectorb
. -
void vnormalize(real *a, const real *b)
Normalization.
a = b / ||b||
-
void vtransform(real *restrict a, const real *restrict M, const real *restrict b)
Transform vector
b
by matrixM
(neglecting translation.) -
void ptransform(real *restrict a, const real *restrict M, const real *restrict b)
Transform position
b
by matrixM
(including translation.) -
void vslerp(real *a, const real *b, const real *c, real t)
Compute the spherical linear interpolation of vectors
b
andc
at a timet
between zero and one.
-
real qdot(const real *a, const real *b)
Dot product.
a
⋅b
-
void qadd(real *a, const real *b, const real *c)
Add.
a = b + c
-
void qscale(real *a, const real *b, real k)
Scalar multiply.
a = b * k
-
void qconjugate(real *a, const real *b)
Conjugate.
-
void qinvert(real *a, const real *b)
Inverse.
-
void qnormalize(real *a, const real *b)
Normalization.
-
void qpow(real *a, const real *b, real h);
Compute quaternion
b
raised to the powerh
. -
void qexp(real *a, const real *b);
Compute e raised to the power quaternion
b
. -
void qlog(real *a, const real *b);
Compute the natural logarithm of quaternion
b
. -
void qsign(real *a, const real *b, const real *c)
Provide quaternion
c
with the same "sign" as quaternionb
, selectinga = c
ora = -c
such thata
⋅b
≥ 0. This ensures that interpolation fromb
toc
goes "the short way around." -
void qslerp(real *a, const real *b, const real *c, real t)
Compute the spherical linear interpolation of quaternions
b
andc
at a timet
between zero and one. -
void qsquad(real *a, const real *b, const real *c, const real *d, const real *e, real t)
Compute the spherical quadrangle interpolation of quaternions
c
andd
at timet
along the spline throughb
,c
,d
, ande
. -
void qrotate(real *restrict q, const real *restrict v, real a)
Compute the quaternion giving rotation about vector
v
through anglea
. -
void qmultiply(real *restrict a, const real *restrict b, const real *restrict c)
Multiply quaternions
b
andc
.
-
void minvert(real *restrict I, const real *restrict M)
Compute the inverse of matrix
M
. -
void mtranspose(real *restrict T, const real *restrict M)
Return the transpose of matrix
M
. -
void mmultiply(real *restrict M, const real *restrict A, const real *restrict B)
Multiply matrices
A
andB
. -
void morthonormalize(real *restrict O, const real *restrict M)
Compute the orthonormalization of the rotation of matrix
M
, preserving the direction of thez
axis, and the non-rotation elements ofM
.
-
void midentity(real *restrict M)
The identity.
-
void mrotatex(real *restrict M, real a)
Rotation about the x axis through angle
a
. -
void mrotatey(real *restrict M, real a)
Rotation about the y axis through angle
a
. -
void mrotatez(real *restrict M, real a)
Rotation about the z axis through angle
a
. -
void mrotate(real *restrict M, const real *restrict v, real a)
Rotation about vector
v
through anglea
. -
void mtranslate(real *restrict M, const real *restrict v)
Translation along vector
v
. -
void mscale(real *restrict M, const real *restrict v)
Scaling by vector
v
. -
void mbasis(real *restrict M, const real *restrict x, const real *restrict y, const real *restrict z)
The basis given by vectors
x
,y
, andz
. -
void morthogonal(real *restrict M,real l, real r,real b, real t,real n, real f)
The orthogonal projection with left, right, bottom, top, near, and far clipping plane distances.
-
void mperspective(real *restrict M,real l, real r,real b, real t,real n, real f)
The perspective projection with left, right, bottom, top, near, and far clipping plane distances.
-
void mquaternion(real *restrict M, const real *restrict q)
Compute the rotation matrix given by quaternion
q
. -
void meuler(real *restrict M, const real *restrict e)
Compute the rotation matrix given by Euler angles
e
.
-
void qmatrix(real *restrict q, const real *restrict M)
Compute the quaternion given by rotation matrix
M
. -
void qeuler(real *restrict q, const real *restrict e)
Compute the quaternion given by Euler angles
e
.
-
void ematrix(real *restrict e, const real *restrict M)
Extract a set of Euler angles from rotation matrix
M
. -
void equaternion(real *restrict e, const real *restrict q)
Extract a set of Euler angles from quaternion
q
.