#include "Framework.h" using namespace fw; ThirdPersonCamera::ThirdPersonCamera(const std::string& sName) : Camera(sName), m_fSpeed(30), // Mettre define m_bCenterMouse(true), m_bActive(true), m_fDistance(15.0f) // Mettre define { m_camAngle = D3DXVECTOR2(0, 0); } ThirdPersonCamera::~ThirdPersonCamera() { } void ThirdPersonCamera::SetSpeed(float fSpeed) { m_fSpeed = fSpeed; } void ThirdPersonCamera::SetTarget(const D3DXVECTOR3& target) { m_lookAt = m_translation - target; BuildView(); } void ThirdPersonCamera::Update(float dt) { if (!m_bActive) { return; } float x = 0.0f; float y = 0.0f; INPUT_MANAGER->GetMouseRelativePosition(x, y); m_camAngle.x += x * CAMERA_SPEED_ROTATE_AROUND * dt; m_camAngle.y -= y * CAMERA_SPEED_ROTATE_AROUND * dt; m_camAngle.y = MATHS->Clamp(0.003f, (float) D3DX_PI - 0.003f, m_camAngle.y); // Trigonométrie pour faire en sorte que la caméra // fasse une rotation autour d'un point float cosX = cos(m_camAngle.x); float cosY = cos(m_camAngle.y); float sinY = sin(m_camAngle.y); float sinX = sin(m_camAngle.x); float xf = cosX * sinY; float yf = cosY; float zf = sinX * sinY; D3DXVECTOR3 finalPos(xf, yf, zf); m_translation = finalPos * m_fDistance; INPUT_MANAGER->GetMouseRelativePosition(x, y); if (m_bCenterMouse) { INPUT_MANAGER->CenterMouseCursor(); } Camera::Update(dt); } void ThirdPersonCamera::ToggleCenteredMouseCursor() { m_bCenterMouse = !m_bCenterMouse; ShowCursor(!m_bCenterMouse); } void ThirdPersonCamera::BuildView() { D3DXMatrixLookAtLH(&m_view, &m_translation, &m_lookAt, &m_up); /* D3DXVec3Cross(&m_up, &m_lookAt, &m_right); D3DXVec3Normalize(&m_up, &m_up); D3DXVec3Cross(&m_right, &m_up, &m_lookAt); D3DXVec3Normalize(&m_right, &m_right); float x = -D3DXVec3Dot(&m_pos, &m_right); float y = -D3DXVec3Dot(&m_pos, &m_up); float z = -D3DXVec3Dot(&m_pos, &m_lookAt); m_view(0, 0) = m_right.x; m_view(1, 0) = m_right.y; m_view(2, 0) = m_right.z; m_view(3, 0) = x; m_view(0, 1) = m_up.x; m_view(1, 1) = m_up.y; m_view(2, 1) = m_up.z; m_view(3, 1) = y; m_view(0, 2) = m_lookAt.x; m_view(1, 2) = m_lookAt.y; m_view(2, 2) = m_lookAt.z; m_view(3, 2) = z; m_view(0, 3) = 0.0f; m_view(1, 3) = 0.0f; m_view(2, 3) = 0.0f; m_view(3, 3) = 1.0f; */ } void ThirdPersonCamera::SetActive(bool bActive) { m_bActive = bActive; ShowCursor(!bActive); if (bActive) { INPUT_MANAGER->SaveMousePosition(); INPUT_MANAGER->CenterMouseCursor(); } else // On restaure l'ancienne position de la souris { INPUT_MANAGER->RestoreMousePosition(); } } bool ThirdPersonCamera::GetActive() { return m_bActive; } void ThirdPersonCamera::SetDistance(float fDistance) { m_fDistance = fDistance; }