From be07ab58c66edf7368729c286d2dc6afaf76a4b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sybren=20A=2E=20St=C3=BCvel?= Date: Mon, 6 Jul 2015 12:20:29 +0200 Subject: BGE Fix T45207: Camera actuator shakes with low height The camera-aiming code was using a near-zero-length cross product, which caused oscillations. Thresholding on the cross product length seems to fix this. Reviewers: lucky3, Matpi, lordloki Reviewed By: lordloki Projects: #game_engine Differential Revision: https://developer.blender.org/D1387 --- source/gameengine/Ketsji/KX_CameraActuator.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'source/gameengine/Ketsji/KX_CameraActuator.cpp') diff --git a/source/gameengine/Ketsji/KX_CameraActuator.cpp b/source/gameengine/Ketsji/KX_CameraActuator.cpp index 4dc30ae1672..3d1802bb2a6 100644 --- a/source/gameengine/Ketsji/KX_CameraActuator.cpp +++ b/source/gameengine/Ketsji/KX_CameraActuator.cpp @@ -290,11 +290,15 @@ bool KX_CameraActuator::Update(double curtime, bool frame) /* only for it lies: cross test and perpendicular bites up */ if (inp < 0.0f) { - if (fp1[0] * fp2[1] - fp1[1] * fp2[0] > 0.0f) { + /* Don't do anything if the cross product is too small. + * The camera up-axis becomes unstable and starts to oscillate. + * The 0.01f threshold is arbitrary but seems to work well in practice. */ + float cross = fp1[0] * fp2[1] - fp1[1] * fp2[0]; + if (cross > 0.01f) { from[0] -= fac * fp1[1]; from[1] += fac * fp1[0]; } - else { + else if (cross < -0.01f) { from[0] += fac * fp1[1]; from[1] -= fac * fp1[0]; } -- cgit v1.2.3