World of Rigid Bodies (WoRB)
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines
WoRB::QTensor Class Reference

Encapsulates a quaternionic tensor (q-tensor) as a 4x4 row-major matrix. More...

#include <QTensor.h>

Collaboration diagram for WoRB::QTensor:

Data Structures

struct  Components
 Represents tensor components in a column-major order. More...

Public Member Functions

Indexing operators
double & operator[] (unsigned index)
Components setters
QTensorSetComponents (double valueForAllComponents)
 Sets all components to the same value.
QTensorSetColumnVectors (const Quaternion &v1, const Quaternion &v2, const Quaternion &v3)
 Sets the q-tensor values from the given three vector components.
QTensorSetSkewSymmetric (const Quaternion &q)
 Sets the matrix to be a skew symmetric matrix based on the given quaternion.
QTensorSetLeftMultiplier (const Quaternion &q)
 Sets the q-tensor to represent a "left-multiplier quaternion" matrix L(q).
QTensorSetRightMultiplier (const Quaternion &q)
 Sets the q-tensor to represent a "right-multiplier quaternion" matrix R(q).
QTensorSetFromOrientationAndPosition (const Quaternion &q, const Quaternion &translate)
 Creates a transform matrix from a position and orientation.
Components getters
Quaternion Row (unsigned i) const
 Gets a quaternion representing one row in the matrix.
Quaternion Column (unsigned j) const
 Gets a quaternion representing one unit base vector (axis).
void GetGLTransform (double d[Length]) const
 Gets an OpenGL transform representing a combined translation and rotation.
Unary operations
QTensor operator- () const
 Flips signs of all the components of the matrix.
Binary operations
QTensor operator+ (const QTensor &T)
 Does a component-wise addition of this matrix and other matrix.
QTensoroperator+= (const QTensor &T)
 Does a component-wise addition of this matrix and other matrix.
QTensor operator- (const QTensor &T)
 Does a component-wise subtraction of this matrix and other matrix.
QTensoroperator-= (const QTensor &T)
 Does a component-wise subtraction of this matrix and other matrix.
QTensor operator* (double scalar) const
 Multiplies this matrix by the given scalar.
QTensoroperator*= (double scalar)
 Multiplies this matrix by the given scalar.
Quaternion operator* (const Quaternion &q) const
 Transform the vector part of a quaternion by this matrix.
QTensor operator* (const QTensor &T) const
 Returns a q-tensor which is this matrix multiplied by the given other q-tensor.
QTensoroperator*= (const QTensor &T)
 Multiplies this matrix in place by the given other matrix.
Transpose and related methods
QTensorSetTransposeOf (const QTensor &T)
 Sets the matrix to be the transpose of the given matrix.
QTensor Transpose () const
 Returns a new matrix containing the transpose of this matrix.
Determinant, matrix Inverse and related methods
double Determinant () const
 Returns the determinant of the matrix.
QTensorSetInverseOf (const QTensor &T)
 Sets the matrix to be the inverse of the given matrix.
QTensor Inverse () const
 Returns a new matrix containing the inverse of this matrix.
Spatial transformations related methods
Quaternion operator() (const Quaternion &q) const
 Transform the vector part of a quaternion by this matrix.
Quaternion TransformInverse (const Quaternion &q) const
 Transform the given quaternion by the inverse of this matrix.
QTensor operator() (const QTensor &T) const
 Transforms a tensor from one to another frame of reference.
QTensor TransformInverse (const QTensor &T) const
 Transform the given matrix by the inverse of this matrix.

Data Fields

Components m
 Holds the tensor components as a column-major matrix.
double data [Length]
 Holds the contigous memory array of the components.
Q-Tensor components
union {
   Components   m
 Holds the tensor components as a column-major matrix.
   double   data [Length]
 Holds the contigous memory array of the components.
}; 

Static Private Attributes

static const int Length = 16
 Number of components.

Constructors and assignment operators

enum  Initializer { Uninitialized, Normalized, Zero, Identity }
 Represents type of initial matrix data for QTensor constructor. More...
 QTensor (Initializer type=Normalized)
 Creates a tensor with initial contents according to the given type.
 QTensor (const Quaternion &q)
 Sets the main diagonal with quaternion components.
 QTensor (double xx, double yy, double zz, double ww=1.0)
 Sets the matrix with values along the main diagonal.
