aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Region/Physics/OdePlugin/ODECharacter.cs86
1 files changed, 78 insertions, 8 deletions
diff --git a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs
index 9aff1ca..9d60cca 100644
--- a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs
+++ b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs
@@ -49,16 +49,20 @@ namespace OpenSim.Region.Physics.OdePlugin
49 FudgeFactor = 4, 49 FudgeFactor = 4,
50 Bounce = 5, 50 Bounce = 5,
51 CFM = 6, 51 CFM = 6,
52 ERP = 7, 52 StopERP = 7,
53 StopCFM = 8, 53 StopCFM = 8,
54 LoStop2 = 256, 54 LoStop2 = 256,
55 HiStop2 = 257, 55 HiStop2 = 257,
56 Vel2 = 258, 56 Vel2 = 258,
57 FMax2 = 259, 57 FMax2 = 259,
58 StopERP2 = 7 + 256,
59 StopCFM2 = 8 + 256,
58 LoStop3 = 512, 60 LoStop3 = 512,
59 HiStop3 = 513, 61 HiStop3 = 513,
60 Vel3 = 514, 62 Vel3 = 514,
61 FMax3 = 515 63 FMax3 = 515,
64 StopERP3 = 7 + 512,
65 StopCFM3 = 8 + 512
62 } 66 }
63 public class OdeCharacter : PhysicsActor 67 public class OdeCharacter : PhysicsActor
64 { 68 {
@@ -560,12 +564,78 @@ namespace OpenSim.Region.Physics.OdePlugin
560 } 564 }
561 else 565 else
562 { 566 {
563 d.JointSetAMotorParam(Amotor, (int)dParam.LowStop, -0); 567 #region Documentation of capsule motor LowStop and HighStop parameters
564 d.JointSetAMotorParam(Amotor, (int)dParam.LoStop3, -0); 568 // Intentionally introduce some tilt into the capsule by setting
565 d.JointSetAMotorParam(Amotor, (int)dParam.LoStop2, -0); 569 // the motor stops to small epsilon values. This small tilt prevents
566 d.JointSetAMotorParam(Amotor, (int)dParam.HiStop, 0); 570 // the capsule from falling into the terrain; a straight-up capsule
567 d.JointSetAMotorParam(Amotor, (int)dParam.HiStop3, 0); 571 // (with -0..0 motor stops) falls into the terrain for reasons yet
568 d.JointSetAMotorParam(Amotor, (int)dParam.HiStop2, 0); 572 // to be comprehended in their entirety.
573 #endregion
574 d.JointSetAMotorParam(Amotor, (int)dParam.LowStop, 0.08f);
575 d.JointSetAMotorParam(Amotor, (int)dParam.LoStop3, -0f);
576 d.JointSetAMotorParam(Amotor, (int)dParam.LoStop2, 0.08f);
577 d.JointSetAMotorParam(Amotor, (int)dParam.HiStop, 0.08f); // must be same as lowstop, else a different, spurious tilt is introduced
578 d.JointSetAMotorParam(Amotor, (int)dParam.HiStop3, 0f); // same as lowstop
579 d.JointSetAMotorParam(Amotor, (int)dParam.HiStop2, 0.08f); // same as lowstop
580 #region Documentation of capsule motor StopERP and StopCFM parameters
581 // In addition to the above tilt, we allow a dynamic tilt, or
582 // wobble, to emerge as the capsule is pushed around the environment.
583 // We do this with an experimentally determined combination of
584 // StopERP and StopCFM which make the above motor stops soft.
585 // The softness of the stops should be tweaked according to two
586 // requirements:
587 //
588 // 1. Motor stops should be weak enough to allow enough wobble such
589 // that the capsule can tilt slightly more when moving, to allow
590 // "gliding" over obstacles:
591 //
592 //
593 // .-.
594 // / /
595 // / /
596 // _ / / _
597 // / \ .-. / / / \
598 // | | ----> / / / / | |
599 // | | / / `-' | |
600 // | | / / +------+ | |
601 // | | / / | | | |
602 // | | / / | | | |
603 // \_/ `-' +------+ \_/
604 // ----------------------------------------------------------
605 //
606 // Note that requirement 1 is made complicated by the ever-present
607 // slight avatar tilt (assigned in the above code to prevent avatar
608 // from falling through terrain), which introduces a direction-dependent
609 // bias into the wobble (wobbling against the existing tilt is harder
610 // than wobbling with the tilt), which makes it easier to walk over
611 // prims from some directions. I have tried to minimize this effect by
612 // minimizing the avatar tilt to the minimum that prevents the avatar from
613 // falling through the terrain.
614 //
615 // 2. Motor stops should be strong enough to prevent the capsule
616 // from being forced all the way to the ground; otherwise the
617 // capsule could slip underneath obstacles like this:
618 // _ _
619 // / \ +------+ / \
620 // | | ----> | | | |
621 // | | | | | |
622 // | | .--.___ +------+ | |
623 // | | `--.__`--.__ | |
624 // | | `--.__`--. | |
625 // \_/ `--' \_/
626 // ----------------------------------------------------------
627 //
628 //
629 // It is strongly recommended you enable USE_DRAWSTUFF if you want to
630 // tweak these values, to see how the capsule is reacting in various
631 // situations.
632 #endregion
633 d.JointSetAMotorParam(Amotor, (int)dParam.StopCFM, 0.0035f);
634 d.JointSetAMotorParam(Amotor, (int)dParam.StopCFM2, 0.0035f);
635 d.JointSetAMotorParam(Amotor, (int)dParam.StopCFM3, 0.0035f);
636 d.JointSetAMotorParam(Amotor, (int)dParam.StopERP, 0.8f);
637 d.JointSetAMotorParam(Amotor, (int)dParam.StopERP2, 0.8f);
638 d.JointSetAMotorParam(Amotor, (int)dParam.StopERP3, 0.8f);
569 } 639 }
570 640
571 // Fudge factor is 1f by default, we're setting it to 0. We don't want it to Fudge or the 641 // Fudge factor is 1f by default, we're setting it to 0. We don't want it to Fudge or the