Public Member Functions | Static Public Attributes | Friends

Matrix3 Class Reference

This reference page is linked to from the following overview topics: Lesson 4: Animation Controllers, Lesson 6: Parameter Blocks, Parameter Types, Matrix Representations of 3D Transformations, Matrix Fundamentals, Translation (Moving), Rotation, Scaling, A Matrix3 as an Axis System, Rotation Concepts, Node Transformations, Transform Controller Coordinate Systems, Creating Primitive NURBS Objects, Controllers, Transform Controllers and Nodes, Dialog Based Creation of Objects.


Search for all occurrences

Detailed Description

See also:
Class Point3, Matrix Representations of 3D Transformations, Class Quat, Class AngAxis, Structure AffineParts, Class BigMatrix.

Description:
This class implements a 4x3 3D transformation matrix object. Methods are provided to zero the matrix, set it to the identity, compute its inverse, apply incremental translation, rotation and scaling, and build new X, Y and Z rotation matrices. Operators are provided for matrix addition, subtraction, and multiplication. All methods are implemented by the system.

Note: In 3ds Max, all vectors are assumed to be row vectors. Under this assumption, multiplication of a vector with a matrix can be written either way (Matrix*Vector or Vector*Matrix), for ease of use, and the result is the same -- the (row) vector transformed by the matrix.
Data Members:
private:

float m[4][3];

Matrix storage.

DWORD flags;

Matrix Identity Flags.

POS_IDENT

Indicates the translation row of the matrix is the identity.

ROT_IDENT

Indicates the rotation elements of the matrix are the identity.

SCL_IDENT

Indicates the scale elements of the matrix are the identity.

MAT_IDENT

Indicates the matrix is the identity matrix. This is equivalent to (POS_IDENT|ROT_IDENT|SCL_IDENT).

static const Matrix3 Identity;

This data member is available in release 3.0 and later only.

An instance of an identity matrix.

#include <matrix3.h>

Inheritance diagram for Matrix3:
Inheritance graph
[legend]

List of all members.

Public Member Functions

const Point3 operator[] (int i) const
void  SetNotIdent ()
void  SetIdentFlags (DWORD f)
DWORD  GetIdentFlags () const
void  ClearIdentFlag (DWORD f)
BOOL  IsIdentity () const
GEOMEXPORT void  ValidateFlags ()
MRow *  GetAddr ()
const MRow *  GetAddr () const
  Matrix3 ()
  Matrix3 (BOOL)
GEOMEXPORT  Matrix3 (float(*fp)[3])
  Matrix3 (const Point3 &U, const Point3 &V, const Point3 &N, const Point3 &T)