QTensoroperator= (double valueOnDiagonal)
 Sets the main diagonal with the given value.

Detailed Description

Encapsulates a quaternionic tensor (q-tensor) as a 4x4 row-major matrix.

Note:
The QTensor class is implemented with inline methods only.

Definition at line 24 of file QTensor.h.


Member Enumeration Documentation

Represents type of initial matrix data for QTensor constructor.

Enumerator:
Uninitialized 

Matrix with uninitialized components.

Normalized 

Matrix with m.ww = 1 and other components set to zero.

Zero 

Matrix with all components set to zero.

Identity 

Identity matrix, i.e. 1 on the main diagonal.

Definition at line 73 of file QTensor.h.

        {
            Uninitialized,  //!< Matrix with uninitialized components
            Normalized,     //!< Matrix with m.ww = 1 and other components set to zero
            Zero,           //!< Matrix with all components set to zero
            Identity        //!< Identity matrix, i.e. 1 on the main diagonal
        };

Constructor & Destructor Documentation

Creates a tensor with initial contents according to the given type.

Definition at line 83 of file QTensor.h.

References Identity, m, Normalized, SetComponents(), Uninitialized, WoRB::QTensor::Components::ww, WoRB::QTensor::Components::xx, WoRB::QTensor::Components::yy, Zero, and WoRB::QTensor::Components::zz.

Referenced by Inverse(), and Transpose().

        {
            switch( type )
            {
                case Uninitialized:
                    break;

                case Normalized:
                    SetComponents( 0 );
                    m.ww = 1.0;
                    break;

                case Zero:
                    SetComponents( 0 );
                    break;

                case Identity:
                    SetComponents( 0 );
                    m.xx = m.yy = m.zz = m.ww = 1.0;
                    break;
            }
        }
WoRB::QTensor::QTensor ( const Quaternion q) [inline]

Sets the main diagonal with quaternion components.

Definition at line 108 of file QTensor.h.

References m, SetComponents(), WoRB::Quaternion::w, WoRB::QTensor::Components::ww, WoRB::Quaternion::x, WoRB::QTensor::Components::xx, WoRB::Quaternion::y, WoRB::QTensor::Components::yy, WoRB::Quaternion::z, and WoRB::QTensor::Components::zz.

        {
            SetComponents( 0 );
            m.xx = q.x;
            m.yy = q.y;
            m.zz = q.z;
            m.ww = q.w;
        }
WoRB::QTensor::QTensor ( double  xx,
double  yy,
double  zz,
double  ww = 1.0 
) [inline]

Sets the matrix with values along the main diagonal.

Definition at line 119 of file QTensor.h.

References m, SetComponents(), WoRB::QTensor::Components::ww, WoRB::QTensor::Components::xx, WoRB::QTensor::Components::yy, and WoRB::QTensor::Components::zz.

        {
            SetComponents( 0 );
            m.xx = xx;
            m.yy = yy;
            m.zz = zz;
            m.ww = ww;
        }

Member Function Documentation

Quaternion WoRB::QTensor::Column ( unsigned  j) const [inline]

Gets a quaternion representing one unit base vector (axis).

Axis vectors are columns in the matrix. Axis with index 3 corresponds to the position of the transform matrix.

Parameters:
jColumn index

Definition at line 260 of file QTensor.h.

References data.

Referenced by WoRB::Geometry::Axis(), and WoRB::Geometry::Position().

        {
            const double* p = data + j * 4;
            return Quaternion( p[3], p[0], p[1], p[2] );
        }
void WoRB::QTensor::GetGLTransform ( double  d[Length]) const [inline]

Gets an OpenGL transform representing a combined translation and rotation.

Definition at line 268 of file QTensor.h.

References data, and Length.

