Go to the documentation of this file.
162 inline Real* operator [] (
size_t iRow )
168 inline const Real *operator [] (
size_t iRow )
const
177 r.
m[0][0] = m[0][0] * m2.
m[0][0] + m[0][1] * m2.
m[1][0] + m[0][2] * m2.
m[2][0] + m[0][3] * m2.
m[3][0];
178 r.
m[0][1] = m[0][0] * m2.
m[0][1] + m[0][1] * m2.
m[1][1] + m[0][2] * m2.
m[2][1] + m[0][3] * m2.
m[3][1];
179 r.
m[0][2] = m[0][0] * m2.
m[0][2] + m[0][1] * m2.
m[1][2] + m[0][2] * m2.
m[2][2] + m[0][3] * m2.
m[3][2];
180 r.
m[0][3] = m[0][0] * m2.
m[0][3] + m[0][1] * m2.
m[1][3] + m[0][2] * m2.
m[2][3] + m[0][3] * m2.
m[3][3];
182 r.
m[1][0] = m[1][0] * m2.
m[0][0] + m[1][1] * m2.
m[1][0] + m[1][2] * m2.
m[2][0] + m[1][3] * m2.
m[3][0];
183 r.
m[1][1] = m[1][0] * m2.
m[0][1] + m[1][1] * m2.
m[1][1] + m[1][2] * m2.
m[2][1] + m[1][3] * m2.
m[3][1];
184 r.
m[1][2] = m[1][0] * m2.
m[0][2] + m[1][1] * m2.
m[1][2] + m[1][2] * m2.
m[2][2] + m[1][3] * m2.
m[3][2];
185 r.
m[1][3] = m[1][0] * m2.
m[0][3] + m[1][1] * m2.
m[1][3] + m[1][2] * m2.
m[2][3] + m[1][3] * m2.
m[3][3];
187 r.
m[2][0] = m[2][0] * m2.
m[0][0] + m[2][1] * m2.
m[1][0] + m[2][2] * m2.
m[2][0] + m[2][3] * m2.
m[3][0];
188 r.
m[2][1] = m[2][0] * m2.
m[0][1] + m[2][1] * m2.
m[1][1] + m[2][2] * m2.
m[2][1] + m[2][3] * m2.
m[3][1];
189 r.
m[2][2] = m[2][0] * m2.
m[0][2] + m[2][1] * m2.
m[1][2] + m[2][2] * m2.
m[2][2] + m[2][3] * m2.
m[3][2];
190 r.
m[2][3] = m[2][0] * m2.
m[0][3] + m[2][1] * m2.
m[1][3] + m[2][2] * m2.
m[2][3] + m[2][3] * m2.
m[3][3];
192 r.
m[3][0] = m[3][0] * m2.
m[0][0] + m[3][1] * m2.
m[1][0] + m[3][2] * m2.
m[2][0] + m[3][3] * m2.
m[3][0];
193 r.
m[3][1] = m[3][0] * m2.
m[0][1] + m[3][1] * m2.
m[1][1] + m[3][2] * m2.
m[2][1] + m[3][3] * m2.
m[3][1];
194 r.
m[3][2] = m[3][0] * m2.
m[0][2] + m[3][1] * m2.
m[1][2] + m[3][2] * m2.
m[2][2] + m[3][3] * m2.
m[3][2];
195 r.
m[3][3] = m[3][0] * m2.
m[0][3] + m[3][1] * m2.
m[1][3] + m[3][2] * m2.
m[2][3] + m[3][3] * m2.
m[3][3];
204 return concatenate( m2 );
220 Real fInvW = 1.0f / ( m[3][0] * v.
x + m[3][1] * v.
y + m[3][2] * v.
z + m[3][3] );
222 r.
x = ( m[0][0] * v.
x + m[0][1] * v.
y + m[0][2] * v.
z + m[0][3] ) * fInvW;
223 r.
y = ( m[1][0] * v.
x + m[1][1] * v.
y + m[1][2] * v.
z + m[1][3] ) * fInvW;
224 r.
z = ( m[2][0] * v.
x + m[2][1] * v.
y + m[2][2] * v.
z + m[2][3] ) * fInvW;
231 m[0][0] * v.
x + m[0][1] * v.
y + m[0][2] * v.
z + m[0][3] * v.
w,
232 m[1][0] * v.
x + m[1][1] * v.
y + m[1][2] * v.
z + m[1][3] * v.
w,
233 m[2][0] * v.
x + m[2][1] * v.
y + m[2][2] * v.
z + m[2][3] * v.
w,
234 m[3][0] * v.
x + m[3][1] * v.
y + m[3][2] * v.
z + m[3][3] * v.
w
258 r.
m[0][0] = m[0][0] + m2.
m[0][0];
259 r.
m[0][1] = m[0][1] + m2.
m[0][1];
260 r.
m[0][2] = m[0][2] + m2.
m[0][2];
261 r.
m[0][3] = m[0][3] + m2.
m[0][3];
263 r.
m[1][0] = m[1][0] + m2.
m[1][0];
264 r.
m[1][1] = m[1][1] + m2.
m[1][1];
265 r.
m[1][2] = m[1][2] + m2.
m[1][2];
266 r.
m[1][3] = m[1][3] + m2.
m[1][3];
268 r.
m[2][0] = m[2][0] + m2.
m[2][0];
269 r.
m[2][1] = m[2][1] + m2.
m[2][1];
270 r.
m[2][2] = m[2][2] + m2.
m[2][2];
271 r.
m[2][3] = m[2][3] + m2.
m[2][3];
273 r.
m[3][0] = m[3][0] + m2.
m[3][0];
274 r.
m[3][1] = m[3][1] + m2.
m[3][1];
275 r.
m[3][2] = m[3][2] + m2.
m[3][2];
276 r.
m[3][3] = m[3][3] + m2.
m[3][3];
286 r.
m[0][0] = m[0][0] - m2.
m[0][0];
287 r.
m[0][1] = m[0][1] - m2.
m[0][1];
288 r.
m[0][2] = m[0][2] - m2.
m[0][2];
289 r.
m[0][3] = m[0][3] - m2.
m[0][3];
291 r.
m[1][0] = m[1][0] - m2.
m[1][0];
292 r.
m[1][1] = m[1][1] - m2.
m[1][1];
293 r.
m[1][2] = m[1][2] - m2.
m[1][2];
294 r.
m[1][3] = m[1][3] - m2.
m[1][3];
296 r.
m[2][0] = m[2][0] - m2.
m[2][0];
297 r.
m[2][1] = m[2][1] - m2.
m[2][1];
298 r.
m[2][2] = m[2][2] - m2.
m[2][2];
299 r.
m[2][3] = m[2][3] - m2.
m[2][3];
301 r.
m[3][0] = m[3][0] - m2.
m[3][0];
302 r.
m[3][1] = m[3][1] - m2.
m[3][1];
303 r.
m[3][2] = m[3][2] - m2.
m[3][2];
304 r.
m[3][3] = m[3][3] - m2.
m[3][3];
314 m[0][0] != m2.
m[0][0] || m[0][1] != m2.
m[0][1] || m[0][2] != m2.
m[0][2] || m[0][3] != m2.
m[0][3] ||
315 m[1][0] != m2.
m[1][0] || m[1][1] != m2.
m[1][1] || m[1][2] != m2.
m[1][2] || m[1][3] != m2.
m[1][3] ||
316 m[2][0] != m2.
m[2][0] || m[2][1] != m2.
m[2][1] || m[2][2] != m2.
m[2][2] || m[2][3] != m2.
m[2][3] ||
317 m[3][0] != m2.
m[3][0] || m[3][1] != m2.
m[3][1] || m[3][2] != m2.
m[3][2] || m[3][3] != m2.
m[3][3] )
327 m[0][0] != m2.
m[0][0] || m[0][1] != m2.
m[0][1] || m[0][2] != m2.
m[0][2] || m[0][3] != m2.
m[0][3] ||
328 m[1][0] != m2.
m[1][0] || m[1][1] != m2.
m[1][1] || m[1][2] != m2.
m[1][2] || m[1][3] != m2.
m[1][3] ||
329 m[2][0] != m2.
m[2][0] || m[2][1] != m2.
m[2][1] || m[2][2] != m2.
m[2][2] || m[2][3] != m2.
m[2][3] ||
330 m[3][0] != m2.
m[3][0] || m[3][1] != m2.
m[3][1] || m[3][2] != m2.
m[3][2] || m[3][3] != m2.
m[3][3] )
337 inline void operator = (
const Matrix3& mat3 )
339 m[0][0] = mat3.
m[0][0]; m[0][1] = mat3.
m[0][1]; m[0][2] = mat3.
m[0][2];
340 m[1][0] = mat3.
m[1][0]; m[1][1] = mat3.
m[1][1]; m[1][2] = mat3.
m[1][2];
341 m[2][0] = mat3.
m[2][0]; m[2][1] = mat3.
m[2][1]; m[2][2] = mat3.
m[2][2];
346 return Matrix4(m[0][0], m[1][0], m[2][0], m[3][0],
347 m[0][1], m[1][1], m[2][1], m[3][1],
348 m[0][2], m[1][2], m[2][2], m[3][2],
349 m[0][3], m[1][3], m[2][3], m[3][3]);
370 return Vector3(m[0][3], m[1][3], m[2][3]);
378 m[0][0] = 1.0; m[0][1] = 0.0; m[0][2] = 0.0; m[0][3] = v.
x;
379 m[1][0] = 0.0; m[1][1] = 1.0; m[1][2] = 0.0; m[1][3] = v.
y;
380 m[2][0] = 0.0; m[2][1] = 0.0; m[2][2] = 1.0; m[2][3] = v.
z;
381 m[3][0] = 0.0; m[3][1] = 0.0; m[3][2] = 0.0; m[3][3] = 1.0;
386 m[0][0] = 1.0; m[0][1] = 0.0; m[0][2] = 0.0; m[0][3] = tx;
387 m[1][0] = 0.0; m[1][1] = 1.0; m[1][2] = 0.0; m[1][3] = ty;
388 m[2][0] = 0.0; m[2][1] = 0.0; m[2][2] = 1.0; m[2][3] = tz;
389 m[3][0] = 0.0; m[3][1] = 0.0; m[3][2] = 0.0; m[3][3] = 1.0;
398 r.
m[0][0] = 1.0; r.
m[0][1] = 0.0; r.
m[0][2] = 0.0; r.
m[0][3] = v.
x;
399 r.
m[1][0] = 0.0; r.
m[1][1] = 1.0; r.
m[1][2] = 0.0; r.
m[1][3] = v.
y;
400 r.
m[2][0] = 0.0; r.
m[2][1] = 0.0; r.
m[2][2] = 1.0; r.
m[2][3] = v.
z;
401 r.
m[3][0] = 0.0; r.
m[3][1] = 0.0; r.
m[3][2] = 0.0; r.
m[3][3] = 1.0;
412 r.
m[0][0] = 1.0; r.
m[0][1] = 0.0; r.
m[0][2] = 0.0; r.
m[0][3] = t_x;
413 r.
m[1][0] = 0.0; r.
m[1][1] = 1.0; r.
m[1][2] = 0.0; r.
m[1][3] = t_y;
414 r.
m[2][0] = 0.0; r.
m[2][1] = 0.0; r.
m[2][2] = 1.0; r.
m[2][3] = t_z;
415 r.
m[3][0] = 0.0; r.
m[3][1] = 0.0; r.
m[3][2] = 0.0; r.
m[3][3] = 1.0;
439 r.
m[0][0] = v.
x; r.
m[0][1] = 0.0; r.
m[0][2] = 0.0; r.
m[0][3] = 0.0;
440 r.
m[1][0] = 0.0; r.
m[1][1] = v.
y; r.
m[1][2] = 0.0; r.
m[1][3] = 0.0;
441 r.
m[2][0] = 0.0; r.
m[2][1] = 0.0; r.
m[2][2] = v.
z; r.
m[2][3] = 0.0;
442 r.
m[3][0] = 0.0; r.
m[3][1] = 0.0; r.
m[3][2] = 0.0; r.
m[3][3] = 1.0;
452 r.
m[0][0] = s_x; r.
m[0][1] = 0.0; r.
m[0][2] = 0.0; r.
m[0][3] = 0.0;
453 r.
m[1][0] = 0.0; r.
m[1][1] = s_y; r.
m[1][2] = 0.0; r.
m[1][3] = 0.0;
454 r.
m[2][0] = 0.0; r.
m[2][1] = 0.0; r.
m[2][2] = s_z; r.
m[2][3] = 0.0;
455 r.
m[3][0] = 0.0; r.
m[3][1] = 0.0; r.
m[3][2] = 0.0; r.
m[3][3] = 1.0;
465 m3x3.
m[0][0] = m[0][0];
466 m3x3.
m[0][1] = m[0][1];
467 m3x3.
m[0][2] = m[0][2];
468 m3x3.
m[1][0] = m[1][0];
469 m3x3.
m[1][1] = m[1][1];
470 m3x3.
m[1][2] = m[1][2];
471 m3x3.
m[2][0] = m[2][0];
472 m3x3.
m[2][1] = m[2][1];
473 m3x3.
m[2][2] = m[2][2];
481 Real t = m[0][0] * m[0][0] + m[1][0] * m[1][0] + m[2][0] * m[2][0];
484 t = m[0][1] * m[0][1] + m[1][1] * m[1][1] + m[2][1] * m[2][1];
487 t = m[0][2] * m[0][2] + m[1][2] * m[1][2] + m[2][2] * m[2][2];
497 return determinant() < 0;
505 extract3x3Matrix(m3x3);
519 scalar*m[0][0], scalar*m[0][1], scalar*m[0][2], scalar*m[0][3],
520 scalar*m[1][0], scalar*m[1][1], scalar*m[1][2], scalar*m[1][3],
521 scalar*m[2][0], scalar*m[2][1], scalar*m[2][2], scalar*m[2][3],
522 scalar*m[3][0], scalar*m[3][1], scalar*m[3][2], scalar*m[3][3]);
528 ( std::ostream& o,
const Matrix4& mat )
531 for (
size_t i = 0; i < 4; ++i)
533 o <<
" row" << (unsigned)i <<
"{";
534 for(
size_t j = 0; j < 4; ++j)
536 o << mat[i][j] <<
" ";
574 return m[3][0] == 0 && m[3][1] == 0 && m[3][2] == 0 && m[3][3] == 1;
589 assert(isAffine() && m2.
isAffine());
592 m[0][0] * m2.
m[0][0] + m[0][1] * m2.
m[1][0] + m[0][2] * m2.
m[2][0],
593 m[0][0] * m2.
m[0][1] + m[0][1] * m2.
m[1][1] + m[0][2] * m2.
m[2][1],
594 m[0][0] * m2.
m[0][2] + m[0][1] * m2.
m[1][2] + m[0][2] * m2.
m[2][2],
595 m[0][0] * m2.
m[0][3] + m[0][1] * m2.
m[1][3] + m[0][2] * m2.
m[2][3] + m[0][3],
597 m[1][0] * m2.
m[0][0] + m[1][1] * m2.
m[1][0] + m[1][2] * m2.
m[2][0],
598 m[1][0] * m2.
m[0][1] + m[1][1] * m2.
m[1][1] + m[1][2] * m2.
m[2][1],
599 m[1][0] * m2.
m[0][2] + m[1][1] * m2.
m[1][2] + m[1][2] * m2.
m[2][2],
600 m[1][0] * m2.
m[0][3] + m[1][1] * m2.
m[1][3] + m[1][2] * m2.
m[2][3] + m[1][3],
602 m[2][0] * m2.
m[0][0] + m[2][1] * m2.
m[1][0] + m[2][2] * m2.
m[2][0],
603 m[2][0] * m2.
m[0][1] + m[2][1] * m2.
m[1][1] + m[2][2] * m2.
m[2][1],
604 m[2][0] * m2.
m[0][2] + m[2][1] * m2.
m[1][2] + m[2][2] * m2.
m[2][2],
605 m[2][0] * m2.
m[0][3] + m[2][1] * m2.
m[1][3] + m[2][2] * m2.
m[2][3] + m[2][3],
622 m[0][0] * v.
x + m[0][1] * v.
y + m[0][2] * v.
z + m[0][3],
623 m[1][0] * v.
x + m[1][1] * v.
y + m[1][2] * v.
z + m[1][3],
624 m[2][0] * v.
x + m[2][1] * v.
y + m[2][2] * v.
z + m[2][3]);
636 m[0][0] * v.
x + m[0][1] * v.
y + m[0][2] * v.
z + m[0][3] * v.
w,
637 m[1][0] * v.
x + m[1][1] * v.
y + m[1][2] * v.
z + m[1][3] * v.
w,
638 m[2][0] * v.
x + m[2][1] * v.
y + m[2][2] * v.
z + m[2][3] * v.
w,
650 v.
x*mat[0][0] + v.
y*mat[1][0] + v.
z*mat[2][0] + v.
w*mat[3][0],
651 v.
x*mat[0][1] + v.
y*mat[1][1] + v.
z*mat[2][1] + v.
w*mat[3][1],
652 v.
x*mat[0][2] + v.
y*mat[1][2] + v.
z*mat[2][2] + v.
w*mat[3][2],
653 v.
x*mat[0][3] + v.
y*mat[1][3] + v.
z*mat[2][3] + v.
w*mat[3][3]
Matrix4 transpose(void) const
Real normalise()
Normalises the vector.
Defines a plane in 3D space.
bool hasScale() const
Determines if this matrix involves a scaling.
void setScale(const Vector3 &v)
Sets the scale part of the matrix.
void makeTrans(const Vector3 &v)
Builds a translation matrix.
Quaternion extractQuaternion() const
Extracts the rotation / scaling part as a quaternion from the Matrix.
void swap(Matrix4 &other)
Exchange the contents of this matrix with another.
A 3x3 matrix which can represent rotations around axes.
Radian operator*(Real a, const Radian &b)
static Matrix4 getTrans(Real t_x, Real t_y, Real t_z)
Gets a translation matrix - variation for not using a vector.
void makeTransform(const Vector3 &position, const Vector3 &scale, const Quaternion &orientation)
Building a Matrix4 from orientation / scale / position.
Matrix4()
Default constructor.
bool hasNegativeScale() const
Determines if this matrix involves a negative scaling.
Vector4 transformAffine(const Vector4 &v) const
4-D Vector transformation specially for an affine matrix.
bool operator!=(STLAllocator< T, P > const &, STLAllocator< T2, P > const &)
determine equality, can memory from another allocator be released by this allocator,...
Implementation of a Quaternion, i.e.
Matrix4 inverseAffine(void) const
Returns the inverse of the affine matrix.
Matrix4 concatenateAffine(const Matrix4 &m2) const
Concatenate two affine matrices.
Class encapsulating a standard 4x4 homogeneous matrix.
Matrix4(const Matrix3 &m3x3)
Creates a standard 4x4 transformation matrix with a zero translation part from a rotation/scaling 3x3...
Matrix4(Real m00, Real m01, Real m02, Real m03, Real m10, Real m11, Real m12, Real m13, Real m20, Real m21, Real m22, Real m23, Real m30, Real m31, Real m32, Real m33)
static const Matrix4 ZEROAFFINE
void setTrans(const Vector3 &v)
Sets the translation transformation part of the matrix.
void makeInverseTransform(const Vector3 &position, const Vector3 &scale, const Quaternion &orientation)
Building an inverse Matrix4 from orientation / scale / position.
static const Matrix4 IDENTITY
Matrix4(const Quaternion &rot)
Creates a standard 4x4 transformation matrix with a zero translation part from a rotation/scaling Qua...
static Matrix4 getScale(Real s_x, Real s_y, Real s_z)
Gets a scale matrix - variation for not using a vector.
void extract3x3Matrix(Matrix3 &m3x3) const
Extracts the rotation / scaling part of the Matrix as a 3x3 matrix.
static const Matrix4 CLIPSPACE2DTOIMAGESPACE
Useful little matrix which takes 2D clipspace {-1, 1} to {0,1} and inverts the Y.
static Matrix4 getScale(const Vector3 &v)
Gets a scale matrix.
Matrix4 concatenate(const Matrix4 &m2) const
4-dimensional homogeneous vector.
void swap(Ogre::SmallVectorImpl< T > &LHS, Ogre::SmallVectorImpl< T > &RHS)
Implement std::swap in terms of SmallVector swap.
Matrix4 operator*(Real scalar) const
Vector3 transformAffine(const Vector3 &v) const
3-D Vector transformation specially for an affine matrix.
void makeTrans(Real tx, Real ty, Real tz)
Vector3 getTrans() const
Extracts the translation transformation part of the matrix.
float Real
Software floating point type.
static bool RealEqual(Real a, Real b, Real tolerance=std::numeric_limits< Real >::epsilon())
Compare 2 reals, using tolerance for inaccuracies.
bool operator==(STLAllocator< T, P > const &, STLAllocator< T2, P > const &)
determine equality, can memory from another allocator be released by this allocator,...
void decomposition(Vector3 &position, Vector3 &scale, Quaternion &orientation) const
Decompose a Matrix4 to orientation / scale / position.
void ToRotationMatrix(Matrix3 &kRot) const
Standard 3-dimensional vector.
bool isAffine(void) const
Check whether or not the matrix is affine matrix.
static const Matrix4 ZERO
static Matrix4 getTrans(const Vector3 &v)
Gets a translation matrix.
Copyright © 2012 Torus Knot Software Ltd

This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.