Matrix3 Set (const Point3 &U, const Point3 &V, const Point3 &N, const Point3 &T)
GEOMEXPORT int  operator== (const Matrix3 &M) const
GEOMEXPORT int  Equals (const Matrix3 &M, float epsilon=1E-6f) const
GEOMEXPORT Matrix3 operator-= (const Matrix3 &M)
GEOMEXPORT Matrix3 operator+= (const Matrix3 &M)
GEOMEXPORT Matrix3 operator*= (const Matrix3 &M)
GEOMEXPORT Matrix3 operator*= (float a)
GEOMEXPORT void  IdentityMatrix ()
GEOMEXPORT void  Zero ()
Point3  GetRow (int i) const
GEOMEXPORT void  SetRow (int i, Point3 p)
GEOMEXPORT Point4  GetColumn (int i) const
GEOMEXPORT void  SetColumn (int i, Point4 col)
GEOMEXPORT Point3  GetColumn3 (int i) const
GEOMEXPORT void  NoTrans ()
GEOMEXPORT void  NoRot ()
GEOMEXPORT void  NoScale ()
GEOMEXPORT void  Orthogonalize ()
void  SetTrans (const Point3 p)
void  SetTrans (int i, float v)
const Point3 GetTrans () const
GEOMEXPORT void  Translate (const Point3 &p)
GEOMEXPORT void  RotateX (float angle)
GEOMEXPORT void  RotateY (float angle)
GEOMEXPORT void  RotateZ (float angle)
GEOMEXPORT void  Scale (const Point3 &s, BOOL trans=FALSE)
GEOMEXPORT void  PreTranslate (const Point3 &p)
GEOMEXPORT void  PreRotateX (float angle)
GEOMEXPORT void  PreRotateY (float angle)
GEOMEXPORT void  PreRotateZ (float angle)
GEOMEXPORT void  PreScale (const Point3 &s, BOOL trans=FALSE)
GEOMEXPORT void  SetTranslate (const Point3 &p)
GEOMEXPORT void  SetRotateX (float angle)
GEOMEXPORT void  SetRotateY (float angle)
GEOMEXPORT void  SetRotateZ (float angle)
GEOMEXPORT void  SetRotate (const Quat &q)
GEOMEXPORT void  SetRotate (const AngAxis &aa)
GEOMEXPORT void  SetRotate (float yaw, float pitch, float roll)
GEOMEXPORT void  SetAngleAxis (const Point3 &axis, float angle)
GEOMEXPORT void  SetScale (const Point3 &s)
GEOMEXPORT void  SetFromToUp (const Point3 &from, const Point3 &to, const Point3 &up)
GEOMEXPORT void  Invert ()
GEOMEXPORT Matrix3  operator* (const Matrix3 &) const
GEOMEXPORT Matrix3  operator+ (const Matrix3 &) const
GEOMEXPORT Matrix3  operator- (const Matrix3 &) const
GEOMEXPORT Point3  PointTransform (const Point3 &p) const
GEOMEXPORT Point3  VectorTransform (const Point3 &p) const
GEOMEXPORT void  TransformPoints (Point3 *array, int n, int stride=sizeof(Point3))
GEOMEXPORT void  TransformPoints (const Point3 *array, Point3 *to, int n, int stride=sizeof(Point3), int strideTo=sizeof(Point3))
GEOMEXPORT void  TransformVectors (Point3 *array, int n, int stride=sizeof(Point3))
GEOMEXPORT void  TransformVectors (const Point3 *array, Point3 *to, int n, int stride=sizeof(Point3), int strideTo=sizeof(Point3))
GEOMEXPORT void  GetYawPitchRoll (float *yaw, float *pitch, float *roll)
GEOMEXPORT IOResult  Save (ISave *isave)
GEOMEXPORT IOResult  Load (ILoad *iload)
GEOMEXPORT BOOL  Parity () const

Static Public Attributes

static const Matrix3  Identity

Friends

class  Quat
Matrix3 GEOMEXPORT  RotateXMatrix (float angle)
Matrix3 GEOMEXPORT  RotateYMatrix (float angle)
Matrix3 GEOMEXPORT  RotateZMatrix (float angle)
Matrix3 GEOMEXPORT  TransMatrix (const Point3 &p)
Matrix3 GEOMEXPORT  ScaleMatrix (const Point3 &s)
Matrix3 GEOMEXPORT  RotateYPRMatrix (float Yaw, float Pitch, float Roll)
Matrix3 GEOMEXPORT  RotAngleAxisMatrix (Point3 &axis, float angle)
Matrix3 GEOMEXPORT  Inverse (const Matrix3 &M)
Point3 GEOMEXPORT  operator* (const Matrix3 &A, const Point3 &V)
Point3 GEOMEXPORT  operator* (const Point3 &V, const Matrix3 &A)
Point3 GEOMEXPORT  VectorTransform (const Matrix3 &M, const Point3 &V)
Matrix3 GEOMEXPORT  XFormMat (const Matrix3 &xm, const Matrix3 &m)
Point3 GEOMEXPORT  VectorTransform (const Point3 &V, const Matrix3 &M)

Constructor & Destructor Documentation

Matrix3 ( ) [inline]
Remarks:
Constructor. Note that no initialization is done. Use Zero() or Identity(), or the constructors below.
{ flags = 0; }  // NO INITIALIZATION done in this constructor!!             
Matrix3 ( BOOL  ) [inline]
Remarks:
Constructor. If TRUE is passed to the method the matrix is set to the identity.
Parameters:
BOOL init