Referenced by WoRB::GLTransform::GLTransform(), and WoRB_TestBed::Simulate().

        {
            // We can do simple memcpy since GL also use column-major matrix.
            //
            for ( int i = 0 ; i < Length; ++i ) {
                d[i] = data[i];
            }

            // Otherwise, we should setup GL matrix explicitly:
            // d[0] =  m.xx ;   d[4] =  m.xy ;   d[ 8] =  m.xz ;   d[12] =  m.xw ;
            // d[1] =  m.yx ;   d[5] =  m.yy ;   d[ 9] =  m.yz ;   d[13] =  m.yw ;
            // d[2] =  m.zx ;   d[6] =  m.zy ;   d[10] =  m.zz ;   d[14] =  m.zw ;
            // d[3] =  m.wx ;   d[7] =  m.wy ;   d[11] =  m.wz ;   d[15] =  m.ww ;
        }
QTensor WoRB::QTensor::Inverse ( ) const [inline]

Returns a new matrix containing the inverse of this matrix.

Definition at line 509 of file QTensor.h.

References QTensor(), and Uninitialized.

Referenced by WoRB::RigidBody::CalculateDerivedQuantities(), and WoRB::Collision::GetImpulse_IncludeFriction().

        {
            return QTensor( Uninitialized ).SetInverseOf( *this );
        }
Quaternion WoRB::QTensor::operator() ( const Quaternion q) const [inline]
QTensor WoRB::QTensor::operator() ( const QTensor T) const [inline]

Transforms a tensor from one to another frame of reference.

Equivalent to: result = (*this) * T * Transpose()

Definition at line 546 of file QTensor.h.

References m, Uninitialized, WoRB::QTensor::Components::ww, WoRB::QTensor::Components::wx, WoRB::QTensor::Components::wy, WoRB::QTensor::Components::xw, WoRB::QTensor::Components::xx, WoRB::QTensor::Components::xy, WoRB::QTensor::Components::xz, WoRB::QTensor::Components::yw, WoRB::QTensor::Components::yx, WoRB::QTensor::Components::yy, WoRB::QTensor::Components::yz, WoRB::QTensor::Components::zw, WoRB::QTensor::Components::zx, WoRB::QTensor::Components::zy, and WoRB::QTensor::Components::zz.

        {
            QTensor result( Uninitialized );

            double t_xx =  m.xx * T.m.xx  +  m.xy * T.m.yx  +  m.xz * T.m.zx ;
            double t_xy =  m.xx * T.m.xy  +  m.xy * T.m.yy  +  m.xz * T.m.zy ;
            double t_xz =  m.xx * T.m.xz  +  m.xy * T.m.yz  +  m.xz * T.m.zz ;

            double t_yx =  m.yx * T.m.xx  +  m.yy * T.m.yx  +  m.yz * T.m.zx ;
            double t_yy =  m.yx * T.m.xy  +  m.yy * T.m.yy  +  m.yz * T.m.zy ;
            double t_yz =  m.yx * T.m.xz  +  m.yy * T.m.yz  +  m.yz * T.m.zz ;

            double t_zx =  m.zx * T.m.xx  +  m.zy * T.m.yx  +  m.zz * T.m.zx ;
            double t_zy =  m.zx * T.m.xy  +  m.zy * T.m.yy  +  m.zz * T.m.zy ;
            double t_zz =  m.zx * T.m.xz  +  m.zy * T.m.yz  +  m.zz * T.m.zz ;

            result.m.xx =  t_xx * m.xx    +  t_xy * m.xy    +  t_xz * m.xz   ;
            result.m.xy =  t_xx * m.yx    +  t_xy * m.yy    +  t_xz * m.yz   ;
            result.m.xz =  t_xx * m.zx    +  t_xy * m.zy    +  t_xz * m.zz   ;
            result.m.xw =  0                                                 ;

            result.m.yx =  t_yx * m.xx    +  t_yy * m.xy    +  t_yz * m.xz   ;
            result.m.yy =  t_yx * m.yx    +  t_yy * m.yy    +  t_yz * m.yz   ;
            result.m.yz =  t_yx * m.zx    +  t_yy * m.zy    +  t_yz * m.zz   ;
            result.m.yw =  0                                                 ;

            result.m.zx =  t_zx * m.xx    +  t_zy * m.xy    +  t_zz * m.xz   ;
            result.m.zy =  t_zx * m.yx    +  t_zy * m.yy    +  t_zz * m.yz   ;
            result.m.zz =  t_zx * m.zx    +  t_zy * m.zy    +  t_zz * m.zz   ;
            result.m.zw =  0                                                 ;

            result.m.wx = result.m.wy = result.m.ww = 0;
            result.m.ww = 1;

            return result;
        }
