Matrix44¶
The Matrix44
class template represents a 4x4 matrix, with
predefined typedefs for float
and double
.
There are also various utility functions that operate on matrices
defined in ImathMatrixAlgo.h
and described in Matrix
Functions.
Individual components of a matrix M
may be referenced as either
M[j][i]
or M.x[j][i]
. While the latter is a little awkward, it has an
advantage when used in loops that may be auto-vectorized or explicitly
vectorized by #pragma omp simd
or other such hints, because the function
call and pointer casting of operator[]
can confuse the compiler just
enough to prevent vectorization of the loop, whereas directly addressing the
real underlying array (M.x[j][i]
) does not.
Example:
#include <Imath/ImathMatrix.h>
#include <Imath/ImathMatrixAlgo.h>
#include <cassert>
void
matrix44_example()
{
Imath::M44f M (Imath::UNINITIALIZED); // uninitialized
M.makeIdentity();
assert (M[0][0] == 1.0f);
assert (M[0][1] == 0.0f);
Imath::M44f Minv = M.inverse();
Imath::M44f R;
assert (R == Imath::identity44f);
R.rotate (Imath::V3f (0.02f, M_PI/4, 0.0f));
M = R * M;
Imath::V3f v3 (1.0f, 0.0f, 0.0f);
Imath::V4f v4 (1.0f, 0.0f, 0.0f, 1.0f);
Imath::V3f r3 = v3 * M;
assert (r3.equalWithAbsError (Imath::V3f (0.707107f, 0.0f, -0.7071070f), 1e-6f));
Imath::V4f r4 = v4 * M;
assert (r4.equalWithAbsError (Imath::V4f (0.707107f, 0.0f, -0.7071070f, 1.0f), 1e-6f));
}
-
typedef Matrix44<float>
Imath
::
M44f
¶ 4x4 matrix of float
-
typedef Matrix44<double>
Imath
::
M44d
¶ 4x4 matrix of double
-
template<class
T
>
classMatrix44
¶ 4x4 transformation matrix
Direct access to elements
-
template<>
Tx
[4][4]¶ Matrix elements.
Constructors and Assignment
-
constexpr
Matrix44
(Uninitialized)¶ Uninitialized.
-
constexpr
Matrix44
()¶ Default constructor: initialize to identity 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1.
-
constexpr
Matrix44
(T a)¶ Initialize to scalar constant a a a a a a a a a a a a a a a a.
-
constexpr
Matrix44
(const T a[4][4])¶ Construct from 4x4 array a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] a[1][2] a[1][3] a[2][0] a[2][1] a[2][2] a[2][3] a[3][0] a[3][1] a[3][2] a[3][3].
-
constexpr
Matrix44
(T a, T b, T c, T d, T e, T f, T g, T h, T i, T j, T k, T l, T m, T n, T o, T p)¶ Construct from given scalar values a b c d e f g h i j k l m n o p.
-
constexpr
Matrix44
(Matrix33<T> r, Vec3<T> t)¶ Construct from a 3x3 rotation matrix and a translation vector r r r 0 r r r 0 r r r 0 t t t 1.
-
template<class
S
>
constexprMatrix44
(const Matrix44<S> &v)¶ Construct from Matrix44 of another base type.
-
constexpr const Matrix44<T> &
operator=
(const Matrix44 &v)¶ Assignment operator.
-
constexpr const Matrix44<T> &
operator=
(T a)¶ Assignment from scalar.
-
~Matrix44
()¶ Destructor.
Compatibility with Sb
-
T *
getValue
()¶ Return a raw pointer to the array of values.
-
const T *
getValue
() const¶ Return a raw pointer to the array of values.
Arithmetic and Comparison
-
constexpr bool
operator==
(const Matrix44 &v) const¶ Equality.
-
constexpr bool
operator!=
(const Matrix44 &v) const¶ Inequality.
-
constexpr bool
equalWithAbsError
(const Matrix44<T> &v, T e) const¶ Compare two matrices and test if they are “approximately equal”:
- Return
- True if the coefficients of this and
m
are the same with an absolute error of no more than e, i.e., for all i, j:abs (this[i][j] - m[i][j]) <= e
-
constexpr bool
equalWithRelError
(const Matrix44<T> &v, T e) const¶ Compare two matrices and test if they are “approximately equal”:
- Return
- True if the coefficients of this and m are the same with a relative error of no more than e, i.e., for all i, j:
abs (this[i] - v[i][j]) <= e * abs (this[i][j])
-
constexpr const Matrix44<T> &
operator+=
(const Matrix44 &v)¶ Component-wise addition.
-
constexpr const Matrix44<T> &
operator+=
(T a)¶ Component-wise addition.
-
constexpr Matrix44<T>
operator+
(const Matrix44 &v) const¶ Component-wise addition.
-
constexpr const Matrix44<T> &
operator-=
(const Matrix44 &v)¶ Component-wise subtraction.
-
constexpr const Matrix44<T> &
operator-=
(T a)¶ Component-wise subtraction.
-
constexpr Matrix44<T>
operator-
(const Matrix44 &v) const¶ Component-wise subtraction.
-
constexpr Matrix44<T>
operator-
() const¶ Component-wise multiplication by -1.
-
constexpr const Matrix44<T> &
negate
()¶ Component-wise multiplication by -1.
-
constexpr const Matrix44<T> &
operator*=
(T a)¶ Component-wise multiplication.
-
constexpr Matrix44<T>
operator*
(T a) const¶ Component-wise multiplication.
-
constexpr const Matrix44<T> &
operator/=
(T a)¶ Component-wise division.
-
constexpr Matrix44<T>
operator/
(T a) const¶ Component-wise division.
-
constexpr const Matrix44<T> &
operator*=
(const Matrix44 &v)¶ Matrix-matrix multiplication.
-
constexpr Matrix44<T>
operator*
(const Matrix44 &v) const¶ Matrix-matrix multiplication.
-
template<class
S
>
voidmultVecMatrix
(const Vec3<S> &src, Vec3<S> &dst) const¶ Vector-matrix multiplication: a homogeneous transformation by computing Vec3 (src.x, src.y, src.z, 1) * m and dividing by the result’s third element.
- Parameters
src
: The input vectordst
: The output vector
-
template<class
S
>
voidmultDirMatrix
(const Vec3<S> &src, Vec3<S> &dst) const¶ Vector-matrix multiplication: multiply
src
by the upper left 2x2 submatrix, ignoring the rest of matrix.- Parameters
src
: The input vectordst
: The output vector
-
void
multiply
(const Matrix44 &a, const Matrix44 &b, Matrix44 &c)¶ Matrix-matrix multiplication: compute c = a * b.
-
constexpr Matrix44<T>
multiply
(const Matrix44 &a, const Matrix44 &b)¶ Matrix-matrix multiplication returning a result.
Maniplation
-
void
makeIdentity
()¶ Set to the identity matrix.
-
constexpr const Matrix44<T> &
transpose
()¶ Transpose.
-
constexpr Matrix44<T>
transposed
() const¶ Return the transpose.
-
constexpr const Matrix44<T> &
invert
(bool singExc)¶ Invert in place using the determinant.
- Return
- const reference to this
- Parameters
singExc
: If true, throw an exception if the matrix cannot be inverted.
-
constexpr const Matrix44<T> &
invert
()¶ Invert in place using the determinant.
- Return
- const reference to this
-
constexpr Matrix44<T>
inverse
(bool singExc) const¶ Return the inverse using the determinant, leaving this unmodified.
- Parameters
singExc
: If true, throw an exception if the matrix cannot be inverted.
-
constexpr Matrix44<T>
inverse
() const¶ Return the inverse using the determinant, leaving this unmodified.
-
constexpr const Matrix44<T> &
gjInvert
(bool singExc)¶ Invert in place using the Gauss-Jordan method.
Significantly slower but more accurate than invert().
- Return
- const reference to this
- Parameters
singExc
: If true, throw an exception if the matrix cannot be inverted.
-
constexpr const Matrix44<T> &
gjInvert
()¶ Invert in place using the Gauss-Jordan method.
Significantly slower but more accurate than invert().
- Return
- const reference to this
-
Matrix44<T>
gjInverse
(bool singExc) const¶ Return the inverse using the Gauss-Jordan method, leaving this unmodified.
Significantly slower but more accurate than inverse().
-
Matrix44<T>
gjInverse
() const¶ Return the inverse using the Gauss-Jordan method, leaving this unmodified Significantly slower but more accurate than inverse().
-
constexpr T
minorOf
(const int r, const int c) const¶ Calculate the matrix minor of the (r,c) element.
-
constexpr T
fastMinor
(const int r0, const int r1, const int r2, const int c0, const int c1, const int c2) const¶ Build a minor using the specified rows and columns.
-
constexpr T
determinant
() const¶ Determinant.
-
constexpr T
trace
() const¶ Trace.
-
template<class
S
>
const Matrix44 &setEulerAngles
(const Vec3<S> &r)¶ Set matrix to rotation by XYZ euler angles (in radians)
- Return
- const referenced to this
-
template<class
S
>
constexpr const Matrix44 &setAxisAngle
(const Vec3<S> &ax, S ang)¶ Set matrix to rotation around given axis by given angle (in radians)
- Return
- const referenced to this
-
template<class
S
>
const Matrix44 &rotate
(const Vec3<S> &r)¶ Rotate the matrix by XYZ euler angles in r (in radians)
- Return
- const referenced to this
-
constexpr const Matrix44<T> &
setScale
(T s)¶ Set matrix to scale by given uniform factor.
- Return
- const referenced to this
-
template<class
S
>
constexpr const Matrix44 &setScale
(const Vec3<S> &s)¶ Set matrix to scale by given vector.
- Return
- const referenced to this
-
template<class
S
>
constexpr const Matrix44 &scale
(const Vec3<S> &s)¶ Scale the matrix by s.
- Return
- const referenced to this
-
template<class
S
>
constexpr const Matrix44 &setTranslation
(const Vec3<S> &t)¶ Set matrix to translation by given vector.
- Return
- const referenced to this
-
constexpr const Vec3<T>
translation
() const¶ Return translation component.
-
template<class
S
>
constexpr const Matrix44 &translate
(const Vec3<S> &t)¶ Translate the matrix by t.
- Return
- const referenced to this
-
template<class
S
>
constexpr const Matrix44 &setShear
(const Vec3<S> &h)¶ Set matrix to shear by given vector h.
The resulting matrix
- will shear x for each y coord. by a factor of h[0] ;
- will shear x for each z coord. by a factor of h[1] ;
- will shear y for each z coord. by a factor of h[2] .
- Return
- const referenced to this
-
template<class
S
>
constexpr const Matrix44 &setShear
(const Shear6<S> &h)¶ Set matrix to shear by given factors.
The resulting matrix
- will shear x for each y coord. by a factor of h.xy ;
- will shear x for each z coord. by a factor of h.xz ;
- will shear y for each z coord. by a factor of h.yz ;
- will shear y for each x coord. by a factor of h.yx ;
- will shear z for each x coord. by a factor of h.zx ;
- will shear z for each y coord. by a factor of h.zy .
- Return
- const referenced to this
-
template<class
S
>
constexpr const Matrix44 &shear
(const Vec3<S> &h)¶ Shear the matrix by given vector.
The composed matrix will be
shear
*this
, where the shear matrix …- will shear x for each y coord. by a factor of h[0] ;
- will shear x for each z coord. by a factor of h[1] ;
- will shear y for each z coord. by a factor of h[2] .
- Return
- const referenced to this
-
template<class
S
>
constexpr const Matrix44 &shear
(const Shear6<S> &h)¶ Shear the matrix by the given factors.
The composed matrix will be
shear
*this
, where the shear matrix …- will shear x for each y coord. by a factor of h.xy ;
- will shear x for each z coord. by a factor of h.xz ;
- will shear y for each z coord. by a factor of h.yz ;
- will shear y for each x coord. by a factor of h.yx ;
- will shear z for each x coord. by a factor of h.zx ;
- will shear z for each y coord. by a factor of h.zy .
- Return
- const referenced to this
Numeric Limits
-
static constexpr T
baseTypeLowest
()¶ Largest possible negative value.
-
static constexpr T
baseTypeMax
()¶ Largest possible positive value.
-
static constexpr T
baseTypeSmallest
()¶ Smallest possible positive value.
-
static constexpr T
baseTypeEpsilon
()¶ Smallest possible e for which 1+e != 1.
Public Types
-
typedef T
BaseType
¶ The base type: In templates that accept a parameter
V
(could be a Color4), you can refer toT
asV::BaseType
-
typedef Vec4<T>
BaseVecType
¶ The base vector type.
Public Static Functions
-
static constexpr unsigned int
dimensions
()¶ Return the number of the row and column dimensions, i.e. 4.
-
template<>
Warning
doxygenfunction: Unable to resolve multiple matches for function “operator<<” with arguments (std::ostream& s, const Matrix44<T>& m) in doxygen xml output for project “Imath” from directory: /build/ilmbase-5Yemou/ilmbase-3.1.11/obj-x86_64-linux-gnu/website/doxygen/xml. Potential matches:
- std::ostream &operator<<(std::ostream&, Imath::half)
- template<class T>
std::ostream &Imath::operator<<(std::ostream&, const Color4<T>&)
- template<class T>
std::ostream &Imath::operator<<(std::ostream&, const Euler<T>&)
- template<class T>
std::ostream &Imath::operator<<(std::ostream&, const Interval<T>&)
- template<class T>
std::ostream &Imath::operator<<(std::ostream&, const Line3<T>&)
- template<class T>
std::ostream &Imath::operator<<(std::ostream&, const Matrix22<T>&)
- template<class T>
std::ostream &Imath::operator<<(std::ostream&, const Matrix33<T>&)
- template<class T>
std::ostream &Imath::operator<<(std::ostream&, const Matrix44<T>&)
- template<class T>
std::ostream &Imath::operator<<(std::ostream&, const Plane3<T>&)
- template<class T>
std::ostream &Imath::operator<<(std::ostream&, const Quat<T>&)
- template<class T>
std::ostream &Imath::operator<<(std::ostream&, const Shear6<T>&)
- template<class T>
std::ostream &Imath::operator<<(std::ostream&, const Vec2<T>&)
- template<class T>
std::ostream &Imath::operator<<(std::ostream&, const Vec3<T>&)
- template<class T>
std::ostream &Imath::operator<<(std::ostream&, const Vec4<T>&)