DragonNest/Common/EngineUtil/EtMatrixEx.cpp
Cussrro 47f7895977 Revert "修复编码问题"
This reverts commit 9e69c01767.
2024-12-21 10:04:04 +08:00

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 );
}