QTensor WoRB::QTensor::operator* ( double  scalar) const [inline]

Multiplies this matrix by the given scalar.

Definition at line 350 of file QTensor.h.

References data, Length, and Uninitialized.

        {
            QTensor result( Uninitialized );

            for ( int i = 0; i < Length; ++i ) {
                result.data[i] = data[i] * scalar;
            }
            return result;
        }
Quaternion WoRB::QTensor::operator* ( const Quaternion q) const [inline]
QTensor WoRB::QTensor::operator* ( const QTensor T) const [inline]

Returns a q-tensor which is this matrix multiplied by the given other q-tensor.

Definition at line 384 of file QTensor.h.

References m, Uninitialized, WoRB::QTensor::Components::ww, WoRB::QTensor::Components::wx, WoRB::QTensor::Components::wy, WoRB::QTensor::Components::wz, WoRB::QTensor::Components::xw, WoRB::QTensor::Components::xx, WoRB::QTensor::Components::xy, WoRB::QTensor::Components::xz, WoRB::QTensor::Components::yw, WoRB::QTensor::Components::yx, WoRB::QTensor::Components::yy, WoRB::QTensor::Components::yz, WoRB::QTensor::Components::zw, WoRB::QTensor::Components::zx, WoRB::QTensor::Components::zy, and WoRB::QTensor::Components::zz.

        {
            QTensor result( Uninitialized );

            result.m.xx =  m.xx * T.m.xx  +  m.xy * T.m.yx  +  m.xz * T.m.zx          ;
            result.m.xy =  m.xx * T.m.xy  +  m.xy * T.m.yy  +  m.xz * T.m.zy          ;
            result.m.xz =  m.xx * T.m.xz  +  m.xy * T.m.yz  +  m.xz * T.m.zz          ;
            result.m.xw =  m.xx * T.m.xw  +  m.xy * T.m.yw  +  m.xz * T.m.zw  +  m.xw ;

            result.m.yx =  m.yx * T.m.xx  +  m.yy * T.m.yx  +  m.yz * T.m.zx          ;
            result.m.yy =  m.yx * T.m.xy  +  m.yy * T.m.yy  +  m.yz * T.m.zy          ;
            result.m.yz =  m.yx * T.m.xz  +  m.yy * T.m.yz  +  m.yz * T.m.zz          ;
            result.m.yw =  m.yx * T.m.xw  +  m.yy * T.m.yw  +  m.yz * T.m.zw  +  m.yw ;

            result.m.zx =  m.zx * T.m.xx  +  m.zy * T.m.yx  +  m.zz * T.m.zx          ;
            result.m.zy =  m.zx * T.m.xy  +  m.zy * T.m.yy  +  m.zz * T.m.zy          ;
            result.m.zz =  m.zx * T.m.xz  +  m.zy * T.m.yz  +  m.zz * T.m.zz          ;
            result.m.zw =  m.zx * T.m.xw  +  m.zy * T.m.yw  +  m.zz * T.m.zw  +  m.zw ;

            result.m.wx = result.m.wy = result.m.wz = 0;
            result.m.ww = 1;

            return result;
        }
QTensor& WoRB::QTensor::operator*= ( double  scalar) [inline]

Multiplies this matrix by the given scalar.

Definition at line 362 of file QTensor.h.

References data, and Length.

        {
            for ( int i = 0; i < Length; ++i ) {
                data[i] *= scalar;
            }
            return *this;
        }
QTensor& WoRB::QTensor::operator*= ( const QTensor T) [inline]

Multiplies this matrix in place by the given other matrix.

Definition at line 411 of file QTensor.h.

        {
            return *this = *this * T;
        }
QTensor WoRB::QTensor::operator+ ( const QTensor T) [inline]

Does a component-wise addition of this matrix and other matrix.

Definition at line 306 of file QTensor.h.

References data, Length, and Uninitialized.

        {
            QTensor result( Uninitialized );

            for ( int i = 0; i < Length; ++i ) {
                result.data[i] = data[i] + T.data[i];
            }
            return result;
        }
QTensor& WoRB::QTensor::operator+= ( const QTensor T) [inline]

