void FreeCamera::Update(const tt::GameContext& context) { auto pInputService = MyServiceLocator::GetInstance()->GetService<IInputService>(); auto pTransform = GetComponent<TransformComponent>(); if(pInputService->IsActionTriggered(InputActionId::CameraMoveForward)) pTransform->Translate(pTransform->GetForward() * m_MovementSpeed, true); if(pInputService->IsActionTriggered(InputActionId::CameraMoveBack)) pTransform->Translate(pTransform->GetBackward() * m_MovementSpeed, true); if(pInputService->IsActionTriggered(InputActionId::CameraMoveLeft)) pTransform->Translate(pTransform->GetLeft() * m_MovementSpeed, true); if(pInputService->IsActionTriggered(InputActionId::CameraMoveRight)) pTransform->Translate(pTransform->GetRight() * m_MovementSpeed, true); if(pInputService->IsActionTriggered(InputActionId::CameraMoveUp)) pTransform->Translate(pTransform->GetUp() * m_MovementSpeed, true); if(pInputService->IsActionTriggered(InputActionId::CameraMoveDown)) pTransform->Translate(pTransform->GetDown() * m_MovementSpeed, true); if(!pInputService->IsActionTriggered(InputActionId::CameraUnlockRotation)) return; auto mouseMovement = pInputService->GetMouseMovement(); mouseMovement *= m_RotationSpeed * context.GameTimer.GetElapsedSeconds(); m_Yaw += mouseMovement.x; m_Pitch += mouseMovement.y; tt::Quaternion yawQuat(tt::Vector3::j, m_Yaw); tt::Vector3 rotatedRight = tt::Vector3::i.TransformPoint(yawQuat); tt::Quaternion pitchQuat(rotatedRight, m_Pitch); pTransform->Rotate(yawQuat * pitchQuat); }
Quat rotationQuat( float p,float y,float r ){ return yawQuat(y)*pitchQuat(p)*rollQuat(r); }