From a5360483bbbef3581383d60918f7b3eb754d3e04 Mon Sep 17 00:00:00 2001 From: logzero Date: Sun, 25 Dec 2016 15:34:43 +0100 Subject: [PATCH] Back off slightly when we are touching something. This can reduce the amount of movement solver failures significantly. I've observed a drop of 8 iteration cases by almost factor of ten. --- apps/openmw/mwphysics/physicssystem.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/apps/openmw/mwphysics/physicssystem.cpp b/apps/openmw/mwphysics/physicssystem.cpp index 2a3cb6137f..db72ac6365 100644 --- a/apps/openmw/mwphysics/physicssystem.cpp +++ b/apps/openmw/mwphysics/physicssystem.cpp @@ -395,6 +395,13 @@ namespace MWPhysics break; } + // We are touching something. + if (tracer.mFraction < 1E-9f) + { + // Try to separate by backing off slighly to unstuck the solver + const osg::Vec3f backOff = (newPosition - tracer.mHitPoint) * 1E-3f; + newPosition += backOff; + } // We hit something. Check if we can step up. float hitHeight = tracer.mHitPoint.z() - tracer.mEndPos.z() + halfExtents.z();