Does a component-wise addition of this matrix and other matrix.

Definition at line 318 of file QTensor.h.

References data, and Length.

        {
            for ( int i = 0; i < Length; ++i ) {
                data[i] += T.data[i];
            }
            return *this;
        }
QTensor WoRB::QTensor::operator- ( ) const [inline]

Flips signs of all the components of the matrix.

Definition at line 289 of file QTensor.h.

References data, Length, and Uninitialized.

        {
            QTensor result( Uninitialized );

            for ( int i = 0; i < Length; ++i ) {
                result.data[i] = - data[i];
            }

            return result;
        }
QTensor WoRB::QTensor::operator- ( const QTensor T) [inline]

Does a component-wise subtraction of this matrix and other matrix.

Definition at line 328 of file QTensor.h.

References data, Length, and Uninitialized.

        {
            QTensor result( Uninitialized );

            for ( int i = 0; i < Length; ++i ) {
                result.data[i] = data[i] - T.data[i];
            }
            return result;
        }
QTensor& WoRB::QTensor::operator-= ( const QTensor T) [inline]

Does a component-wise subtraction of this matrix and other matrix.

Definition at line 340 of file QTensor.h.

References data, and Length.

        {
            for ( int i = 0; i < Length; ++i ) {
                data[i] -= T.data[i];
            }
            return *this;
        }
QTensor& WoRB::QTensor::operator= ( double  valueOnDiagonal) [inline]

Sets the main diagonal with the given value.

Definition at line 130 of file QTensor.h.

References m, SetComponents(), WoRB::QTensor::Components::ww, WoRB::QTensor::Components::xx, WoRB::QTensor::Components::yy, and WoRB::QTensor::Components::zz.

        {
            SetComponents( 0 );
            m.xx = m.yy = m.zz = m.ww = valueOnDiagonal;
            return *this;
        }
double& WoRB::QTensor::operator[] ( unsigned  index) [inline]

Definition at line 141 of file QTensor.h.

References m, and WoRB::QTensor::Components::xx.

        {
            return *( &m.xx + index );
        }
Quaternion WoRB::QTensor::Row ( unsigned  i) const [inline]

Gets a quaternion representing one row in the matrix.

Parameters:
iRow index

Definition at line 250 of file QTensor.h.

References data.

        {
            const double* p = data;
            return Quaternion( p[i+12], p[i], p[i+4], p[i+8] );
        }
QTensor& WoRB::QTensor::SetComponents ( double  valueForAllComponents) [inline]

Sets all components to the same value.

Definition at line 152 of file QTensor.h.

References data, and Length.

Referenced by operator=(), QTensor(), and SetInverseOf().

        {
            for ( int i = 0; i < Length; ++i ) {
                data[i] = valueForAllComponents;
            }
            return *this;
        }
QTensor& WoRB::QTensor::SetFromOrientationAndPosition ( const Quaternion q,
const Quaternion translate 
) [inline]

Creates a transform matrix from a position and orientation.

This is so called Shoemake's matrix, which is obtained as L(q) * R(q*). See "Rotation of Moment of Inertia Tensor" Mathematica notebook by MBK.

Definition at line 221 of file QTensor.h.

References m, WoRB::Quaternion::w, WoRB::QTensor::Components::ww, WoRB::QTensor::Components::wx, WoRB::QTensor::Components::wy, WoRB::QTensor::Components::wz, WoRB::Quaternion::x, WoRB::QTensor::Components::xw, WoRB::QTensor::Components::xx, WoRB::QTensor::Components::xy, WoRB::QTensor::Components::xz, WoRB::Quaternion::y, WoRB::QTensor::Components::yw, WoRB::QTensor::Components::yx, WoRB::QTensor::Components::yy, WoRB::QTensor::Components::yz, WoRB::Quaternion::z, WoRB::QTensor::Components::zw, WoRB::QTensor::Components::zx, WoRB::QTensor::Components::zy, and WoRB::QTensor::Components::zz.

