BGE Fix T45207: Camera actuator shakes with low height
authorSybren A. Stüvel <sybren@stuvel.eu>
Mon, 6 Jul 2015 10:20:29 +0000 (12:20 +0200)
committerSybren A. Stüvel <sybren@stuvel.eu>
Mon, 6 Jul 2015 10:20:29 +0000 (12:20 +0200)
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

index 4dc30ae167217b253588b6568c0462bc7321d19b..3d1802bb2a6f5376c2af378684f46db0847fb5ba 100644 (file)
@@ -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];
                }