173 lines
No EOL
8.6 KiB
C++
173 lines
No EOL
8.6 KiB
C++
#include "stdafx.h"
|
||
#include "EtMatrixEx.h"
|
||
|
||
#ifdef _DEBUG
|
||
#define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
|
||
#endif
|
||
|
||
MatrixEx::MatrixEx()
|
||
{
|
||
Identity();
|
||
}
|
||
|
||
MatrixEx::MatrixEx( const EtMatrix &Matrix )
|
||
{
|
||
*( EtMatrix * )this = Matrix;
|
||
}
|
||
|
||
void MatrixEx::Identity()
|
||
{
|
||
EtMatrixIdentity( ( EtMatrix * )this );
|
||
}
|
||
|
||
void MatrixEx::RotateYaw( float fAngle )
|
||
{
|
||
EtMatrix matRotYaw;
|
||
EtMatrixRotationAxis( &matRotYaw, &m_vYAxis, -D3DXToRadian(fAngle) );
|
||
EtVec3TransformNormal( &m_vXAxis, &m_vXAxis, &matRotYaw );
|
||
EtVec3Normalize( &m_vXAxis, &m_vXAxis );
|
||
EtVec3TransformNormal( &m_vZAxis, &m_vZAxis, &matRotYaw );
|
||
EtVec3Normalize( &m_vZAxis, &m_vZAxis );
|
||
}
|
||
|
||
void MatrixEx::RotateRoll( float fAngle )
|
||
{
|
||
EtMatrix matRotRoll;
|
||
EtMatrixRotationAxis( &matRotRoll, &m_vZAxis, -D3DXToRadian( fAngle ) );
|
||
EtVec3TransformNormal( &m_vXAxis, &m_vXAxis, &matRotRoll );
|
||
EtVec3Normalize(&m_vXAxis, &m_vXAxis);
|
||
EtVec3TransformNormal( &m_vYAxis, &m_vYAxis, &matRotRoll );
|
||
EtVec3Normalize(&m_vYAxis, &m_vYAxis);
|
||
}
|
||
|
||
void MatrixEx::RotatePitch( float fAngle )
|
||
{
|
||
EtMatrix matRotPitch;
|
||
EtMatrixRotationAxis( &matRotPitch, &m_vXAxis, D3DXToRadian( fAngle ) );
|
||
EtVec3TransformNormal( &m_vYAxis, &m_vYAxis, &matRotPitch );
|
||
EtVec3Normalize(&m_vYAxis, &m_vYAxis);
|
||
EtVec3TransformNormal( &m_vZAxis, &m_vZAxis, &matRotPitch );
|
||
EtVec3Normalize(&m_vZAxis, &m_vZAxis);
|
||
}
|
||
|
||
void MatrixEx::RotateYAxis( float fAngle )
|
||
{
|
||
EtMatrix matRotYaw;
|
||
EtMatrixRotationY(&matRotYaw, D3DXToRadian(fAngle));
|
||
EtVec3TransformNormal(&m_vZAxis, &m_vZAxis, &matRotYaw);
|
||
EtVec3TransformNormal(&m_vXAxis, &m_vXAxis, &matRotYaw);
|
||
EtVec3Normalize(&m_vZAxis, &m_vZAxis);
|
||
EtVec3Normalize(&m_vXAxis, &m_vXAxis);
|
||
EtVec3Cross(&m_vYAxis, &m_vZAxis, &m_vXAxis);
|
||
}
|
||
|
||
void MatrixEx::RotateZAxis( float fAngle )
|
||
{
|
||
EtMatrix matRotRoll;
|
||
|
||
EtMatrixRotationZ(&matRotRoll, D3DXToRadian(fAngle));
|
||
EtVec3TransformNormal(&m_vZAxis, &m_vZAxis, &matRotRoll);
|
||
EtVec3TransformNormal(&m_vXAxis, &m_vXAxis, &matRotRoll);
|
||
EtVec3Normalize(&m_vZAxis, &m_vZAxis);
|
||
EtVec3Normalize(&m_vXAxis, &m_vXAxis);
|
||
EtVec3Cross(&m_vYAxis, &m_vZAxis, &m_vXAxis);
|
||
}
|
||
|
||
void MatrixEx::RotateXAxis( float fAngle )
|
||
{
|
||
EtMatrix matRotPitch;
|
||
|
||
EtMatrixRotationX(&matRotPitch, D3DXToRadian(fAngle));
|
||
EtVec3TransformNormal(&m_vZAxis, &m_vZAxis, &matRotPitch);
|
||
EtVec3TransformNormal(&m_vXAxis, &m_vXAxis, &matRotPitch);
|
||
EtVec3Normalize(&m_vZAxis, &m_vZAxis);
|
||
EtVec3Normalize(&m_vXAxis, &m_vXAxis);
|
||
EtVec3Cross(&m_vYAxis, &m_vZAxis, &m_vXAxis);
|
||
}
|
||
|
||
void MatrixEx::SetPosition(float fX, float fY, float fZ)
|
||
{
|
||
m_vPosition.x=fX;
|
||
m_vPosition.y=fY;
|
||
m_vPosition.z=fZ;
|
||
}
|
||
|
||
MatrixEx::operator EtMatrix *()
|
||
{
|
||
return (EtMatrix*)this;
|
||
}
|
||
|
||
MatrixEx::operator EtMatrix &()
|
||
{
|
||
return *(EtMatrix*)this;
|
||
}
|
||
|
||
MatrixEx &MatrixEx::operator = (EtMatrix &Matrix)
|
||
{
|
||
*(EtMatrix*)this = Matrix;
|
||
|
||
return *this;
|
||
}
|
||
|
||
void MatrixEx::CopyRotationFromThis( MatrixEx *pCross )
|
||
{
|
||
if(pCross)
|
||
{
|
||
m_vXAxis = pCross->m_vXAxis;
|
||
m_vYAxis = pCross->m_vYAxis;
|
||
m_vZAxis = pCross->m_vZAxis;
|
||
}
|
||
}
|
||
|
||
void MatrixEx::MakeUpCartesianByZAxis()
|
||
{
|
||
EtVec3Cross(&m_vXAxis, &m_vYAxis, &m_vZAxis);
|
||
EtVec3Normalize(&m_vXAxis, &m_vXAxis);
|
||
|
||
EtVec3Cross(&m_vYAxis, &m_vZAxis, &m_vXAxis);
|
||
EtVec3Normalize(&m_vYAxis, &m_vYAxis);
|
||
|
||
if( EtVec3LengthSq( &m_vXAxis ) == 0.f && EtVec3LengthSq( &m_vYAxis ) == 0.f ) {
|
||
m_vXAxis = EtVector3( 1.f, 0.f, 0.f );
|
||
MakeUpCartesianByXAxis();
|
||
}
|
||
}
|
||
|
||
void MatrixEx::MakeUpCartesianByYAxis()
|
||
{
|
||
EtVec3Cross(&m_vXAxis, &m_vYAxis, &m_vZAxis);
|
||
EtVec3Normalize(&m_vXAxis, &m_vXAxis);
|
||
|
||
EtVec3Cross(&m_vZAxis, &m_vXAxis, &m_vYAxis);
|
||
EtVec3Normalize(&m_vZAxis, &m_vZAxis);
|
||
}
|
||
|
||
void MatrixEx::MakeUpCartesianByXAxis()
|
||
{
|
||
EtVec3Cross(&m_vYAxis, &m_vZAxis, &m_vXAxis);
|
||
EtVec3Normalize(&m_vYAxis, &m_vYAxis);
|
||
|
||
EtVec3Cross(&m_vZAxis, &m_vXAxis, &m_vYAxis);
|
||
EtVec3Normalize(&m_vZAxis, &m_vZAxis);
|
||
}
|
||
|
||
void MatrixEx::Look( EtVector3 *pTarget, EtVector3 *pUpVector /*=NULL*/ )
|
||
{
|
||
EtVector3 vToTarget = *pTarget-m_vPosition;
|
||
|
||
if( EtVec3Length( &vToTarget ) < 0.01f )
|
||
return;
|
||
|
||
EtVec3Normalize( &m_vZAxis, &vToTarget );
|
||
|
||
if( pUpVector )
|
||
{
|
||
m_vYAxis =* pUpVector;
|
||
}
|
||
|
||
EtVec3Cross( &m_vXAxis, &m_vYAxis, &m_vZAxis );
|
||
EtVec3Normalize( &m_vXAxis, &m_vXAxis );
|
||
|
||
EtVec3Cross( &m_vYAxis, &m_vZAxis, &m_vXAxis );
|
||
EtVec3Normalize( &m_vYAxis, &m_vYAxis );
|
||
} |