Referenced by WoRB::RigidBody::CalculateDerivedQuantities().

        {
            m.xx =  1 - 2 * (  q.y * q.y  +  q.z * q.z  ) ;
            m.xy =      2 * (  q.x * q.y  -  q.w * q.z  ) ;
            m.xz =      2 * (  q.x * q.z  +  q.w * q.y  ) ;
            m.xw =  translate.x;

            m.yx =      2 * (  q.x * q.y  +  q.w * q.z  ) ;
            m.yy =  1 - 2 * (  q.x * q.x  +  q.z * q.z  ) ;
            m.yz =      2 * (  q.y * q.z  -  q.w * q.x  ) ;
            m.yw =  translate.y;

            m.zx =      2 * (  q.x * q.z  -  q.w * q.y  ) ;
            m.zy =      2 * (  q.y * q.z  +  q.w * q.x  ) ;
            m.zz =  1 - 2 * (  q.x * q.x  +  q.y * q.y  ) ;
            m.zw =  translate.z;

            m.wx = m.wy = m.wz = 0;  m.ww = 1;

            return *this;
        }
QTensor& WoRB::QTensor::SetInverseOf ( const QTensor T) [inline]

Sets the matrix to be the inverse of the given matrix.

Definition at line 457 of file QTensor.h.

References data, Determinant(), Length, m, SetComponents(), WoRB::QTensor::Components::xw, WoRB::QTensor::Components::xx, WoRB::QTensor::Components::xy, WoRB::QTensor::Components::xz, WoRB::QTensor::Components::yw, WoRB::QTensor::Components::yx, WoRB::QTensor::Components::yy, WoRB::QTensor::Components::yz, WoRB::QTensor::Components::zw, WoRB::QTensor::Components::zx, WoRB::QTensor::Components::zy, and WoRB::QTensor::Components::zz.

Referenced by WoRB::RigidBody::SetMomentOfInertia().

        {
            double det_T = T.Determinant();

            // Make sure the determinant is non-zero.
            //
            if ( det_T == 0 ) {
                SetComponents( 0 );
                return *this;
            }

            m.xx =  - T.m.zy * T.m.yz  +  T.m.yy * T.m.zz;
            m.yx =    T.m.zx * T.m.yz  -  T.m.yx * T.m.zz;
            m.zx =  - T.m.zx * T.m.yy  +  T.m.yx * T.m.zy;

            m.xy =    T.m.zy * T.m.xz  -  T.m.xy * T.m.zz;
            m.yy =  - T.m.zx * T.m.xz  +  T.m.xx * T.m.zz;
            m.zy =    T.m.zx * T.m.xy  -  T.m.xx * T.m.zy;

            m.xz =  - T.m.yy * T.m.xz  +  T.m.xy * T.m.yz;
            m.yz =    T.m.yx * T.m.xz  -  T.m.xx * T.m.yz;
            m.zz =  - T.m.yx * T.m.xy  +  T.m.xx * T.m.yy;

            m.xw =    T.m.zy * T.m.yz * T.m.xw
                    - T.m.yy * T.m.zz * T.m.xw
                    - T.m.zy * T.m.xz * T.m.yw
                    + T.m.xy * T.m.zz * T.m.yw
                    + T.m.yy * T.m.xz * T.m.zw
                    - T.m.xy * T.m.yz * T.m.zw;

            m.yw =  - T.m.zx * T.m.yz * T.m.xw
                    + T.m.yx * T.m.zz * T.m.xw
                    + T.m.zx * T.m.xz * T.m.yw
                    - T.m.xx * T.m.zz * T.m.yw
                    - T.m.yx * T.m.xz * T.m.zw
                    + T.m.xx * T.m.yz * T.m.zw;

            m.zw =   T.m.zx * T.m.yy * T.m.xw
                   - T.m.yx * T.m.zy * T.m.xw
                   - T.m.zx * T.m.xy * T.m.yw
                   + T.m.xx * T.m.zy * T.m.yw
                   + T.m.yx * T.m.xy * T.m.zw
                   - T.m.xx * T.m.yy * T.m.zw;

            for ( int i = 0; i < Length; ++ i ) {
                data[i] /= det_T;
            }
            return *this;
        }

Sets the q-tensor to represent a "left-multiplier quaternion" matrix L(q).

See "Rotation of Moment of Inertia Tensor" Mathematica notebook by MBK.

Definition at line 192 of file QTensor.h.

