28 #ifndef PXR_BASE_GF_MATRIX4F_H 29 #define PXR_BASE_GF_MATRIX4F_H 35 #include "pxr/base/gf/api.h" 37 #include "pxr/base/gf/matrixData.h" 39 #include "pxr/base/gf/traits.h" 49 PXR_NAMESPACE_OPEN_SCOPE
90 typedef float ScalarType;
92 static const size_t numRows = 4;
93 static const size_t numColumns = 4;
102 float m10,
float m11,
float m12,
float m13,
103 float m20,
float m21,
float m22,
float m23,
104 float m30,
float m31,
float m32,
float m33) {
105 Set(m00, m01, m02, m03,
136 explicit GfMatrix4f(
const std::vector< std::vector<double> >& v);
145 explicit GfMatrix4f(
const std::vector< std::vector<float> >& v);
154 explicit GfMatrix4f(
const std::vector<double>& r0,
155 const std::vector<double>& r1,
156 const std::vector<double>& r2,
157 const std::vector<double>& r3);
166 explicit GfMatrix4f(
const std::vector<float>& r0,
167 const std::vector<float>& r1,
168 const std::vector<float>& r2,
169 const std::vector<float>& r3);
204 return GfVec4f(_mtx[i][0], _mtx[i][1], _mtx[i][2], _mtx[i][3]);
209 return GfVec4f(_mtx[0][i], _mtx[1][i], _mtx[2][i], _mtx[3][i]);
216 float m10,
float m11,
float m12,
float m13,
217 float m20,
float m21,
float m22,
float m23,
218 float m30,
float m31,
float m32,
float m33) {
219 _mtx[0][0] = m00; _mtx[0][1] = m01; _mtx[0][2] = m02; _mtx[0][3] = m03;
220 _mtx[1][0] = m10; _mtx[1][1] = m11; _mtx[1][2] = m12; _mtx[1][3] = m13;
221 _mtx[2][0] = m20; _mtx[2][1] = m21; _mtx[2][2] = m22; _mtx[2][3] = m23;
222 _mtx[3][0] = m30; _mtx[3][1] = m31; _mtx[3][2] = m32; _mtx[3][3] = m33;
229 _mtx[0][0] = m[0][0];
230 _mtx[0][1] = m[0][1];
231 _mtx[0][2] = m[0][2];
232 _mtx[0][3] = m[0][3];
233 _mtx[1][0] = m[1][0];
234 _mtx[1][1] = m[1][1];
235 _mtx[1][2] = m[1][2];
236 _mtx[1][3] = m[1][3];
237 _mtx[2][0] = m[2][0];
238 _mtx[2][1] = m[2][1];
239 _mtx[2][2] = m[2][2];
240 _mtx[2][3] = m[2][3];
241 _mtx[3][0] = m[3][0];
242 _mtx[3][1] = m[3][1];
243 _mtx[3][2] = m[3][2];
244 _mtx[3][3] = m[3][3];
269 float*
Get(
float m[4][4])
const;
338 return !(*
this == m);
344 return !(*
this == m);
373 return GfVec3f(_mtx[i][0], _mtx[i][1], _mtx[i][2]);
380 return _GetDeterminant3(0, 1, 2, 0, 1, 2);
494 return GfVec4f(vec[0] * m._mtx[0][0] + vec[1] * m._mtx[0][1] + vec[2] * m._mtx[0][2] + vec[3] * m._mtx[0][3],
495 vec[0] * m._mtx[1][0] + vec[1] * m._mtx[1][1] + vec[2] * m._mtx[1][2] + vec[3] * m._mtx[1][3],
496 vec[0] * m._mtx[2][0] + vec[1] * m._mtx[2][1] + vec[2] * m._mtx[2][2] + vec[3] * m._mtx[2][3],
497 vec[0] * m._mtx[3][0] + vec[1] * m._mtx[3][1] + vec[2] * m._mtx[3][2] + vec[3] * m._mtx[3][3]);
502 return GfVec4f(vec[0] * m._mtx[0][0] + vec[1] * m._mtx[1][0] + vec[2] * m._mtx[2][0] + vec[3] * m._mtx[3][0],
503 vec[0] * m._mtx[0][1] + vec[1] * m._mtx[1][1] + vec[2] * m._mtx[2][1] + vec[3] * m._mtx[3][1],
504 vec[0] * m._mtx[0][2] + vec[1] * m._mtx[1][2] + vec[2] * m._mtx[2][2] + vec[3] * m._mtx[3][2],
505 vec[0] * m._mtx[0][3] + vec[1] * m._mtx[1][3] + vec[2] * m._mtx[2][3] + vec[3] * m._mtx[3][3]);
614 float eps = 1e-5)
const;
619 return GfVec3f(_mtx[3][0], _mtx[3][1], _mtx[3][2]);
661 vec[0] * _mtx[0][0] + vec[1] * _mtx[1][0] + vec[2] * _mtx[2][0] + _mtx[3][0],
662 vec[0] * _mtx[0][1] + vec[1] * _mtx[1][1] + vec[2] * _mtx[2][1] + _mtx[3][1],
663 vec[0] * _mtx[0][2] + vec[1] * _mtx[1][2] + vec[2] * _mtx[2][2] + _mtx[3][2],
664 vec[0] * _mtx[0][3] + vec[1] * _mtx[1][3] + vec[2] * _mtx[2][3] + _mtx[3][3]));
673 vec[0] * _mtx[0][0] + vec[1] * _mtx[1][0] + vec[2] * _mtx[2][0] + _mtx[3][0],
674 vec[0] * _mtx[0][1] + vec[1] * _mtx[1][1] + vec[2] * _mtx[2][1] + _mtx[3][1],
675 vec[0] * _mtx[0][2] + vec[1] * _mtx[1][2] + vec[2] * _mtx[2][2] + _mtx[3][2],
676 vec[0] * _mtx[0][3] + vec[1] * _mtx[1][3] + vec[2] * _mtx[2][3] + _mtx[3][3])));
685 vec[0] * _mtx[0][0] + vec[1] * _mtx[1][0] + vec[2] * _mtx[2][0],
686 vec[0] * _mtx[0][1] + vec[1] * _mtx[1][1] + vec[2] * _mtx[2][1],
687 vec[0] * _mtx[0][2] + vec[1] * _mtx[1][2] + vec[2] * _mtx[2][2]);
698 vec[0] * _mtx[0][0] + vec[1] * _mtx[1][0] + vec[2] * _mtx[2][0],
699 vec[0] * _mtx[0][1] + vec[1] * _mtx[1][1] + vec[2] * _mtx[2][1],
700 vec[0] * _mtx[0][2] + vec[1] * _mtx[1][2] + vec[2] * _mtx[2][2]);
709 vec[0] * _mtx[0][0] + vec[1] * _mtx[1][0] + vec[2] * _mtx[2][0] + _mtx[3][0],
710 vec[0] * _mtx[0][1] + vec[1] * _mtx[1][1] + vec[2] * _mtx[2][1] + _mtx[3][1],
711 vec[0] * _mtx[0][2] + vec[1] * _mtx[1][2] + vec[2] * _mtx[2][2] + _mtx[3][2]);
720 vec[0] * _mtx[0][0] + vec[1] * _mtx[1][0] + vec[2] * _mtx[2][0] + _mtx[3][0],
721 vec[0] * _mtx[0][1] + vec[1] * _mtx[1][1] + vec[2] * _mtx[2][1] + _mtx[3][1],
722 vec[0] * _mtx[0][2] + vec[1] * _mtx[1][2] + vec[2] * _mtx[2][2] + _mtx[3][2]);
730 double _GetDeterminant3(
size_t row1,
size_t row2,
size_t row3,
731 size_t col1,
size_t col2,
size_t col3)
const;
734 void _Jacobi3(
GfVec3d *eigenvalues,
GfVec3d eigenvectors[3])
const;
738 void _SetRotateFromQuat(
float r,
const GfVec3f& i);
760 PXR_NAMESPACE_CLOSE_SCOPE
762 #endif // PXR_BASE_GF_MATRIX4F_H GfVec3f GfProject(const GfVec4f &v)
Projects homogeneous v into Euclidean space and returns the result as a Vec3f.
GF_API GfMatrix4f & operator *=(const GfMatrix4f &m)
Post-multiplies matrix m into this matrix.
GF_API GfMatrix4f & SetTranslateOnly(const GfVec3f &t)
Sets matrix to specify a translation by the vector trans, without clearing the rotation.
GF_API GfMatrix4f GetOrthonormalized(bool issueWarning=true) const
Returns an orthonormalized copy of the matrix.
bool IsLeftHanded() const
Returns true if the vectors in the upper 3x3 matrix form a left-handed coordinate system.
Stores a 4x4 matrix of float elements.
float * operator [](int i)
Accesses an indexed row i of the matrix as an array of 4 float values so that standard indexing (such...
friend GfVec4f operator *(const GfMatrix4f &m, const GfVec4f &vec)
Returns the product of a matrix m and a column vector vec.
GfVec3f GetRow3(int i) const
Gets a row of the matrix as a Vec3.
const float * GetArray() const
Returns vector components as a const array of float values.
bool HasOrthogonalRows3() const
Returns true, if the row vectors of the upper 3x3 matrix form an orthogonal basis.
friend GfMatrix4f operator+(const GfMatrix4f &m1, const GfMatrix4f &m2)
Adds matrix m2 to m1.
GF_API double GetDeterminant() const
Returns the determinant of the matrix.
GF_API double GetHandedness() const
Returns the sign of the determinant of the upper 3x3 matrix, i.e.
friend GfMatrix4f operator -(const GfMatrix4f &m1, const GfMatrix4f &m2)
Subtracts matrix m2 from m1.
GfVec3f Transform(const GfVec3f &vec) const
Transforms the row vector vec by the matrix, returning the result.
Assorted mathematical utility functions.
GF_API GfMatrix4f & SetTranslate(const GfVec3f &trans)
Sets matrix to specify a translation by the vector trans, and clears the rotation.
float * data()
Returns raw access to components of matrix as an array of float values.
Basic type for a vector of 3 float components.
Basic type for a vector of 4 double components.
GfVec4f GetColumn(int i) const
Gets a column of the matrix as a Vec4.
double GfAbs(double f)
Return abs(f).
GfVec3f TransformAffine(const GfVec3f &vec) const
Transforms the row vector vec by the matrix, returning the result.
GF_API GfMatrix4f & SetLookAt(const GfVec3f &eyePoint, const GfVec3f ¢erPoint, const GfVec3f &upDirection)
Sets the matrix to specify a viewing matrix from parameters similar to those used by gluLookAt(3G).
GfVec3d Transform(const GfVec3d &vec) const
Transforms the row vector vec by the matrix, returning the result.
GfVec3d TransformDir(const GfVec3d &vec) const
Transforms row vector vec by the matrix, returning the result.
Basic type: a quaternion, a complex number with a real coefficient and three imaginary coefficients,...
void SetColumn(int i, const GfVec4f &v)
Sets a column of the matrix from a Vec4.
GF_API bool operator==(const GfMatrix4d &m) const
Tests for element-wise matrix equality.
#define GF_MIN_ORTHO_TOLERANCE
This constant is used to determine when a set of basis vectors is close to orthogonal.
GF_API GfMatrix4f GetInverse(double *det=NULL, double eps=0) const
Returns the inverse of the matrix, or FLT_MAX * SetIdentity() if the matrix is singular.
GF_API GfMatrix4f & SetRotate(const GfQuatf &rot)
Sets the matrix to specify a rotation equivalent to rot, and clears the translation.
GF_API GfVec3f DecomposeRotation(const GfVec3f &axis0, const GfVec3f &axis1, const GfVec3f &axis2) const
Decompose the rotation corresponding to this matrix about 3 orthogonal axes.
bool IsRightHanded() const
Returns true if the vectors in the upper 3x3 matrix form a right-handed coordinate system.
GF_API std::ostream & operator<<(std::ostream &, GfMatrix4f const &)
Output a GfMatrix4f.
Stores a 3x3 matrix of float elements.
static size_t Combine(Args &&... args)
Produce a hash code by combining the hash codes of several objects.
GfMatrix4f(const float m[4][4])
Constructor.
GF_API GfMatrix4f RemoveScaleShear() const
Returns the matrix with any scaling or shearing removed, leaving only the rotation and translation.
GF_API GfMatrix4f & SetDiagonal(float s)
Sets the matrix to s times the identity matrix.
GfMatrix4f()=default
Default constructor. Leaves the matrix component values undefined.
friend GfMatrix4f operator *(const GfMatrix4f &m1, double d)
Returns the product of a matrix and a float.
T * GetData()
Return a pointer to the start of all the data.
Stores a 4x4 matrix of double elements.
A metafunction with a static const bool member 'value' that is true for GfMatrix types,...
friend size_t hash_value(GfMatrix4f const &m)
Hash.
GF_API GfRotation ExtractRotation() const
Returns the rotation corresponding to this matrix.
GF_API GfMatrix4f & SetScale(float scaleFactor)
Sets matrix to specify a uniform scaling by scaleFactor.
GfVec3f ExtractTranslation() const
Returns the translation part of the matrix, defined as the first three elements of the last row.
Utility functions for GfVec4f and GfVec4d as homogeneous vectors.
GF_API GfMatrix4f & operator+=(const GfMatrix4f &m)
Adds matrix m to this matrix.
GfMatrix4f & Set(const float m[4][4])
Sets the matrix from a 4x4 array of float values, specified in row-major order.
double GfDot(const GfDualQuatd &dq1, const GfDualQuatd &dq2)
Return the dot (inner) product of two dual quaternions.
GF_API GfMatrix4f & operator -=(const GfMatrix4f &m)
Subtracts matrix m from this matrix.
GF_API GfMatrix3f ExtractRotationMatrix() const
Returns the rotation corresponding to this matrix.
GfMatrix4f(float m00, float m01, float m02, float m03, float m10, float m11, float m12, float m13, float m20, float m21, float m22, float m23, float m30, float m31, float m32, float m33)
Constructor.
GF_API GfQuatf ExtractRotationQuat() const
Return the rotation corresponding to this matrix as a quaternion.
GF_API float * Get(float m[4][4]) const
Fills a 4x4 array of float values with the values in the matrix, specified in row-major order.
Basic type for a vector of 4 float components.
float * GetArray()
Returns vector components as an array of float values.
friend GfVec4f operator *(const GfVec4f &vec, const GfMatrix4f &m)
Returns the product of row vector vec and a matrix m.
const float * data() const
Returns const raw access to components of matrix as an array of float values.
GfMatrix4f(float s)
Constructor.
GfMatrix4f & SetIdentity()
Sets the matrix to the identity matrix.
GF_API bool Orthonormalize(bool issueWarning=true)
Makes the matrix orthonormal in place.
friend GfMatrix4f operator/(const GfMatrix4f &m1, const GfMatrix4f &m2)
Divides matrix m1 by m2 (that is, m1 * inv(m2)).
bool operator !=(const GfMatrix4f &m) const
Tests for element-wise matrix inequality.
void SetRow(int i, const GfVec4f &v)
Sets a row of the matrix from a Vec4.
bool operator !=(const GfMatrix4d &m) const
Tests for element-wise matrix inequality.
GF_API bool GfIsClose(GfMatrix4f const &m1, GfMatrix4f const &m2, double tolerance)
Tests for equality within a given tolerance, returning true if the difference between each component ...
Basic type for a vector of 3 double components.
Defines useful mathematical limits.
GF_API GfMatrix4f GetTranspose() const
Returns the transpose of the matrix.
GfMatrix4f & Set(float m00, float m01, float m02, float m03, float m10, float m11, float m12, float m13, float m20, float m21, float m22, float m23, float m30, float m31, float m32, float m33)
Sets the matrix from 16 independent float values, specified in row-major order.
friend GfMatrix4f operator *(const GfMatrix4f &m1, const GfMatrix4f &m2)
Multiplies matrix m1 by m2.
GF_API GfMatrix4f & SetRotateOnly(const GfQuatf &rot)
Sets the matrix to specify a rotation equivalent to rot, without clearing the translation.
GfVec3d TransformAffine(const GfVec3d &vec) const
Transforms the row vector vec by the matrix, returning the result.
GF_API GfMatrix4f & SetTransform(const GfRotation &rotate, const GfVec3f &translate)
Sets matrix to specify a rotation by rotate and a translation by translate.
GfMatrix4f(const GfVec4f &v)
Constructor.
GF_API bool Factor(GfMatrix4f *r, GfVec3f *s, GfMatrix4f *u, GfVec3f *t, GfMatrix4f *p, float eps=1e-5) const
Factors the matrix into 5 components:
Basic type: 3-space rotation specification.
void SetRow3(int i, const GfVec3f &v)
Sets a row of the matrix from a Vec3.
GfVec4f GetRow(int i) const
Gets a row of the matrix as a Vec4.
double GetDeterminant3() const
Returns the determinant of the upper 3x3 matrix.
GF_API friend GfMatrix4f operator -(const GfMatrix4f &m)
Returns the unary negation of matrix m.
GfVec3f TransformDir(const GfVec3f &vec) const
Transforms row vector vec by the matrix, returning the result.
const float * operator [](int i) const
Accesses an indexed row i of the matrix as an array of 4 float values so that standard indexing (such...
GfMatrix4f & SetZero()
Sets the matrix to zero.