Specifies if the Matrix3 should be initialized to the identity.
{flags=0; IdentityMatrix();}
GEOMEXPORT Matrix3 ( float(*)  fp[3] )
Remarks:
Constructor. The matrix is initialized to fp.
Parameters:
float (*fp)[3]

Specifies the initial values for the matrix.
Matrix3 ( const Point3 U,
const Point3 V,
const Point3 N,
const Point3 T 
) [inline]
Remarks:
Constructor. Initializes the matrix with the row data passed and validates the matrix flags.
Parameters:
const Point3& U

The data for row 0.

const Point3& V

The data for row 1.

const Point3& N

The data for row 2.

const Point3& T

The data for row 3.
                                                                                {
        flags = 0; SetRow(0, U); SetRow(1, V); SetRow(2, N); SetRow(3, T); 
        ValidateFlags(); }

Member Function Documentation

const Point3& operator[] ( int  i ) const [inline]
Remarks:
Returns a reference to the 'i-th' Point3 of the matrix.
{ return((Point3&)(*m[i])); }
void SetNotIdent ( ) [inline]
Remarks:
This clears the MAT_IDENT flag to indicate the matrix is not the identity. If any changes are made to components directly via GetAddr(), this method must be called.
{ flags &= ~MAT_IDENT; }
void SetIdentFlags ( DWORD  f ) [inline]
Remarks:
This sets the specified identity flag(s).
Parameters:
DWORD f

Specifies the identity flag bit(s) to set. See Matrix Identity Flags above.
{ flags &= ~MAT_IDENT; flags |= f; }
DWORD GetIdentFlags ( ) const [inline]
Remarks:
Returns the identity flags.
{ return flags; }
void ClearIdentFlag ( DWORD  f ) [inline]
Remarks:
Clears the specified identity flag(s). See Matrix Identity Flags above.
Parameters:
DWORD f

Specifies the identity flag bit(s) to clear.
{ flags &= ~f; }
BOOL IsIdentity ( ) const [inline]
Remarks:
Returns TRUE if the matrix is the identity matrix (based on the flags); otherwise FALSE.
{ return ((flags&MAT_IDENT)==MAT_IDENT); }
GEOMEXPORT void ValidateFlags ( )
Remarks:
This method may be used to recompute the *_IDENT flags for this matrix. For instance, if you call a method, such as INode::GetObjTMAfterWSM(), and it returns a matrix, you cannot use the IsIdentity() method to check if the matrix is indeed the identity. This is because the flags that method checks are not initialized by the INode method. What you can do however is call this method first. This will validate the flags in the matrix so they accuratly reflect the properties of the matrix. If after calling this method, and then calling IsIdentity(), the proper result would be returned.
MRow* GetAddr ( ) [inline]
Remarks:
Returns the address of this Matrix3.

The Matrix3 class keeps flags indicating identity for rotation, scale, position, and the matrix as a whole, and thus the direct access via the [] operator is restricted to prevent developers from modifying the matrix without updating the flags. This method, GetAddr(), still lets you get at the matrix itself and then you can use the [] operator on the result. Note: If you change the matrix via this pointer, you MUST clear the proper IDENT flags!

Also Note: typedef float MRow[3];
Returns:
The address of the Matrix3.
{ return (MRow *)(m); }   
const MRow* GetAddr ( ) const [inline]
Remarks:
Returns the address of this Matrix3.

The Matrix3 class keeps flags indicating identity for rotation, scale, position, and the matrix as a whole, and thus the direct access via the [] operator is restricted to prevent developers from modifying the matrix without updating the flags. This method, GetAddr(), still lets you get at the matrix itself and then you can use the [] operator on the result. Note: If you change the matrix via this pointer, you MUST clear the proper IDENT flags!

Also Note: typedef float MRow[3];
{ return (MRow *)(m); }
Matrix3& Set ( const Point3 U,
const Point3 V,
const Point3 N,
const Point3 T 
) [inline]
Remarks:
Initializes the matrix with the row data passed and validates the matrix flags.
Parameters:
const Point3& U