References m, WoRB::Quaternion::w, WoRB::QTensor::Components::ww, WoRB::QTensor::Components::wx, WoRB::QTensor::Components::wy, WoRB::QTensor::Components::wz, WoRB::Quaternion::x, WoRB::QTensor::Components::xw, WoRB::QTensor::Components::xx, WoRB::QTensor::Components::xy, WoRB::QTensor::Components::xz, WoRB::Quaternion::y, WoRB::QTensor::Components::yw, WoRB::QTensor::Components::yx, WoRB::QTensor::Components::yy, WoRB::QTensor::Components::yz, WoRB::Quaternion::z, WoRB::QTensor::Components::zw, WoRB::QTensor::Components::zx, WoRB::QTensor::Components::zy, and WoRB::QTensor::Components::zz.

        {
            m.xx =  q.w ;   m.xy = -q.z ;   m.xz =  q.y ;   m.xw = q.x ;
            m.yx =  q.z ;   m.yy =  q.w ;   m.yz = -q.x ;   m.yw = q.y ;
            m.zx = -q.y ;   m.zy =  q.x ;   m.zz =  q.w ;   m.zw = q.z ;
            m.wx = -q.x ;   m.wy = -q.y ;   m.wz = -q.z ;   m.ww = q.w ;

            return *this;
        }

Sets the q-tensor to represent a "right-multiplier quaternion" matrix R(q).

See "Rotation of Moment of Inertia Tensor" Mathematica notebook by MBK.

Definition at line 206 of file QTensor.h.

References m, WoRB::Quaternion::w, WoRB::QTensor::Components::ww, WoRB::QTensor::Components::wx, WoRB::QTensor::Components::wy, WoRB::QTensor::Components::wz, WoRB::Quaternion::x, WoRB::QTensor::Components::xw, WoRB::QTensor::Components::xx, WoRB::QTensor::Components::xy, WoRB::QTensor::Components::xz, WoRB::Quaternion::y, WoRB::QTensor::Components::yw, WoRB::QTensor::Components::yx, WoRB::QTensor::Components::yy, WoRB::QTensor::Components::yz, WoRB::Quaternion::z, WoRB::QTensor::Components::zw, WoRB::QTensor::Components::zx, WoRB::QTensor::Components::zy, and WoRB::QTensor::Components::zz.

        {
            m.xx =  q.w ;   m.xy =  q.z ;   m.xz = -q.y ;   m.xw = q.x ;
            m.yx = -q.z ;   m.yy =  q.w ;   m.yz =  q.x ;   m.yw = q.y ;
            m.zx =  q.y ;   m.zy = -q.x ;   m.zz =  q.w ;   m.zw = q.z ;
            m.wx = -q.x ;   m.wy = -q.y ;   m.wz = -q.z ;   m.ww = q.w ;

            return *this;
        }
QTensor& WoRB::QTensor::SetTransposeOf ( const QTensor T) [inline]

Sets the matrix to be the transpose of the given matrix.

Definition at line 422 of file QTensor.h.

References m, WoRB::QTensor::Components::ww, WoRB::QTensor::Components::wx, WoRB::QTensor::Components::wy, WoRB::QTensor::Components::wz, WoRB::QTensor::Components::xw, WoRB::QTensor::Components::xx, WoRB::QTensor::Components::xy, WoRB::QTensor::Components::xz, WoRB::QTensor::Components::yw, WoRB::QTensor::Components::yx, WoRB::QTensor::Components::yy, WoRB::QTensor::Components::yz, WoRB::QTensor::Components::zw, WoRB::QTensor::Components::zx, WoRB::QTensor::Components::zy, and WoRB::QTensor::Components::zz.

        {
            m.xx = T.m.xx ;   m.xy =  T.m.yx ;   m.xz =  T.m.zx ;   m.xw =  T.m.wx ;
            m.yx = T.m.xy ;   m.yy =  T.m.yy ;   m.yz =  T.m.zy ;   m.yw =  T.m.wy ;
            m.zx = T.m.xz ;   m.zy =  T.m.yz ;   m.zz =  T.m.zz ;   m.zw =  T.m.wz ;
            m.wx = T.m.xw ;   m.wy =  T.m.yw ;   m.wz =  T.m.zw ;   m.ww =  T.m.ww ;

            return *this;
        }
