11#ifndef PXR_BASE_GF_MATRIX4D_H
12#define PXR_BASE_GF_MATRIX4D_H
18#include "pxr/base/gf/api.h"
20#include "pxr/base/gf/matrixData.h"
22#include "pxr/base/gf/traits.h"
32PXR_NAMESPACE_OPEN_SCOPE
73 typedef double ScalarType;
75 static const size_t numRows = 4;
76 static const size_t numColumns = 4;
84 GfMatrix4d(
double m00,
double m01,
double m02,
double m03,
85 double m10,
double m11,
double m12,
double m13,
86 double m20,
double m21,
double m22,
double m23,
87 double m30,
double m31,
double m32,
double m33) {
88 Set(m00, m01, m02, m03,
119 explicit GfMatrix4d(
const std::vector< std::vector<double> >& v);
128 explicit GfMatrix4d(
const std::vector< std::vector<float> >& v);
138 const std::vector<double>& r1,
139 const std::vector<double>& r2,
140 const std::vector<double>& r3);
150 const std::vector<float>& r1,
151 const std::vector<float>& r2,
152 const std::vector<float>& r3);
187 return GfVec4d(_mtx[i][0], _mtx[i][1], _mtx[i][2], _mtx[i][3]);
192 return GfVec4d(_mtx[0][i], _mtx[1][i], _mtx[2][i], _mtx[3][i]);
199 double m10,
double m11,
double m12,
double m13,
200 double m20,
double m21,
double m22,
double m23,
201 double m30,
double m31,
double m32,
double m33) {
202 _mtx[0][0] = m00; _mtx[0][1] = m01; _mtx[0][2] = m02; _mtx[0][3] = m03;
203 _mtx[1][0] = m10; _mtx[1][1] = m11; _mtx[1][2] = m12; _mtx[1][3] = m13;
204 _mtx[2][0] = m20; _mtx[2][1] = m21; _mtx[2][2] = m22; _mtx[2][3] = m23;
205 _mtx[3][0] = m30; _mtx[3][1] = m31; _mtx[3][2] = m32; _mtx[3][3] = m33;
212 _mtx[0][0] = m[0][0];
213 _mtx[0][1] = m[0][1];
214 _mtx[0][2] = m[0][2];
215 _mtx[0][3] = m[0][3];
216 _mtx[1][0] = m[1][0];
217 _mtx[1][1] = m[1][1];
218 _mtx[1][2] = m[1][2];
219 _mtx[1][3] = m[1][3];
220 _mtx[2][0] = m[2][0];
221 _mtx[2][1] = m[2][1];
222 _mtx[2][2] = m[2][2];
223 _mtx[2][3] = m[2][3];
224 _mtx[3][0] = m[3][0];
225 _mtx[3][1] = m[3][1];
226 _mtx[3][2] = m[3][2];
227 _mtx[3][3] = m[3][3];
252 double*
Get(
double m[4][4])
const;
321 return !(*
this == m);
327 return !(*
this == m);
356 return GfVec3d(_mtx[i][0], _mtx[i][1], _mtx[i][2]);
363 return _GetDeterminant3(0, 1, 2, 0, 1, 2);
477 return GfVec4d(vec[0] * m._mtx[0][0] + vec[1] * m._mtx[0][1] + vec[2] * m._mtx[0][2] + vec[3] * m._mtx[0][3],
478 vec[0] * m._mtx[1][0] + vec[1] * m._mtx[1][1] + vec[2] * m._mtx[1][2] + vec[3] * m._mtx[1][3],
479 vec[0] * m._mtx[2][0] + vec[1] * m._mtx[2][1] + vec[2] * m._mtx[2][2] + vec[3] * m._mtx[2][3],
480 vec[0] * m._mtx[3][0] + vec[1] * m._mtx[3][1] + vec[2] * m._mtx[3][2] + vec[3] * m._mtx[3][3]);
485 return GfVec4d(vec[0] * m._mtx[0][0] + vec[1] * m._mtx[1][0] + vec[2] * m._mtx[2][0] + vec[3] * m._mtx[3][0],
486 vec[0] * m._mtx[0][1] + vec[1] * m._mtx[1][1] + vec[2] * m._mtx[2][1] + vec[3] * m._mtx[3][1],
487 vec[0] * m._mtx[0][2] + vec[1] * m._mtx[1][2] + vec[2] * m._mtx[2][2] + vec[3] * m._mtx[3][2],
488 vec[0] * m._mtx[0][3] + vec[1] * m._mtx[1][3] + vec[2] * m._mtx[2][3] + vec[3] * m._mtx[3][3]);
597 double eps = 1e-10)
const;
602 return GfVec3d(_mtx[3][0], _mtx[3][1], _mtx[3][2]);
644 vec[0] * _mtx[0][0] + vec[1] * _mtx[1][0] + vec[2] * _mtx[2][0] + _mtx[3][0],
645 vec[0] * _mtx[0][1] + vec[1] * _mtx[1][1] + vec[2] * _mtx[2][1] + _mtx[3][1],
646 vec[0] * _mtx[0][2] + vec[1] * _mtx[1][2] + vec[2] * _mtx[2][2] + _mtx[3][2],
647 vec[0] * _mtx[0][3] + vec[1] * _mtx[1][3] + vec[2] * _mtx[2][3] + _mtx[3][3]));
656 vec[0] * _mtx[0][0] + vec[1] * _mtx[1][0] + vec[2] * _mtx[2][0],
657 vec[0] * _mtx[0][1] + vec[1] * _mtx[1][1] + vec[2] * _mtx[2][1],
658 vec[0] * _mtx[0][2] + vec[1] * _mtx[1][2] + vec[2] * _mtx[2][2]);
667 vec[0] * _mtx[0][0] + vec[1] * _mtx[1][0] + vec[2] * _mtx[2][0] + _mtx[3][0],
668 vec[0] * _mtx[0][1] + vec[1] * _mtx[1][1] + vec[2] * _mtx[2][1] + _mtx[3][1],
669 vec[0] * _mtx[0][2] + vec[1] * _mtx[1][2] + vec[2] * _mtx[2][2] + _mtx[3][2]);
677 double _GetDeterminant3(
size_t row1,
size_t row2,
size_t row3,
678 size_t col1,
size_t col2,
size_t col3)
const;
681 void _Jacobi3(
GfVec3d *eigenvalues,
GfVec3d eigenvectors[3])
const;
685 void _SetRotateFromQuat(
double r,
const GfVec3d& i);
707PXR_NAMESPACE_CLOSE_SCOPE
Stores a 3x3 matrix of double elements.
Stores a 4x4 matrix of double elements.
GF_API GfMatrix4d & operator*=(const GfMatrix4d &m)
Post-multiplies matrix m into this matrix.
GF_API GfMatrix4d GetTranspose() const
Returns the transpose of the matrix.
GF_API GfMatrix4d & SetTranslateOnly(const GfVec3d &t)
Sets matrix to specify a translation by the vector trans, without clearing the rotation.
bool HasOrthogonalRows3() const
Returns true, if the row vectors of the upper 3x3 matrix form an orthogonal basis.
GfVec3d Transform(const GfVec3d &vec) const
Transforms the row vector vec by the matrix, returning the result.
friend GfMatrix4d operator*(const GfMatrix4d &m1, double d)
Returns the product of a matrix and a double.
GF_API GfMatrix4d & operator-=(const GfMatrix4d &m)
Subtracts matrix m from this matrix.
GF_API GfMatrix4d & SetRotate(const GfMatrix3d &mx)
Sets the matrix to specify a rotation equivalent to mx, and clears the translation.
friend GfMatrix4d operator/(const GfMatrix4d &m1, const GfMatrix4d &m2)
Divides matrix m1 by m2 (that is, m1 * inv(m2)).
void SetRow3(int i, const GfVec3d &v)
Sets a row of the matrix from a Vec3.
GF_API GfMatrix4d & SetDiagonal(double s)
Sets the matrix to s times the identity matrix.
const double * data() const
Returns const raw access to components of matrix as an array of double values.
GfMatrix4d(double m00, double m01, double m02, double m03, double m10, double m11, double m12, double m13, double m20, double m21, double m22, double m23, double m30, double m31, double m32, double m33)
Constructor.
GF_API GfMatrix4d & SetRotateOnly(const GfMatrix3d &mx)
Sets the matrix to specify a rotation equivalent to mx, without clearing the translation.
GF_API GfMatrix4d & SetScale(double scaleFactor)
Sets matrix to specify a uniform scaling by scaleFactor.
GF_API GfMatrix3d ExtractRotationMatrix() const
Returns the rotation corresponding to this matrix.
friend size_t hash_value(GfMatrix4d const &m)
Hash.
GfVec3d TransformDir(const GfVec3d &vec) const
Transforms row vector vec by the matrix, returning the result.
GfMatrix4d()=default
Default constructor. Leaves the matrix component values undefined.
GF_API GfMatrix4d & SetRotate(const GfRotation &rot)
Sets the matrix to specify a rotation equivalent to rot, and clears the translation.
GF_API GfMatrix4d(const GfRotation &rotate, const GfVec3d &translate)
Constructor.
GfVec3d GetRow3(int i) const
Gets a row of the matrix as a Vec3.
GfMatrix4d & Set(const double m[4][4])
Sets the matrix from a 4x4 array of double values, specified in row-major order.
GfVec3d ExtractTranslation() const
Returns the translation part of the matrix, defined as the first three elements of the last row.
GF_API GfMatrix4d & SetDiagonal(const GfVec4d &)
Sets the matrix to have diagonal (v[0], v[1], v[2], v[3]).
GF_API GfMatrix4d(const std::vector< float > &r0, const std::vector< float > &r1, const std::vector< float > &r2, const std::vector< float > &r3)
Constructor.
GF_API GfMatrix4d RemoveScaleShear() const
Returns the matrix with any scaling or shearing removed, leaving only the rotation and translation.
GfVec4d GetColumn(int i) const
Gets a column of the matrix as a Vec4.
GF_API GfMatrix4d & SetRotateOnly(const GfQuatd &rot)
Sets the matrix to specify a rotation equivalent to rot, without clearing the translation.
GF_API double GetDeterminant() const
Returns the determinant of the matrix.
void SetColumn(int i, const GfVec4d &v)
Sets a column of the matrix from a Vec4.
GF_API GfMatrix4d & SetScale(const GfVec3d &scaleFactors)
Sets the matrix to specify a nonuniform scaling in x, y, and z by the factors in vector scaleFactors.
double * operator[](int i)
Accesses an indexed row i of the matrix as an array of 4 double values so that standard indexing (suc...
GfMatrix4d & SetIdentity()
Sets the matrix to the identity matrix.
bool operator!=(const GfMatrix4d &m) const
Tests for element-wise matrix inequality.
GF_API GfMatrix4d(const std::vector< double > &r0, const std::vector< double > &r1, const std::vector< double > &r2, const std::vector< double > &r3)
Constructor.
GF_API GfMatrix4d(const std::vector< std::vector< double > > &v)
Constructor.
GfMatrix4d & Set(double m00, double m01, double m02, double m03, double m10, double m11, double m12, double m13, double m20, double m21, double m22, double m23, double m30, double m31, double m32, double m33)
Sets the matrix from 16 independent double values, specified in row-major order.
GF_API bool operator==(const GfMatrix4d &m) const
Tests for element-wise matrix equality.
GF_API double GetHandedness() const
Returns the sign of the determinant of the upper 3x3 matrix, i.e.
GF_API GfMatrix4d & SetTranslate(const GfVec3d &trans)
Sets matrix to specify a translation by the vector trans, and clears the rotation.
double * GetArray()
Returns vector components as an array of double values.
friend GfMatrix4d operator+(const GfMatrix4d &m1, const GfMatrix4d &m2)
Adds matrix m2 to m1.
GF_API double * Get(double m[4][4]) const
Fills a 4x4 array of double values with the values in the matrix, specified in row-major order.
GF_API GfMatrix4d & operator+=(const GfMatrix4d &m)
Adds matrix m to this matrix.
double * data()
Returns raw access to components of matrix as an array of double values.
void SetRow(int i, const GfVec4d &v)
Sets a row of the matrix from a Vec4.
GfMatrix4d(const double m[4][4])
Constructor.
GF_API GfMatrix4d(const class GfMatrix4f &m)
This explicit constructor converts a "float" matrix to a "double" matrix.
GF_API GfMatrix4d GetInverse(double *det=NULL, double eps=0) const
Returns the inverse of the matrix, or FLT_MAX * SetIdentity() if the matrix is singular.
GfMatrix4d(const GfVec4d &v)
Constructor.
GfVec4d GetRow(int i) const
Gets a row of the matrix as a Vec4.
GF_API GfMatrix4d(const std::vector< std::vector< float > > &v)
Constructor.
GfMatrix4d(double s)
Constructor.
GfVec3d TransformAffine(const GfVec3d &vec) const
Transforms the row vector vec by the matrix, returning the result.
GF_API bool Orthonormalize(bool issueWarning=true)
Makes the matrix orthonormal in place.
GF_API GfMatrix4d & SetRotate(const GfQuatd &rot)
Sets the matrix to specify a rotation equivalent to rot, and clears the translation.
GfMatrix4d & SetZero()
Sets the matrix to zero.
bool IsLeftHanded() const
Returns true if the vectors in the upper 3x3 matrix form a left-handed coordinate system.
GF_API GfMatrix4d GetOrthonormalized(bool issueWarning=true) const
Returns an orthonormalized copy of the matrix.
GF_API GfQuatd ExtractRotationQuat() const
Return the rotation corresponding to this matrix as a quaternion.
double GetDeterminant3() const
Returns the determinant of the upper 3x3 matrix.
GF_API friend GfMatrix4d operator-(const GfMatrix4d &m)
Returns the unary negation of matrix m.
GF_API GfVec3d DecomposeRotation(const GfVec3d &axis0, const GfVec3d &axis1, const GfVec3d &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 GfMatrix4d & SetTransform(const GfRotation &rotate, const GfVec3d &translate)
Sets matrix to specify a rotation by rotate and a translation by translate.
GF_API GfMatrix4d & SetRotateOnly(const GfRotation &rot)
Sets the matrix to specify a rotation equivalent to rot, without clearing the translation.
GF_API GfMatrix4d & SetTransform(const GfMatrix3d &rotmx, const GfVec3d &translate)
Sets matrix to specify a rotation by rotmx and a translation by translate.
GF_API bool Factor(GfMatrix4d *r, GfVec3d *s, GfMatrix4d *u, GfVec3d *t, GfMatrix4d *p, double eps=1e-10) const
Factors the matrix into 5 components:
GF_API GfMatrix4d(const GfMatrix3d &rotmx, const GfVec3d &translate)
Constructor.
GF_API GfMatrix4d & SetLookAt(const GfVec3d &eyePoint, const GfRotation &orientation)
Sets the matrix to specify a viewing matrix from a world-space eyePoint and a world-space rotation th...
GF_API GfRotation ExtractRotation() const
Returns the rotation corresponding to this matrix.
GF_API GfMatrix4d & SetLookAt(const GfVec3d &eyePoint, const GfVec3d ¢erPoint, const GfVec3d &upDirection)
Sets the matrix to specify a viewing matrix from parameters similar to those used by gluLookAt(3G).
const double * GetArray() const
Returns vector components as a const array of double values.
Stores a 4x4 matrix of float elements.
A class template used by GfMatrixXX to store values.
T * GetData()
Return a pointer to the start of all the data.
Basic type: a quaternion, a complex number with a real coefficient and three imaginary coefficients,...
Basic type: 3-space rotation specification.
Basic type for a vector of 3 double components.
Basic type for a vector of 4 double components.
static size_t Combine(Args &&... args)
Produce a hash code by combining the hash codes of several objects.
double GfDot(const GfDualQuatd &dq1, const GfDualQuatd &dq2)
Return the dot (inner) product of two dual quaternions.
Assorted mathematical utility functions.
double GfAbs(double f)
Return abs(f).
GF_API std::ostream & operator<<(std::ostream &, const GfBBox3d &)
Output a GfBBox3d using the format [(range) matrix zeroArea].
#define GF_MIN_ORTHO_TOLERANCE
This constant is used to determine when a set of basis vectors is close to orthogonal.
Utility functions for GfVec4f and GfVec4d as homogeneous vectors.
GfVec3f GfProject(const GfVec4f &v)
Projects homogeneous v into Euclidean space and returns the result as a Vec3f.
Defines useful mathematical limits.
GF_API bool GfIsClose(GfMatrix4d const &m1, GfMatrix4d const &m2, double tolerance)
Tests for equality within a given tolerance, returning true if the difference between each component ...
A metafunction with a static const bool member 'value' that is true for GfMatrix types,...