DragonNest/Client/EtCutSceneTool/CamController.cpp
2024-12-19 09:48:26 +08:00

272 lines
No EOL
6.3 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "StdAfx.h"
#include "CamController.h"
#include "Arcball.h"
CCamController::CCamController(void) : m_fLookAtLength( 0.0f ),
m_iPrevDownX( 0 ),
m_iPrevDownY( 0 ),
m_pWorldArcball( new CArcBall ),
m_pCamArcball( new CArcBall ),
m_vCamPos( 0.0f, 0.0f, 0.0f ),
m_vLookAt( 0.0f, 0.0f, 0.0f ),
m_vUp( 0.0f, 0.0f, 0.0f ),
m_vSide( 1.0f, 0.0f, 0.0f )
{
EtMatrix matIdentity;
EtMatrixIdentity( &matIdentity );
m_matWorld = matIdentity;
m_matNowRot = matIdentity;
m_matLastRot = matIdentity;
m_matTrans = matIdentity;
m_matCamNowRot= matIdentity;
m_matCamLastRot = matIdentity;
m_matInvCamNowRot = matIdentity;
m_matWorldRot = matIdentity;
}
CCamController::~CCamController(void)
{
delete m_pWorldArcball;
delete m_pCamArcball;
}
void CCamController::Reset( void )
{
m_fLookAtLength = 0.0f;
m_iPrevDownX = 0;
m_iPrevDownY = 0;
m_vCamPos = EtVector3( 0.0f, 0.0f, 0.0f );
m_vLookAt = EtVector3( 0.0f, 0.0f, 0.0f );
m_vUp = EtVector3( 0.0f, 0.0f, 0.0f );
m_vSide = EtVector3( 1.0f, 0.0f, 0.0f );
EtMatrix matIdentity;
EtMatrixIdentity( &matIdentity );
m_matWorld = matIdentity;
m_matNowRot = matIdentity;
m_matLastRot = matIdentity;
m_matTrans = matIdentity;
m_matCamNowRot= matIdentity;
m_matCamLastRot = matIdentity;
m_matInvCamNowRot = matIdentity;
m_matWorldRot = matIdentity;
}
void CCamController::SetOriCamPos( const EtVector3& vCamPos )
{
m_vOriCamPos = vCamPos;
SetCamPos( vCamPos );
}
void CCamController::SetOriLookAt( const EtVector3& vLookAt )
{
m_vOriLookAt = vLookAt;
SetLookAt( vLookAt );
}
void CCamController::SetOriUpVector( const EtVector3& vUp )
{
m_vOriUp = vUp;
SetUpVector( vUp );
}
void CCamController::SetCamPos( const EtVector3& vCamPos )
{
m_vCamPos = vCamPos;
EtVector3 vDir = m_vCamPos - m_vLookAt;
m_fLookAtLength = D3DXVec3Length( &vDir );
}
void CCamController::SetLookAt( const EtVector3& vLookAt )
{
m_vLookAt = vLookAt;
EtVector3 vDir = m_vCamPos - m_vLookAt;
m_fLookAtLength = D3DXVec3Length( &vDir );
}
void CCamController::SetUpVector( const EtVector3& vUp )
{
m_vUp = vUp;
}
void CCamController::SetViewMatrix( const EtMatrix& matView )
{
m_matView = matView;
}
void CCamController::SetProjMatrix( const EtMatrix& matProj )
{
m_matProj = matProj;
}
void CCamController::SetViewport( const EtViewPort& Viewport )
{
m_Viewport = Viewport;
m_pWorldArcball->SetBound( (float)Viewport.Width, (float)Viewport.Height );
m_pCamArcball->SetBound( (float)Viewport.Width, (float)Viewport.Height );
}
void CCamController::GetMatrix( EtMatrix& matResult )
{
// <20><><EFBFBD><EFBFBD> <20><>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <20>Ѱ<EFBFBD><D1B0>ش<EFBFBD>.
// <20>ٶ󺸰<D9B6> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ȸ<><C8B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ְ<EFBFBD>, <20>ٽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD>.
EtMatrix matTrans, matOriTrans;
EtMatrixTranslation( &matTrans, -m_vLookAt.x, -m_vLookAt.y, -m_vLookAt.z );
EtMatrixTranslation( &matOriTrans, m_vLookAt.x, m_vLookAt.y, m_vLookAt.z );
m_matWorld = matTrans * m_matNowRot * matOriTrans;
matResult = m_matWorld;
}
void CCamController::_UpdatePrevDown( int iXPos, int iYPos )
{
m_iPrevDownX = iXPos;
m_iPrevDownY = iYPos;
}
void CCamController::OnLButtonDown( int iXPos, int iYPos )
{
m_matLastRot = m_matNowRot;
m_pWorldArcball->Click( iXPos, iYPos );
}
void CCamController::OnLButtonCon( int iXPos, int iYPos )
{
D3DXQUATERNION qRot;
m_pWorldArcball->Drag( iXPos, iYPos, &qRot );
EtMatrixRotationQuaternion( &m_matNowRot, &qRot );
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD>带 ī<>޶<EFBFBD><DEB6><EFBFBD> <20><20><><EFBFBD>߰<EFBFBD> ȸ<><C8B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>Ų<EFBFBD><C5B2>.
// <20>׷<EFBFBD><D7B7><EFBFBD> ī<>޶<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD><C8AF> ȸ<><C8B8> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>´<EFBFBD>.
m_matNowRot = m_matCamNowRot * m_matNowRot * m_matInvCamNowRot;
EtMatrixMultiply( &m_matNowRot, &m_matLastRot, &m_matNowRot );
}
void CCamController::OnRButtonDown( int iXPos, int iYPos )
{
m_matCamLastRot = m_matCamNowRot;
m_pCamArcball->Click( iXPos, iYPos );
}
void CCamController::OnRButtonCon( int iXPos, int iYPos )
{
D3DXQUATERNION qRot;
m_pCamArcball->Drag( iXPos, iYPos, &qRot );
EtMatrixRotationQuaternion( &m_matCamNowRot, &qRot );
EtMatrixMultiply( &m_matCamNowRot, &m_matCamLastRot, &m_matCamNowRot );
EtMatrixInverse( &m_matInvCamNowRot, NULL, &m_matCamNowRot );
EtVector3 vResultCamPos, vResultUp;
// <20><><EFBFBD><EFBFBD> <20><>ǥ<EFBFBD><C7A5><EFBFBD><EFBFBD> ȸ<><C8B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
// Look At <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD>~
EtVector3 vLocalCamPos = m_vOriCamPos - m_vOriLookAt;
D3DXVec3TransformCoord( &vResultCamPos, &vLocalCamPos/*m_vOriCamPos*/, &m_matInvCamNowRot );
D3DXVec3TransformCoord( &vResultUp, &m_vOriUp, &m_matInvCamNowRot );
m_vCamPos = vResultCamPos + m_vOriLookAt;
m_vUp = vResultUp;
// Side<64><65><EFBFBD><EFBFBD> <20><><EFBFBD>ϱ<EFBFBD>. bintitle.
EtVector3 vDir = m_vCamPos - m_vLookAt;
EtVec3Normalize( &vDir, &vDir );
EtVec3Cross( &m_vSide, &EtVector3(0.0f,1.0f,0.0f), &vDir );
EtVec3Normalize( &m_vSide, &m_vSide );
}
void CCamController::OnCButtonDown( int iXPos, int iYPos )
{
_UpdatePrevDown( iXPos, iYPos );
}
void CCamController::OnCButtonCon( int iXPos, int iYPos )
{
// <20>̰<EFBFBD> <20><><EFBFBD><EFBFBD> ī<>޶<EFBFBD><DEB6><EFBFBD> <20>̵<EFBFBD><CCB5><EFBFBD><EFBFBD><EFBFBD> <20>ֵ<EFBFBD><D6B5><EFBFBD> <20><><EFBFBD><EFBFBD>.
// Look at <20><> <20><><EFBFBD>Ѵ<EFBFBD>.
int iXDelta = iXPos - m_iPrevDownX;
int iYDelta = iYPos - m_iPrevDownY;
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>͸<EFBFBD> <20><><EFBFBD>Ѵ<EFBFBD>.
EtVector3 vStart, vEnd;
EtVector3 vPrevPos( (float)m_iPrevDownX, (float)m_iPrevDownY, 0.0f ), vNowPos( (float)iXPos, (float)iYPos, 0.0f );
EtVec3Unproject( &vStart, &vPrevPos, &m_Viewport, &m_matProj, &m_matView, &m_matWorld );
EtVec3Unproject( &vEnd, &vNowPos, &m_Viewport, &m_matProj, &m_matView, &m_matWorld );
EtVector3 vDir = vEnd - vStart;
// ī<>޶<EFBFBD><DEB6><EFBFBD> <20><><EFBFBD><EFBFBD> <20>̵<EFBFBD><CCB5>ȴ<EFBFBD>.
EtVector3 vDelta = vDir * m_fLookAtLength;
m_vCamPos -= vDelta;
m_vLookAt -= vDelta;
m_vOriCamPos -= vDelta;
m_vOriLookAt -= vDelta;
_UpdatePrevDown( iXPos, iYPos );
}
void CCamController::OnMouseWheel( int iWheelDelta )
{
EtVector3 vDir = m_vCamPos - m_vLookAt;
m_vCamPos += (vDir * ((float)iWheelDelta / 1000.0f));
vDir = m_vOriCamPos - m_vOriLookAt;
m_vOriCamPos += (vDir * ((float)iWheelDelta / 1000.0f));
// ī<>޶<EFBFBD><DEB6><EFBFBD> look at <20>Ÿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
m_fLookAtLength = D3DXVec3Length( &vDir );
}
void CCamController::OnMoveFrontAndBack( float fSpeed )
{
EtVector3 vDir = m_vCamPos - m_vLookAt;
D3DXVec3Normalize( &vDir, &vDir );
m_vCamPos += ( vDir * fSpeed );
m_vOriCamPos = m_vCamPos;
}
void CCamController::OnMoveLeftAndRight( float fSpeed )
{
EtVector3 vDir( m_vSide * fSpeed );
m_vCamPos += vDir;
m_vLookAt += vDir;
m_vOriCamPos = m_vCamPos;
}