QTensor WoRB::QTensor::TransformInverse ( const QTensor T) const [inline]

Transform the given matrix by the inverse of this matrix.

Equivalent to: result = Transpose() * T * (*this)

Definition at line 587 of file QTensor.h.

References m, Uninitialized, WoRB::QTensor::Components::ww, WoRB::QTensor::Components::wx, WoRB::QTensor::Components::wy, WoRB::QTensor::Components::xw, WoRB::QTensor::Components::xx, WoRB::QTensor::Components::xy, WoRB::QTensor::Components::xz, WoRB::QTensor::Components::yw, WoRB::QTensor::Components::yx, WoRB::QTensor::Components::yy, WoRB::QTensor::Components::yz, WoRB::QTensor::Components::zw, WoRB::QTensor::Components::zx, WoRB::QTensor::Components::zy, and WoRB::QTensor::Components::zz.

        {
            QTensor result( Uninitialized );

            double t_xx =  m.xx * T.m.xx  +  m.yx * T.m.yx  +  m.zx * T.m.zx ;
            double t_xy =  m.xx * T.m.xy  +  m.yx * T.m.yy  +  m.zx * T.m.zy ;
            double t_xz =  m.xx * T.m.xz  +  m.yx * T.m.yz  +  m.zx * T.m.zz ;

            double t_yx =  m.xy * T.m.xx  +  m.yy * T.m.yx  +  m.zy * T.m.zx ;
            double t_yy =  m.xy * T.m.xy  +  m.yy * T.m.yy  +  m.zy * T.m.zy ;
            double t_yz =  m.xy * T.m.xz  +  m.yy * T.m.yz  +  m.zy * T.m.zz ;

            double t_zx =  m.xz * T.m.xx  +  m.yz * T.m.yx  +  m.zz * T.m.zx ;
            double t_zy =  m.xz * T.m.xy  +  m.yz * T.m.yy  +  m.zz * T.m.zy ;
            double t_zz =  m.xz * T.m.xz  +  m.yz * T.m.yz  +  m.zz * T.m.zz ;

            result.m.xx =  t_xx * m.xx    +  t_xy * m.yx    +  t_xz * m.zx   ;
            result.m.xy =  t_xx * m.xy    +  t_xy * m.yy    +  t_xz * m.zy   ;
            result.m.xz =  t_xx * m.xz    +  t_xy * m.yz    +  t_xz * m.zz   ;
            result.m.xw =  0                                                 ;

            result.m.yx =  t_yx * m.xx    +  t_yy * m.yx    +  t_yz * m.zx   ;
            result.m.yy =  t_yx * m.xy    +  t_yy * m.yy    +  t_yz * m.zy   ;
            result.m.yz =  t_yx * m.xz    +  t_yy * m.yz    +  t_yz * m.zz   ;
            result.m.yw =  0                                                 ;

            result.m.zx =  t_zx * m.xx    +  t_zy * m.yx    +  t_zz * m.zx   ;
            result.m.zy =  t_zx * m.xy    +  t_zy * m.yy    +  t_zz * m.zy   ;
            result.m.zz =  t_zx * m.xz    +  t_zy * m.yz    +  t_zz * m.zz   ;
            result.m.zw =  0                                                 ;

            result.m.wx = result.m.wy = result.m.ww = 0;
            result.m.ww = 1;

            return result;
        }
QTensor WoRB::QTensor::Transpose ( ) const [inline]

Returns a new matrix containing the transpose of this matrix.

Definition at line 434 of file QTensor.h.

References QTensor(), and Uninitialized.

        {
            return QTensor( Uninitialized ).SetTransposeOf( *this );
        }

Field Documentation

union { ... }

Holds the contigous memory array of the components.

Definition at line 64 of file QTensor.h.

Referenced by Column(), GetGLTransform(), operator*(), operator*=(), operator+(), operator+=(), operator-(), operator-=(), Row(), SetComponents(), and SetInverseOf().

const int WoRB::QTensor::Length = 16 [static, private]

Number of components.

Definition at line 26 of file QTensor.h.

Referenced by GetGLTransform(), operator*(), operator*=(), operator+(), operator+=(), operator-(), operator-=(), SetComponents(), and SetInverseOf().


The documentation for this class was generated from the following file: