|
|
|
|
@ -140,6 +140,18 @@ namespace AtomToolsFramework
|
|
|
|
|
m_targetCamera = m_cameraSystem.StepCamera(m_targetCamera, event.m_deltaTime.count());
|
|
|
|
|
m_camera = AzFramework::SmoothCamera(m_camera, m_targetCamera, event.m_deltaTime.count());
|
|
|
|
|
|
|
|
|
|
// if there has been an interpolation, only clear the look at point if it is no longer
|
|
|
|
|
// centered in the view (the camera has looked away from it)
|
|
|
|
|
if (m_lookAtAfterInterpolation.has_value())
|
|
|
|
|
{
|
|
|
|
|
if (const float lookDirection =
|
|
|
|
|
(*m_lookAtAfterInterpolation - m_camera.Translation()).GetNormalized().Dot(m_camera.Transform().GetBasisY());
|
|
|
|
|
!AZ::IsCloseMag(lookDirection, 1.0f, 0.001f))
|
|
|
|
|
{
|
|
|
|
|
m_lookAtAfterInterpolation = {};
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
viewportContext->SetCameraTransform(m_camera.Transform());
|
|
|
|
|
}
|
|
|
|
|
else if (m_cameraMode == CameraMode::Animation)
|
|
|
|
|
@ -148,8 +160,8 @@ namespace AtomToolsFramework
|
|
|
|
|
{
|
|
|
|
|
return t * t * t * (t * (t * 6.0f - 15.0f) + 10.0f);
|
|
|
|
|
};
|
|
|
|
|
const float transitionT = smootherStepFn(m_animationT);
|
|
|
|
|
|
|
|
|
|
const float transitionT = smootherStepFn(m_animationT);
|
|
|
|
|
const AZ::Transform current = AZ::Transform::CreateFromQuaternionAndTranslation(
|
|
|
|
|
m_transformStart.GetRotation().Slerp(m_transformEnd.GetRotation(), transitionT),
|
|
|
|
|
m_transformStart.GetTranslation().Lerp(m_transformEnd.GetTranslation(), transitionT));
|
|
|
|
|
@ -185,11 +197,17 @@ namespace AtomToolsFramework
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ModernViewportCameraControllerInstance::InterpolateToTransform(const AZ::Transform& worldFromLocal)
|
|
|
|
|
void ModernViewportCameraControllerInstance::InterpolateToTransform(const AZ::Transform& worldFromLocal, const float lookAtDistance)
|
|
|
|
|
{
|
|
|
|
|
m_animationT = 0.0f;
|
|
|
|
|
m_cameraMode = CameraMode::Animation;
|
|
|
|
|
m_transformStart = m_camera.Transform();
|
|
|
|
|
m_transformEnd = worldFromLocal;
|
|
|
|
|
m_lookAtAfterInterpolation = m_transformEnd.GetTranslation() + m_transformEnd.GetBasisY() * lookAtDistance;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
AZStd::optional<AZ::Vector3> ModernViewportCameraControllerInstance::LookAtAfterInterpolation() const
|
|
|
|
|
{
|
|
|
|
|
return m_lookAtAfterInterpolation;
|
|
|
|
|
}
|
|
|
|
|
} // namespace AtomToolsFramework
|
|
|
|
|
|