decomp.h File Reference

#include "maxheap.h"
#include "point3.h"
#include "quat.h"

Classes

struct  AffineParts
 

Functions

CoreExport void SpectralDecomp (Matrix3 m, Point3 &s, Quat &q)
 
CoreExport void decomp_affine (Matrix3 A, AffineParts *parts)
 
CoreExport void invert_affine (AffineParts *parts, AffineParts *inverse)
 

Function Documentation

CoreExport void SpectralDecomp ( Matrix3  m,
Point3 s,
Quat q 
)
Remarks
This is another way to decompose a matrix into the scale and rotation parts (the position part can be retrieved from the bottom row of the matrix). This does not return correct results for off axis scale.
Parameters:
Matrix3 m
The input matrix to decompose.

Point3 &s
The scale from the matrix.

Quat& q
The rotation of the matrix.
CoreExport void decomp_affine ( Matrix3  A,
AffineParts parts 
)
Remarks
This will decompose a matrix into the translation, rotation and scale components and store the results in the AffineParts structure passed. This will return correct results for off axis scale. This is a fairly computationally intensive iterative solution operation.
Parameters:
Matrix3 A
The input matrix to decompose.

AffineParts *parts
The result. See above.

Sample Code:
Note: If you want to rebuild a Matrix3 from the decomposed parts you get back from decomp_affine() the important thing is the order the parts are combined.

Consider the following matrices constructed from the various affine parts:
ptm = position component (t)
rtm = "essential" rotation (q)
srtm = "stretch" rotation (u)
stm = scale component (k)
ftm = the flip tm -> ScaleMatrix(Point3(ap.f,ap.f,ap.f));

Here's the correct way of reassembling the decomposed matrix:
1 Matrix3 srtm, rtm, ptm, stm, ftm;
2 ptm.IdentityMatrix();
3 ptm.SetTrans(ap.t);
4 ap.q.MakeMatrix(rtm);
5 ap.u.MakeMatrix(srtm);
6 stm = ScaleMatrix(ap.k);
7 mat = Inverse(srtm) * stm * srtm * rtm * ftm * ptm;
CoreExport void invert_affine ( AffineParts parts,
AffineParts inverse 
)
Remarks
This is used to take the AffineParts and inverts them. This gives you the equivalent parts for the inverse matrix.
Parameters:
AffineParts *parts
The input AffineParts pointer.

AffineParts *inverse
The inverse of parts.