14#ifndef MOMENTUM_MATRIX4X4_H
15#define MOMENTUM_MATRIX4X4_H
17#include "momentum_export.h"
18#include <momentum_namespace.h>
26#include <agx/Prefetch.h>
32#define MOMENTUM_MATRIX4X4_SET_ROW(row, v1, v2, v3, v4 ) \
33 m_data[(row)][0] = (v1); \
34 m_data[(row)][1] = (v2); \
35 m_data[(row)][2] = (v3); \
36 m_data[(row)][3] = (v4);
38#define MOMENTUM_MATRIX4X4_INNER_PRODUCT(a,b,r,c) \
39 ((a).m_data[r][0] * (b).m_data[0][c]) \
40 +((a).m_data[r][1] * (b).m_data[1][c]) \
41 +((a).m_data[r][2] * (b).m_data[2][c]) \
42 +((a).m_data[r][3] * (b).m_data[3][c])
78 Matrix4x4(
double a00,
double a01,
double a02,
double a03,
79 double a10,
double a11,
double a12,
double a13,
80 double a20,
double a21,
double a22,
double a23,
81 double a30,
double a31,
double a32,
double a33 );
104 bool isFinite()
const;
109 bool isIdentity()
const;
114 bool isRigidTransformation()
const;
142 Matrix4x4 set(
double const *
const ptr );
143 Matrix4x4 set(
double a00,
double a01,
double a02,
double a03,
144 double a10,
double a11,
double a12,
double a13,
145 double a20,
double a21,
double a22,
double a23,
146 double a30,
double a31,
double a32,
double a33 );
158 m_data[row][0] = vec[0];
159 m_data[row][1] = vec[1];
160 m_data[row][2] = vec[2];
161 m_data[row][3] = vec[3];
165 m_data[0][col] = vec[0];
166 m_data[1][col] = vec[1];
167 m_data[2][col] = vec[2];
168 m_data[3][col] = vec[3];
196 Matrix4x4 setRotate(
double angle,
double x,
double y,
double z );
198 double angle2,
const Vec3& axis2,
199 double angle3,
const Vec3& axis3 );
202 Matrix4x4 setTranslate(
double tx,
double ty,
double tz);
205 Matrix4x4 addTranslate(
double tx,
double ty,
double tz);
212 Vec3 getTranslate()
const;
214 Quat getRotate()
const;
225 const double *ptr()
const;
236 static Matrix4x4 translate(
double x,
double y,
double z );
238 static Matrix4x4 rotate(
double angle,
double x,
double y,
double z );
241 double angle2,
const Vec3& axis2,
242 double angle3,
const Vec3& axis3 );
247 Vec3 operator* (
const Vec3& v )
const;
248 Vec4 operator* (
const Vec4& v )
const;
250 void operator*= (
const Matrix4x4& other );
252 bool operator== (
const Matrix4x4& m )
const;
253 bool operator!= (
const Matrix4x4& m )
const;
255 double& operator()(
size_t row,
size_t col);
258 double operator()(
size_t row,
size_t col)
const;
260 Vec3 transform3x3(
const Vec3& vIn)
const;
262 Vec3 transform3x3Inv(
const Vec3& vIn)
const;
282 std::string __str__()
const;
300#include "EulerAngles.h"
316 m_data[0][0] = mat(0, 0);
317 m_data[0][1] = mat(0, 1);
318 m_data[0][2] = mat(0, 2);
319 m_data[0][3] = mat(0, 3);
321 m_data[1][0] = mat(1, 0);
322 m_data[1][1] = mat(1, 1);
323 m_data[1][2] = mat(1, 2);
324 m_data[1][3] = mat(1, 3);
326 m_data[2][0] = mat(2, 0);
327 m_data[2][1] = mat(2, 1);
328 m_data[2][2] = mat(2, 2);
329 m_data[2][3] = mat(2, 3);
331 m_data[3][0] = mat(3, 0);
332 m_data[3][1] = mat(3, 1);
333 m_data[3][2] = mat(3, 2);
334 m_data[3][3] = mat(3, 3);
338 double a10,
double a11,
double a12,
double a13,
339 double a20,
double a21,
double a22,
double a23,
340 double a30,
double a31,
double a32,
double a33 )
402 return std::isnan( m_data[0][0] ) || std::isnan( m_data[0][1] )
403 || std::isnan( m_data[0][2] ) || std::isnan( m_data[0][3] )
404 || std::isnan( m_data[1][0] ) || std::isnan( m_data[1][1] )
405 || std::isnan( m_data[1][2] ) || std::isnan( m_data[1][3] )
406 || std::isnan( m_data[2][0] ) || std::isnan( m_data[2][1] )
407 || std::isnan( m_data[2][2] ) || std::isnan( m_data[2][3] )
408 || std::isnan( m_data[3][0] ) || std::isnan( m_data[3][1] )
409 || std::isnan( m_data[3][2] ) || std::isnan( m_data[3][3] );
416 return std::isfinite( m_data[0][0] ) && std::isfinite( m_data[0][1] )
417 && std::isfinite( m_data[0][2] ) && std::isfinite( m_data[0][3] )
418 && std::isfinite( m_data[1][0] ) && std::isfinite( m_data[1][1] )
419 && std::isfinite( m_data[1][2] ) && std::isfinite( m_data[1][3] )
420 && std::isfinite( m_data[2][0] ) && std::isfinite( m_data[2][1] )
421 && std::isfinite( m_data[2][2] ) && std::isfinite( m_data[2][3] )
422 && std::isfinite( m_data[3][0] ) && std::isfinite( m_data[3][1] )
423 && std::isfinite( m_data[3][2] ) && std::isfinite( m_data[3][3] );
437 isRigid &=
equivalent(m_data[0][0]*m_data[0][0] + m_data[0][1]*m_data[0][1] + m_data[0][2]*m_data[0][2],
double(1),
double(1.0e-3));
438 isRigid &=
equivalent(m_data[1][0]*m_data[1][0] + m_data[1][1]*m_data[1][1] + m_data[1][2]*m_data[1][2],
double(1),
double(1.0e-3));
439 isRigid &=
equivalent(m_data[2][0]*m_data[2][0] + m_data[2][1]*m_data[2][1] + m_data[2][2]*m_data[2][2],
double(1),
double(1.0e-3));
441 isRigid &=
equivalent(m_data[0][0]*m_data[0][0] + m_data[1][0]*m_data[1][0] + m_data[2][0]*m_data[2][0],
double(1),
double(1.0e-3));
442 isRigid &=
equivalent(m_data[0][1]*m_data[0][1] + m_data[1][1]*m_data[1][1] + m_data[2][1]*m_data[2][1],
double(1),
double(1.0e-3));
443 isRigid &=
equivalent(m_data[0][2]*m_data[0][2] + m_data[1][2]*m_data[1][2] + m_data[2][2]*m_data[2][2],
double(1),
double(1.0e-3));
445 isRigid &=
equivalent(m_data[0][0]*m_data[1][1]*m_data[2][2] + m_data[0][1]*m_data[1][2]*m_data[2][0] + m_data[0][2]*m_data[1][0]*m_data[2][1]
446 - m_data[2][0]*m_data[1][1]*m_data[0][2] - m_data[1][0]*m_data[0][1]*m_data[2][2] - m_data[0][0]*m_data[2][1]*m_data[1][2],
447 double(1),
double(1.0e-1));
449 isRigid &= (m_data[0][3] == double(0));
450 isRigid &= (m_data[1][3] == double(0));
451 isRigid &= (m_data[2][3] == double(0));
453 isRigid &= (m_data[3][3] == double(1));
465 memcpy(m_data,
ptr,
sizeof(
double)*16);
472 double a10,
double a11,
double a12,
double a13,
473 double a20,
double a21,
double a22,
double a23,
474 double a30,
double a31,
double a32,
double a33 )
537 double angle2,
const Vec3& axis2,
538 double angle3,
const Vec3& axis3 )
571 m_data[3][0] += v[0];
572 m_data[3][1] += v[1];
573 m_data[3][2] += v[2];
592 this->
set(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1);
603 return Vec3( m_data[3][0], m_data[3][1], m_data[3][2] );
617 return (
double* )m_data;
623 return (
const double * )m_data;
686 double angle2,
const Vec3& axis2,
687 double angle3,
const Vec3& axis3 )
690 m.
setRotate(angle1, axis1, angle2, axis2, angle3, axis3);
702 agx::prefetch<agx::L1>( lhs.m_data );
703 agx::prefetch<agx::L1>( rhs.m_data );
716 m_data[0][0] = MOMENTUM_MATRIX4X4_INNER_PRODUCT(lhs, rhs, 0, 0);
717 m_data[0][1] = MOMENTUM_MATRIX4X4_INNER_PRODUCT(lhs, rhs, 0, 1);
718 m_data[0][2] = MOMENTUM_MATRIX4X4_INNER_PRODUCT(lhs, rhs, 0, 2);
719 m_data[0][3] = MOMENTUM_MATRIX4X4_INNER_PRODUCT(lhs, rhs, 0, 3);
721 m_data[1][0] = MOMENTUM_MATRIX4X4_INNER_PRODUCT(lhs, rhs, 1, 0);
722 m_data[1][1] = MOMENTUM_MATRIX4X4_INNER_PRODUCT(lhs, rhs, 1, 1);
723 m_data[1][2] = MOMENTUM_MATRIX4X4_INNER_PRODUCT(lhs, rhs, 1, 2);
724 m_data[1][3] = MOMENTUM_MATRIX4X4_INNER_PRODUCT(lhs, rhs, 1, 3);
726 m_data[2][0] = MOMENTUM_MATRIX4X4_INNER_PRODUCT(lhs, rhs, 2, 0);
727 m_data[2][1] = MOMENTUM_MATRIX4X4_INNER_PRODUCT(lhs, rhs, 2, 1);
728 m_data[2][2] = MOMENTUM_MATRIX4X4_INNER_PRODUCT(lhs, rhs, 2, 2);
729 m_data[2][3] = MOMENTUM_MATRIX4X4_INNER_PRODUCT(lhs, rhs, 2, 3);
731 m_data[3][0] = MOMENTUM_MATRIX4X4_INNER_PRODUCT(lhs, rhs, 3, 0);
732 m_data[3][1] = MOMENTUM_MATRIX4X4_INNER_PRODUCT(lhs, rhs, 3, 1);
733 m_data[3][2] = MOMENTUM_MATRIX4X4_INNER_PRODUCT(lhs, rhs, 3, 2);
734 m_data[3][3] = MOMENTUM_MATRIX4X4_INNER_PRODUCT(lhs, rhs, 3, 3);
744 for(
size_t col=0; col<4; ++col) {
745 t[0] = MOMENTUM_MATRIX4X4_INNER_PRODUCT( other, *
this, 0, col );
746 t[1] = MOMENTUM_MATRIX4X4_INNER_PRODUCT( other, *
this, 1, col );
747 t[2] = MOMENTUM_MATRIX4X4_INNER_PRODUCT( other, *
this, 2, col );
748 t[3] = MOMENTUM_MATRIX4X4_INNER_PRODUCT( other, *
this, 3, col );
749 m_data[0][col] = t[0];
750 m_data[1][col] = t[1];
751 m_data[2][col] = t[2];
752 m_data[3][col] = t[3];
762 for(
size_t row=0; row<4; ++row)
764 t[0] = MOMENTUM_MATRIX4X4_INNER_PRODUCT( *
this, other, row, 0 );
765 t[1] = MOMENTUM_MATRIX4X4_INNER_PRODUCT( *
this, other, row, 1 );
766 t[2] = MOMENTUM_MATRIX4X4_INNER_PRODUCT( *
this, other, row, 2 );
767 t[3] = MOMENTUM_MATRIX4X4_INNER_PRODUCT( *
this, other, row, 3 );
769 MOMENTUM_MATRIX4X4_SET_ROW(row, t[0], t[1], t[2], t[3] )
776 for (
unsigned i = 0; i < 3; ++i)
778 m_data[3][0] += v[i]*m_data[i][0];
779 m_data[3][1] += v[i]*m_data[i][1];
780 m_data[3][2] += v[i]*m_data[i][2];
781 m_data[3][3] += v[i]*m_data[i][3];
789 for (
unsigned i = 0; i < 3; ++i)
791 m_data[0][i] += v[i]*m_data[0][3];
792 m_data[1][i] += v[i]*m_data[1][3];
793 m_data[2][i] += v[i]*m_data[2][3];
794 m_data[3][i] += v[i]*m_data[3][3];
802 const int bitCompare = memcmp(m_data, m.m_data,
sizeof(m_data));
803 return (bitCompare == 0);
809 const int bitCompare = memcmp(m_data, m.m_data,
sizeof(m_data));
810 return (bitCompare != 0);
816 return m_data[row][col];
823 return m_data[row][col];
838 if (
this == &other )
887 (m_data[0][0] * vIn.
x() + m_data[1][0] * vIn.
y() + m_data[2][0] * vIn.
z()),
888 (m_data[0][1] * vIn.
x() + m_data[1][1] * vIn.
y() + m_data[2][1] * vIn.
z()),
889 (m_data[0][2] * vIn.
x() + m_data[1][2] * vIn.
y() + m_data[2][2] * vIn.
z()));
898 (m_data[0][0] * vIn.
x() + m_data[0][1] * vIn.
y() + m_data[0][2] * vIn.
z()),
899 (m_data[1][0] * vIn.
x() + m_data[1][1] * vIn.
y() + m_data[1][2] * vIn.
z()),
900 (m_data[2][0] * vIn.
x() + m_data[2][1] * vIn.
y() + m_data[2][2] * vIn.
z()));
907 double d = double(1.0) / ( m_data[3][0] * v.
x() + m_data[3][1] * v.
y() + m_data[3][2] * v.
z() + double(1.0) ) ;
908 return Vec3( ( m_data[0][0]*v.
x() + m_data[0][1]*v.
y() + m_data[0][2]*v.
z() ) *d,
909 ( m_data[1][0]*v.
x() + m_data[1][1]*v.
y() + m_data[1][2]*v.
z() ) *d,
910 ( m_data[2][0]*v.
x() + m_data[2][1]*v.
y() + m_data[2][2]*v.
z() ) *d ) ;
917 ( m_data[0][0]*v.
x() + m_data[1][0]*v.
y() + m_data[2][0]*v.
z() + m_data[3][0] ),
918 ( m_data[0][1]*v.
x() + m_data[1][1]*v.
y() + m_data[2][1]*v.
z() + m_data[3][1] ),
919 ( m_data[0][2]*v.
x() + m_data[1][2]*v.
y() + m_data[2][2]*v.
z() + m_data[3][2] ) );
926 ( m_data[0][0]*v.
x() + m_data[0][1]*v.
y() + m_data[0][2]*v.
z() + m_data[0][3]*v.
w() ),
927 ( m_data[1][0]*v.
x() + m_data[1][1]*v.
y() + m_data[1][2]*v.
z() + m_data[1][3]*v.
w() ),
928 ( m_data[2][0]*v.
x() + m_data[2][1]*v.
y() + m_data[2][2]*v.
z() + m_data[2][3]*v.
w() ),
929 ( m_data[3][0]*v.
x() + m_data[3][1]*v.
y() + m_data[3][2]*v.
z() + m_data[3][3]*v.
w() ) ) ;
936 ( m_data[0][0]*v.
x() + m_data[1][0]*v.
y() + m_data[2][0]*v.
z() + m_data[3][0]*v.
w() ),
937 ( m_data[0][1]*v.
x() + m_data[1][1]*v.
y() + m_data[2][1]*v.
z() + m_data[3][1]*v.
w() ),
938 ( m_data[0][2]*v.
x() + m_data[1][2]*v.
y() + m_data[2][2]*v.
z() + m_data[3][2]*v.
w() ),
939 ( m_data[0][3]*v.
x() + m_data[1][3]*v.
y() + m_data[2][3]*v.
z() + m_data[3][3]*v.
w() ) );
946 return Matrix4x4( m_data[0][0], m_data[1][0], m_data[2][0], m_data[3][0],
947 m_data[0][1], m_data[1][1], m_data[2][1], m_data[3][1],
948 m_data[0][2], m_data[1][2], m_data[2][2], m_data[3][2],
949 m_data[0][3], m_data[1][3], m_data[2][3], m_data[3][3]);
965 agx::equivalent(a(0, 0), b(0, 0), epsilon) &&
966 agx::equivalent(a(0, 1), b(0, 1), epsilon) &&
967 agx::equivalent(a(0, 2), b(0, 2), epsilon) &&
968 agx::equivalent(a(0, 3), b(0, 3), epsilon) &&
969 agx::equivalent(a(1, 0), b(1, 0), epsilon) &&
970 agx::equivalent(a(1, 1), b(1, 1), epsilon) &&
971 agx::equivalent(a(1, 2), b(1, 2), epsilon) &&
972 agx::equivalent(a(1, 3), b(1, 3), epsilon) &&
973 agx::equivalent(a(2, 0), b(2, 0), epsilon) &&
974 agx::equivalent(a(2, 1), b(2, 1), epsilon) &&
975 agx::equivalent(a(2, 2), b(2, 2), epsilon) &&
976 agx::equivalent(a(2, 3), b(2, 3), epsilon) &&
977 agx::equivalent(a(3, 0), b(3, 0), epsilon) &&
978 agx::equivalent(a(3, 1), b(3, 1), epsilon) &&
979 agx::equivalent(a(3, 2), b(3, 2), epsilon) &&
980 agx::equivalent(a(3, 3), b(3, 3), epsilon);
This class provides conversion services between Euler angles in any of the 24 conventions and corresp...
Definition: EulerAngles.h:64
Matrix class for affine transformations.
Definition: Matrix4x4.h:51
Matrix4x4 operator=(const Matrix4x4 &rhs)
Definition: Matrix4x4.h:827
static Matrix4x4 crossMatrix(const Vec3 &vec)
Generates a new matrix of a specific type.
Definition: Matrix4x4.h:635
Matrix4x4 set(double const *const ptr)
Definition: Matrix4x4.h:463
double * ptr()
Definition: Matrix4x4.h:615
bool isRigidTransformation() const
Definition: Matrix4x4.h:433
void mult(const Matrix4x4 &, const Matrix4x4 &)
Definition: Matrix4x4.h:700
~Matrix4x4()
Destructor.
Definition: Matrix4x4.h:385
Matrix4x4 addTranslate(const Vec3 &t)
Definition: Matrix4x4.h:569
void setCol(size_t col, const Vec4 &vec)
Definition: Matrix4x4.h:164
Matrix4x4 setIdentity()
Definition: Matrix4x4.h:590
double & operator()(size_t row, size_t col)
Definition: Matrix4x4.h:814
void setRow(size_t row, const Vec4 &vec)
Set the row of the matrix,.
Definition: Matrix4x4.h:157
Matrix4x4 transpose() const
Definition: Matrix4x4.h:944
Vec4 getCol(size_t col) const
Definition: Matrix4x4.h:181
void operator*=(const Matrix4x4 &other)
Definition: Matrix4x4.h:836
Vec3 transform3x3Inv(const Vec3 &vIn) const
Definition: Matrix4x4.h:894
static Matrix4x4 rotate(const Vec3 &from, const Vec3 &to)
Definition: Matrix4x4.h:661
Matrix4x4 setRotate(const EulerAngles &euler)
Vec3 transform3x3(const Vec3 &vIn) const
Definition: Matrix4x4.h:883
static Matrix4x4 translate(const Vec3 &dv)
Definition: Matrix4x4.h:645
bool isFinite() const
Definition: Matrix4x4.h:414
Matrix4x4 preMultTranslate(const Vec3 &v)
Definition: Matrix4x4.h:774
Matrix4x4()
Creates a new matrix, initialized to be an identity matrix.
Definition: Matrix4x4.h:309
bool valid() const
Definition: Matrix4x4.h:393
bool operator!=(const Matrix4x4 &m) const
Definition: Matrix4x4.h:807
bool isIdentity() const
Definition: Matrix4x4.h:427
Matrix4x4 setTranslate(const Vec3 &t)
Definition: Matrix4x4.h:549
Vec4 getRow(size_t row) const
Definition: Matrix4x4.h:171
Matrix4x4 set(const EulerAngles &e)
bool operator==(const Matrix4x4 &m) const
Definition: Matrix4x4.h:800
bool isNaN() const
Definition: Matrix4x4.h:400
Vec3 preMult(const Vec3 &v) const
Definition: Matrix4x4.h:914
Vec3 operator*(const Vec3 &v) const
Definition: Matrix4x4.h:855
Vec3 postMult(const Vec3 &v) const
Definition: Matrix4x4.h:905
Matrix4x4 postMultTranslate(const Vec3 &v)
Definition: Matrix4x4.h:787
Matrix4x4 inverse() const
Matrix inverse.
Definition: Matrix4x4.h:954
Quat getRotate() const
Definition: Matrix4x4.h:608
Matrix4x4 setRotate(const Quat &q)
Vec3 getTranslate() const
Definition: Matrix4x4.h:601
EulerAngles getAsEulerAngles() const
The object holding quaternions and providing operations on these.
Definition: Quat.h:55
void setRotate(double angle, double x, double y, double z)
Set the rotation of the Quaternion as a rotation angle radians around the vector (x,...
A 3 dimensional vector which can be used to define a point or a vector and contains basic arithmetic.
Definition: Vec3.h:40
double y() const
Definition: Vec3.h:497
void set(double x, double y, double z)
Set the value of this vector with the specified elements.
Definition: Vec3.h:457
double z() const
Definition: Vec3.h:503
double x() const
Definition: Vec3.h:491
A 4 dimensional vector and contains basic arithmetic.
Definition: Vec4.h:33
double z() const
Definition: Vec4.h:466
double w() const
Definition: Vec4.h:472
double y() const
Definition: Vec4.h:461
double x() const
Definition: Vec4.h:455
Namespace for Momentum Scripting API.
Definition: AffineMatrix4x4.h:29
std::ostream & operator<<(std::ostream &os, const EulerAngles &e)
Definition: EulerAngles.h:358
Vec3 operator*(const Vec3 &v, const Matrix3x3 &m)
Definition: Matrix3x3.h:746
bool equivalent(const Matrix3x3 &a, const Matrix3x3 &b, double epsilon=1e-6)
Definition: Matrix3x3.h:905