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]);
527 inline _OgreExport friend std::ostream&
operator <<
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] <<
" ";
545 Real determinant()
const;
574 return m[3][0] == 0 && m[3][1] == 0 && m[3][2] == 0 && m[3][3] == 1;
581 Matrix4 inverseAffine(
void)
const;
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()
Default constructor.
Class encapsulating a standard 4x4 homogeneous matrix.
static const Matrix4 ZERO
float Real
Software floating point type.
Matrix4 concatenateAffine(const Matrix4 &m2) const
Concatenate two affine matrices.
Matrix4 concatenate(const Matrix4 &m2) const
Defines a plane in 3D space.
static const Matrix4 ZEROAFFINE
bool hasScale() const
Determines if this matrix involves a scaling.
static const Matrix4 IDENTITY
Matrix4(const Quaternion &rot)
Creates a standard 4x4 transformation matrix with a zero translation part from a rotation/scaling Qua...
Matrix4(const Matrix3 &m3x3)
Creates a standard 4x4 transformation matrix with a zero translation part from a rotation/scaling 3x3...
void setTrans(const Vector3 &v)
Sets the translation transformation part of the matrix.
A 3x3 matrix which can represent rotations around axes.
Radian operator*(Real a, const Radian &b)
static bool RealEqual(Real a, Real b, Real tolerance=std::numeric_limits< Real >::epsilon())
Compare 2 reals, using tolerance for inaccuracies.
Implementation of a Quaternion, i.e.
bool isAffine(void) const
Check whether or not the matrix is affine matrix.
void makeTrans(const Vector3 &v)
Builds a translation matrix.
Vector3 getTrans() const
Extracts the translation transformation part of the matrix.
void ToRotationMatrix(Matrix3 &kRot) const
Vector3 transformAffine(const Vector3 &v) const
3-D Vector transformation specially for an affine matrix.
void swap(Matrix4 &other)
Exchange the contents of this matrix with another.
void makeTrans(Real tx, Real ty, Real tz)
Quaternion extractQuaternion() const
Extracts the rotation / scaling part as a quaternion from the Matrix.
bool hasNegativeScale() const
Determines if this matrix involves a negative scaling.
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)
void extract3x3Matrix(Matrix3 &m3x3) const
Extracts the rotation / scaling part of the Matrix as a 3x3 matrix.
void swap(Ogre::SmallVectorImpl< T > &LHS, Ogre::SmallVectorImpl< T > &RHS)
Implement std::swap in terms of SmallVector swap.
Standard 3-dimensional vector.
Vector4 transformAffine(const Vector4 &v) const
4-D Vector transformation specially for an affine matrix.
void setScale(const Vector3 &v)
Sets the scale part of the matrix.
static Matrix4 getScale(const Vector3 &v)
Gets a scale matrix.
Matrix4 transpose(void) const
static Matrix4 getScale(Real s_x, Real s_y, Real s_z)
Gets a scale matrix - variation for not using a vector.
Real normalise()
Normalises the vector.
static Matrix4 getTrans(Real t_x, Real t_y, Real t_z)
Gets a translation matrix - variation for not using a vector.
4-dimensional homogeneous vector.
Matrix4 operator*(Real scalar) const
static Matrix4 getTrans(const Vector3 &v)
Gets a translation matrix.
static const Matrix4 CLIPSPACE2DTOIMAGESPACE
Useful little matrix which takes 2D clipspace {-1, 1} to {0,1} and inverts the Y. ...
bool operator==(STLAllocator< T, P > const &, STLAllocator< T2, P > const &)
determine equality, can memory from another allocator be released by this allocator, (ISO C++)
bool operator!=(STLAllocator< T, P > const &, STLAllocator< T2, P > const &)
determine equality, can memory from another allocator be released by this allocator, (ISO C++)