From 5bdf61a886d6da3913593ffe607d51c50e9783fb Mon Sep 17 00:00:00 2001 From: Petr Mikheev Date: Mon, 22 Jun 2020 19:26:37 +0200 Subject: [PATCH] Slightly pulls camera away when the character moves --- apps/openmw/mwrender/camera.cpp | 19 +++++++++++++++++-- apps/openmw/mwrender/camera.hpp | 2 ++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/apps/openmw/mwrender/camera.cpp b/apps/openmw/mwrender/camera.cpp index 3da94f97d..e856b8ab3 100644 --- a/apps/openmw/mwrender/camera.cpp +++ b/apps/openmw/mwrender/camera.cpp @@ -68,7 +68,8 @@ namespace MWRender mDefaultShoulderIsRight(true), mThirdPersionOffsetType(ThirdPersonOffsetType::RightShoulder), mFocalPointCurrentOffset(osg::Vec2d()), - mFocalPointTransitionSpeed(1.f) + mFocalPointTransitionSpeed(1.f), + mSmoothedSpeed(0.f) { mVanity.enabled = false; mVanity.allowed = true; @@ -216,6 +217,10 @@ namespace MWRender } updateFocalPointOffset(duration); + + float speed = mTrackingPtr.getClass().getSpeed(mTrackingPtr); + float maxDelta = 300.f * duration; + mSmoothedSpeed += osg::clampBetween(speed - mSmoothedSpeed, -maxDelta, maxDelta); } void Camera::setOverShoulderOffset(float horizontal, float vertical) @@ -482,7 +487,17 @@ namespace MWRender float Camera::getCameraDistanceCorrection() const { - return mThirdPersonMode != ThirdPersonViewMode::Standard ? std::max(-getPitch(), 0.f) * 50.f : 0; + if (mThirdPersonMode == ThirdPersonViewMode::Standard) + return 0; + else + { + float pitchCorrection = std::max(-getPitch(), 0.f) * 50.f; + + float smoothedSpeedSqr = mSmoothedSpeed * mSmoothedSpeed; + float speedCorrection = smoothedSpeedSqr / (smoothedSpeedSqr + 300.f*300.f) * 20.0f; + + return pitchCorrection + speedCorrection; + } } void Camera::setCameraDistance() diff --git a/apps/openmw/mwrender/camera.hpp b/apps/openmw/mwrender/camera.hpp index b3e7e1f67..eb7462945 100644 --- a/apps/openmw/mwrender/camera.hpp +++ b/apps/openmw/mwrender/camera.hpp @@ -70,6 +70,8 @@ namespace MWRender osg::Vec2d mFocalPointCurrentOffset; float mFocalPointTransitionSpeed; + float mSmoothedSpeed; + void updateFocalPointOffset(float duration); float getCameraDistanceCorrection() const;