The data for row 0.

const Point3& V

The data for row 1.

const Point3& N

The data for row 2.

const Point3& T

The data for row 3.
Returns:
A reference to this matrix.
                                                                                     {
        flags = 0; SetRow(0, U); SetRow(1, V); SetRow(2, N); SetRow(3, T);
        ValidateFlags(); return *this; }
GEOMEXPORT int operator== ( const Matrix3 M ) const
Remarks:
Compares the elements of this matrix and the one specified element by element for exact equality. Returns nonzero if they are equal; otherwise zero.
Parameters:
const Matrix3& M

The matrix to compare against.
GEOMEXPORT int Equals ( const Matrix3 M,
float  epsilon = 1E-6f 
) const
Remarks:
Compares the elements of this matrix and the one specified element by element for equality within the specified tolerance epsilon. Returns nonzero if they are 'equal'; otherwise zero.
Parameters:
const Matrix3& M

The matrix to compare against.

float epsilon = 1E-6f

The tolerance for comparison. If the values in the matrix are within this value (+ epsilon or - epsilon) they are considered equal.
GEOMEXPORT Matrix3& operator-= ( const Matrix3 M )
Remarks:
Subtracts a Matrix3 from this Matrix3.
GEOMEXPORT Matrix3& operator+= ( const Matrix3 M )
Remarks:
Adds a Matrix3 to this Matrix3.
GEOMEXPORT Matrix3& operator*= ( const Matrix3 M )
Remarks:
Multiplies this Matrix3 by the specified Matrix3 (*this = (*this)*M;).
GEOMEXPORT Matrix3& operator*= ( float  a )
GEOMEXPORT void IdentityMatrix ( )
Remarks:
Set this matrix to the Identity Matrix.
GEOMEXPORT void Zero ( )
Remarks:
This method sets all elements of the matrix to 0.0f
Point3 GetRow ( int  i ) const [inline]
Remarks:
Returns the specified row of this matrix.
Parameters:
int i

Specifies the row to retrieve.
{ return (*this)[i]; }  
GEOMEXPORT void SetRow ( int  i,
Point3  p 
)
Remarks:
Sets the specified row of this matrix to the specified values.
Parameters:
int i

Specifies the row to set.

Point3 p

The values to set.
GEOMEXPORT Point4 GetColumn ( int  i ) const
Remarks:
Returns the 'i-th' column of this matrix.
Parameters:
int i

Specifies the column to get (0-2).
GEOMEXPORT void SetColumn ( int  i,
Point4  col 
)
Remarks:
Sets the 'i-th' column of this matrix to the specified values.
Parameters:
int i

Specifies the column to set (0-2).

Point4 col

The values to set.
GEOMEXPORT Point3 GetColumn3 ( int  i ) const
Remarks:
Returns the upper three entries in the specified column.
Parameters:
int i

Specifies the partial column to get (0-2).
GEOMEXPORT void NoTrans ( )
Remarks:
This method zeros the translation portion of this matrix.
GEOMEXPORT void NoRot ( )
Remarks:
This method zeros the rotation portion of this matrix.
GEOMEXPORT void NoScale ( )
Remarks:
The method zeros the scale portion of this matrix without orthogonalization. If the matrix was sheared (skewed) then the method is not able to remove scale component completely. Use Orthogonalize() method first, and then NoScale() to remove scale component entirely. Read SCL_IDENT flag to check if NoScale() method was enough to make the matrix to be orthogonal (with perpendicular axes of unit length).Prototype:

