173 lines
No EOL
4.1 KiB
C++
173 lines
No EOL
4.1 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 );
|
|
} |