void Orthogonalize();
This is an "unbiased" orthogonalization of this matrix. The algorithm seems to take a maximum of 4 iterations to converge. An orthogonal matrix has an axis system where each axis is 90 degrees from the others (it's not skewed).
GEOMEXPORT void Orthogonalize ( )
void SetTrans ( const Point3  p ) [inline]
Remarks:
Sets the translation row of this matrix to the specified values. The POS_IDENT flag is cleared.
Parameters:
const Point3 p

Specifies the values for the translation row.
{ (*this)[3] = p;  flags &= ~POS_IDENT; }
void SetTrans ( int  i,
float  v 
) [inline]
Remarks:
Sets the specified component of the translation row of this matrix to the specified value. The POS_IDENT flag is cleared.
Parameters:
int i

Specifies the component of the translation row of this matrix to set.

float v

The value to set.
{ (*this)[3][i] = v; flags &= ~POS_IDENT; }
const Point3& GetTrans ( ) const [inline]
Remarks:
Returns the translation row of this matrix.
Returns:
The translation row of this matrix.
{ return (*this)[3]; }
GEOMEXPORT void Translate ( const Point3 p )
Remarks:
Apply an incremental translation transformation to this matrix. This is equivalent to multiplying on the RIGHT by the transform.
Parameters:
const Point3& p

Specifies the translation.
GEOMEXPORT void RotateX ( float  angle )
Remarks:
Apply an incremental X rotation transformation to this matrix. This is equivalent to multiplying on the RIGHT by the transform.
Parameters:
float angle

Specifies the X rotation in radians.
GEOMEXPORT void RotateY ( float  angle )
Remarks:
Apply an incremental Y rotation transformation to this matrix. This is equivalent to multiplying on the RIGHT by the transform.
Parameters:
float angle

Specifies the Y rotation in radians.
GEOMEXPORT void RotateZ ( float  angle )
Remarks:
Apply an incremental Z rotation transformation to this matrix. This is equivalent to multiplying on the RIGHT by the transform.
Parameters:
float angle

Specifies the Z rotation in radians.
GEOMEXPORT void Scale ( const Point3 s,
BOOL  trans = FALSE 
)
Remarks:
Apply an incremental scaling transformation to this matrix. This is equivalent to multiplying on the RIGHT by the transform.
Parameters:
const Point3& s

The scale values.

BOOL trans = FALSE

If set to TRUE, the translation component is scaled. If trans = FALSE the translation component is unaffected. When 3ds Max was originally written there was a bug in the code for this method where the translation portion of the matrix was not being scaled. This meant that when a matrix was scaled the bottom row was not scaled. Thus it would always scale about the local origin of the object, but it would scale the world axes. When this bug was discovered, dependencies existed in the code upon this bug. Thus it could not simply be fixed because it would break the existing code that depended upon it working the incorrect way. To correct this the trans parameter was added. If this is set to TRUE, the translation component will be scaled correctly. The existing plug-ins don't use this parameter, it defaults to FALSE, and the code behaves the old way.
GEOMEXPORT void PreTranslate ( const Point3 p )
Remarks:
Apply an incremental translation transformation to this matrix. This is equivalent to multiplying on the LEFT by the transform.
Parameters:
const Point3& p

Specifies the translation distance.
GEOMEXPORT void PreRotateX ( float  angle )
Remarks:
Apply an incremental X rotation transformation to this matrix. This is equivalent to multiplying on the LEFT by the transform.
Parameters:
float angle

Specifies the X rotation in radians.
GEOMEXPORT void PreRotateY ( float  angle )
Remarks:
Apply an incremental Y rotation transformation to this matrix. This is equivalent to multiplying on the LEFT by the transform.
Parameters:
float angle

Specifies the Y rotation in radians.
GEOMEXPORT void PreRotateZ ( float  angle )
Remarks:
Apply an incremental Z rotation transformation to this matrix. This is equivalent to multiplying on the LEFT by the transform.
Parameters:
float angle

Specifies the Z rotation in radians.
GEOMEXPORT void PreScale ( const Point3 s,
BOOL  trans = FALSE 
)
Remarks:
Apply an incremental scaling transformation to this matrix. This is equivalent to multiplying on the LEFT by the transform.
Parameters:
const Point3& s

The scale values.

BOOL trans = FALSE

If trans = FALSE the translation component is unaffected.
GEOMEXPORT void SetTranslate ( const Point3 p )
Remarks:
Sets this matrix to the identity and the translation components to the specified values.
Parameters:
const Point3& p

The translation values to store.
GEOMEXPORT void SetRotateX ( float  angle )
Remarks:
Sets this matrix to the identity and the rotation components to the specified X rotation.
Parameters:
float angle

The angle for X rotation (in radians).
GEOMEXPORT void SetRotateY ( float  angle )
Remarks:
Sets this matrix to the identity and the rotation components to the specified Y rotation.
Parameters:
float angle

The angle for Y rotation (in radians).
GEOMEXPORT void SetRotateZ ( float  angle )
Remarks:
Sets this matrix to the identity and the rotation components to the specified Z rotation.
Parameters:
float angle

The angle for Z rotation (in radians).
GEOMEXPORT void SetRotate ( const Quat q )
Remarks:
Sets the rotation components of the matrix as specified by the quaternion. The translation and scale components will match the identity matrix.
Parameters:
const Quat& q

Specifies the rotation to use for the matrix.
GEOMEXPORT void SetRotate ( const AngAxis aa )
Remarks:
Sets the rotation components of the matrix as specified by the AngAxis. The translation and scale components will match the identity matrix.
Parameters:
const AngAxis& aa

Specifies the rotation to use for the matrix.
GEOMEXPORT void SetRotate ( float  yaw,
float  pitch,
float  roll 
)
Remarks:
Sets the rotation components of this matrix using yaw, pitch and roll angles. There are many different conventions for specifying a rotation by means of three Euler angles. This function uses the convention of rotating around the world Z axis, then the X axis, then the Y axis; the three arguments are given in the order Y, X, Z.

This one is equivalent to:

M.IdentityMatrix();

M.RotateZ(roll);

M.RotateX(pitch);

M.RotateY(yaw);

--Which presupposes Y is vertical, X is sideways, Z is forward
Parameters:
float yaw

The yaw angle in radians.

float pitch

The pitch angle in radians.

float roll

The roll angle in radians.
GEOMEXPORT void SetAngleAxis ( const Point3 axis,
float  angle 
)
Remarks:
Sets the rotation portion of the matrix to the rotation specified by the angle and axis and sets the translation portion to zeros.
Parameters:
const Point3& axis

The axis of rotation.

float angle

The angle of rotation about the axis in radians.
GEOMEXPORT void SetScale ( const Point3 s )
Remarks:
Sets the scale components of this matrix to the specified values. The other components to this matrix will match the identity.
Parameters:
const Point3& s

The scale factors for the matrix.
GEOMEXPORT void SetFromToUp ( const Point3 from,
const Point3 to,
const Point3 up 
)
Remarks:
This creates a matrix describing a viewpoint which is at the 'from' location, looking toward the 'to' location; the viewpoint is tilted so that the 'up' vector points to the top of the view.
Parameters:
const Point3& from

This specifies the viewpoint source location.

const Point3& to

This vector specifies the direction of view.

const Point3& up

This vector points to the top of the view.
GEOMEXPORT void Invert ( )
Remarks:
This method inverts this matrix. An inverted matrix, when multiplied by the original, yields the identity.
GEOMEXPORT Matrix3 operator* ( const Matrix3 ) const
Remarks:
Perform matrix multiplication.
GEOMEXPORT Matrix3 operator+ ( const Matrix3 ) const
Remarks:
Perform matrix addition.
GEOMEXPORT Matrix3 operator- ( const Matrix3 ) const
Remarks:
Perform matrix subtraction.
GEOMEXPORT Point3 PointTransform ( const Point3 p ) const
Remarks:
Returns the specified point transformed by this matrix.
Parameters:
const Point3& p

The point to transform by this matrix.
GEOMEXPORT Point3 VectorTransform ( const Point3 p ) const
Remarks:
Returns the specified vector transformed by this matrix.
Parameters:
const Point3& p

The vector to transform by this matrix.
GEOMEXPORT void TransformPoints ( Point3 array,
int  n,
int  stride = sizeof(Point3) 
)
Remarks:
Transforms the specified list of points with this matrix.
Parameters:
Point3 *array

The array of points to transform with this matrix.

int n

The number of points in the array.

int stride = sizeof(Point3)

The size of the increment used when moving to the next point. If you wish to transform an array of data objects which contain x, y, and z coordinates in order (such as a Point4, or a structure containing a Point3 as a member) you can specify a 'stride' value (for instance sizeof(data_object)).
GEOMEXPORT void TransformPoints ( const Point3 array,
Point3 to,
int  n,
int  stride = sizeof(Point3),
int  strideTo = sizeof(Point3) 
)
Remarks:
Transforms the specified list of points with this matrix and stores the resulting transformed points in the storage passed.
Parameters:
const Point3 *array

The array of points to transform (the source).

Point3 *to

The array to store the transformed points (the destination).

int n

The number of points in the source array.

int stride = sizeof(Point3)

int strideTo = sizeof(Point3)

The size increment used when moving to the next storage location.
GEOMEXPORT void TransformVectors ( Point3 array,
int  n,
int  stride = sizeof(Point3) 
)
Remarks:
Transforms the specified list of vectors with this matrix.
Parameters:
Point3 *array

The array of vectors to transform with this matrix.

int n

The number of vectors in the array.

int stride = sizeof(Point3)

The size of the increment used when moving to the next vector. If you wish to transform an array of data objects which contain x, y, and z coordinates in order (such as a Point4, or a structure containing a Point3 as a member) you can specify a 'stride' value (for instance sizeof(data_object)).
GEOMEXPORT void TransformVectors ( const Point3 array,
Point3 to,
int  n,
int  stride = sizeof(Point3),
int  strideTo = sizeof(Point3) 
)
Remarks:
Transforms the specified list of vectors with this matrix and stores the resulting transformed vectors in the storage passed.
Parameters:
const Point3 *array

The array of vectors to transform (the source).

Point3 *to

The array to store the transformed vectors (the destination).

int n

The number of vectors in the source array.

int stride = sizeof(Point3)

The size increment used when moving to the next source location.

int strideTo = sizeof(Point3)

The size increment used when moving to the next storage location.
GEOMEXPORT void GetYawPitchRoll ( float *  yaw,
float *  pitch,
float *  roll 
)
Remarks:
Retrieves the yaw, pitch and roll angles represented by the rotation in this matrix.
Parameters:
float *yaw

The yaw rotation angle is stored here (in radians).

float *pitch

The pitch rotation angle is stored here (in radians).

float *roll

The roll rotation angle is stored here (in radians).
Operators:
GEOMEXPORT IOResult Save ( ISave isave )
GEOMEXPORT IOResult Load ( ILoad iload )
GEOMEXPORT BOOL Parity ( ) const
Remarks:
Returns the 'parity' of the matrix. Scaling one axis of the matrix negatively switches the 'parity'. However if you scale two axis the parity will flip back. Scaling three axis switches the parity again.

When rendering a mesh, if you scale something along one axis, it turns 'inside out'. That is the direction when the normals are reversed. This method may be used to detect that case and then reverse the normals. The 3ds Max renderer does this -- if this method returns TRUE it flips all the normals so it won't turn inside out.

Friends And Related Function Documentation

friend class Quat [friend]
Matrix3 GEOMEXPORT RotateXMatrix ( float  angle ) [friend]
Remarks:
Builds a new matrix for use as a X rotation transformation.
Parameters:
float angle

Specifies the angle of rotation in radians.
Returns:
A new X rotation Matrix3.
Matrix3 GEOMEXPORT RotateYMatrix ( float  angle ) [friend]
Remarks:
Builds a new matrix for use as a Y rotation transformation.
Parameters:
float angle

Specifies the angle of rotation in radians.
Returns:
A new Y rotation Matrix3.
Matrix3 GEOMEXPORT RotateZMatrix ( float  angle ) [friend]
Remarks:
Builds a new matrix for use as a Z rotation transformation.
Parameters:
float angle

Specifies the angle of rotation in radians.
Returns:
A new Z rotation Matrix3.
Matrix3 GEOMEXPORT TransMatrix ( const Point3 p ) [friend]
Remarks:
Builds a new matrix for use as a translation transformation.
Parameters:
const Point3& p

Specifies the translation values.
Returns:
A new translation Matrix3.
Matrix3 GEOMEXPORT ScaleMatrix ( const Point3 s ) [friend]
Remarks:
Builds a new matrix for use as a scale transformation.
Parameters:
const Point3& p

Specifies the scale values.
Returns:
A new scale Matrix3.
Matrix3 GEOMEXPORT RotateYPRMatrix ( float  Yaw,
float  Pitch,
float  Roll 
) [friend]
Remarks:
Builds a new matrix for use as a rotation transformation by specifying yaw, pitch and roll angles.

This definition will depend on what our coordinate system is. This one is equivalent to:

M.IdentityMatrix();

M.RotateZ(roll);

M.RotateX(pitch);

M.RotateY(yaw);

Which presupposes Y is vertical, X is sideways, Z is forward
Parameters:
float Yaw

Specifies the yaw angle in radians.

float Pitch

Specifies the pitch angle in radians.

float Roll

Specifies the roll angle in radians.
Returns:
A new rotation Matrix3.
Matrix3 GEOMEXPORT RotAngleAxisMatrix ( Point3 axis,
float  angle 
) [friend]
Remarks:
Builds a new matrix for use as a rotation transformation by specifying an angle and axis.
Parameters:
Point3& axis

Specifies the axis of rotation. Note that this angle is expected to be normalized.

float angle

Specifies the angle of rotation. Note: The direction of the angle in this method is opposite of that in AngAxisFromQ().
Returns:
A new rotation Matrix3.
Matrix3 GEOMEXPORT Inverse ( const Matrix3 M ) [friend]
Remarks:
Return the inverse of the matrix
Parameters:
const Matrix3& M

The matrix to compute the inverse of.
Point3 GEOMEXPORT operator* ( const Matrix3 A,
const Point3 V 
) [friend]
Remarks:
These transform a Point3 with a Matrix3. These two versions of transforming a point with a matrix do the same thing, regardless of the order of operands (linear algebra rules notwithstanding).
Parameters:
const Matrix3& A

The matrix to transform the point with. const Point3& V

The point to transform.

Returns:
The transformed Point3.
Point3 GEOMEXPORT operator* ( const Point3 V,
const Matrix3 A 
) [friend]
Remarks:
These transform a Point3 with a Matrix3. These two versions of transforming a point with a matrix do the same thing, regardless of the order of operands (linear algebra rules notwithstanding).
Parameters:
const Point3& V

The point to transform.

const Matrix3& A

The matrix to transform the point with.
Returns:
The transformed Point3.
Point3 GEOMEXPORT VectorTransform ( const Matrix3 M,
const Point3 V 
) [friend]
Remarks:
Transform the vector (Point3) with the specified matrix.
Parameters:
const Matrix3& A

The matrix to transform the vector with.

const Point3& V

The vector to transform.
Returns:
The transformed vector (as a Point3).
Matrix3 GEOMEXPORT XFormMat ( const Matrix3 xm,
const Matrix3 m 
) [friend]
Remarks:
This method is used to build a matrix that constructs a transformation in a particular space. For example, say you have a rotation you want to apply, but you want to perform the rotation in another coordinate system. To do this, you typically transform into the space of the coordinate system, then apply the transformation, and then transform out of that coordinate system. This method constructs a matrix that does just this. It transformats matrix m so it is applied in the space of matrix xm. It returns a Matrix3 that is xm*m*Inverse(xm).
Parameters:
const Matrix3& xm

Specifies the coordinate system you want to work in.

const Matrix3& m

Specifies the transformation matrix.
Returns:
Returns a Matrix3 that is xm*m*Inverse(xm).
Point3 GEOMEXPORT VectorTransform ( const Point3 V,
const Matrix3 M 
) [friend]

Member Data Documentation

const Matrix3 Identity [static]

Matrix3 Matrix3 Matrix3 Matrix3 Matrix3 Matrix3 Matrix3 Matrix3 Matrix3 Matrix3
Matrix3 Matrix3 Matrix3 Matrix3 Matrix3 Matrix3 Matrix3 Matrix3 Matrix3 Matrix3