aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorRobert Adams2015-01-07 06:39:29 -0800
committerRobert Adams2015-01-07 06:39:29 -0800
commit700543b161f653ea41faf3d125a1eb9be389ec23 (patch)
tree719c9f864ecbeb5ee5f1cbaece208d440946a6f7
parentDonation of robust network connectors for estate service, as promised. This a... (diff)
downloadopensim-SC_OLD-700543b161f653ea41faf3d125a1eb9be389ec23.zip
opensim-SC_OLD-700543b161f653ea41faf3d125a1eb9be389ec23.tar.gz
opensim-SC_OLD-700543b161f653ea41faf3d125a1eb9be389ec23.tar.bz2
opensim-SC_OLD-700543b161f653ea41faf3d125a1eb9be389ec23.tar.xz
BulletSim: tweek step parameters and logic to make walking up steps
closer to SL. This change should address small floor edges acting like walls, approaching a step at any angle (other than walking backwards) will allow walking up, and reducing the avatar pop-up when going up stairs.
Diffstat (limited to '')
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BSActorAvatarMove.cs26
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BSParam.cs14
-rw-r--r--bin/OpenSimDefaults.ini11
3 files changed, 39 insertions, 12 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSActorAvatarMove.cs b/OpenSim/Region/Physics/BulletSPlugin/BSActorAvatarMove.cs
index 8e998ba..9bbba40 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSActorAvatarMove.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSActorAvatarMove.cs
@@ -341,7 +341,7 @@ public class BSActorAvatarMove : BSActor
341 // float nearFeetHeightMin = m_controllingPrim.RawPosition.Z - (m_controllingPrim.Size.Z / 2f) + 0.05f; 341 // float nearFeetHeightMin = m_controllingPrim.RawPosition.Z - (m_controllingPrim.Size.Z / 2f) + 0.05f;
342 // Note: there is a problem with the computation of the capsule height. Thus RawPosition is off 342 // Note: there is a problem with the computation of the capsule height. Thus RawPosition is off
343 // from the height. Revisit size and this computation when height is scaled properly. 343 // from the height. Revisit size and this computation when height is scaled properly.
344 float nearFeetHeightMin = m_controllingPrim.RawPosition.Z - (m_controllingPrim.Size.Z / 2f) - 0.05f; 344 float nearFeetHeightMin = m_controllingPrim.RawPosition.Z - (m_controllingPrim.Size.Z / 2f) - BSParam.AvatarStepGroundFudge;
345 float nearFeetHeightMax = nearFeetHeightMin + BSParam.AvatarStepHeight; 345 float nearFeetHeightMax = nearFeetHeightMin + BSParam.AvatarStepHeight;
346 346
347 // Look for a collision point that is near the character's feet and is oriented the same as the charactor is. 347 // Look for a collision point that is near the character's feet and is oriented the same as the charactor is.
@@ -363,15 +363,25 @@ public class BSActorAvatarMove : BSActor
363 if (touchPosition.Z >= nearFeetHeightMin && touchPosition.Z <= nearFeetHeightMax) 363 if (touchPosition.Z >= nearFeetHeightMin && touchPosition.Z <= nearFeetHeightMax)
364 { 364 {
365 // This contact is within the 'near the feet' range. 365 // This contact is within the 'near the feet' range.
366 // The normal should be our contact point to the object so it is pointing away 366 // The step is presumed to be more or less vertical. Thus the Z component should
367 // thus the difference between our facing orientation and the normal should be small. 367 // be nearly horizontal.
368 OMV.Vector3 directionFacing = OMV.Vector3.UnitX * m_controllingPrim.RawOrientation; 368 OMV.Vector3 directionFacing = OMV.Vector3.UnitX * m_controllingPrim.RawOrientation;
369 OMV.Vector3 touchNormal = OMV.Vector3.Normalize(kvp.Value.SurfaceNormal); 369 OMV.Vector3 touchNormal = OMV.Vector3.Normalize(kvp.Value.SurfaceNormal);
370 float diff = Math.Abs(OMV.Vector3.Distance(directionFacing, touchNormal)); 370 const float PIOver2 = 1.571f; // Used to make unit vector axis into approx radian angles
371 if (diff < BSParam.AvatarStepApproachFactor) 371 // m_physicsScene.DetailLog("{0},BSCharacter.WalkUpStairs,avNormal={1},colNormal={2},diff={3}",
372 // m_controllingPrim.LocalID, directionFacing, touchNormal,
373 // Math.Abs(OMV.Vector3.Distance(directionFacing, touchNormal)) );
374 if ((Math.Abs(directionFacing.Z) * PIOver2) < BSParam.AvatarStepAngle
375 && (Math.Abs(touchNormal.Z) * PIOver2) < BSParam.AvatarStepAngle)
372 { 376 {
373 if (highestTouchPosition.Z < touchPosition.Z) 377 // The normal should be our contact point to the object so it is pointing away
374 highestTouchPosition = touchPosition; 378 // thus the difference between our facing orientation and the normal should be small.
379 float diff = Math.Abs(OMV.Vector3.Distance(directionFacing, touchNormal));
380 if (diff < BSParam.AvatarStepApproachFactor)
381 {
382 if (highestTouchPosition.Z < touchPosition.Z)
383 highestTouchPosition = touchPosition;
384 }
375 } 385 }
376 } 386 }
377 } 387 }
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSParam.cs b/OpenSim/Region/Physics/BulletSPlugin/BSParam.cs
index e7f4def..ef75e3f 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSParam.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSParam.cs
@@ -153,6 +153,8 @@ public static class BSParam
153 public static int AvatarJumpFrames { get; private set; } 153 public static int AvatarJumpFrames { get; private set; }
154 public static float AvatarBelowGroundUpCorrectionMeters { get; private set; } 154 public static float AvatarBelowGroundUpCorrectionMeters { get; private set; }
155 public static float AvatarStepHeight { get; private set; } 155 public static float AvatarStepHeight { get; private set; }
156 public static float AvatarStepAngle { get; private set; }
157 public static float AvatarStepGroundFudge { get; private set; }
156 public static float AvatarStepApproachFactor { get; private set; } 158 public static float AvatarStepApproachFactor { get; private set; }
157 public static float AvatarStepForceFactor { get; private set; } 159 public static float AvatarStepForceFactor { get; private set; }
158 public static float AvatarStepUpCorrectionFactor { get; private set; } 160 public static float AvatarStepUpCorrectionFactor { get; private set; }
@@ -614,13 +616,17 @@ public static class BSParam
614 new ParameterDefn<int>("AvatarJumpFrames", "Number of frames to allow jump forces. Changes jump height.", 616 new ParameterDefn<int>("AvatarJumpFrames", "Number of frames to allow jump forces. Changes jump height.",
615 4 ), 617 4 ),
616 new ParameterDefn<float>("AvatarStepHeight", "Height of a step obstacle to consider step correction", 618 new ParameterDefn<float>("AvatarStepHeight", "Height of a step obstacle to consider step correction",
617 0.6f ) , 619 0.999f ) ,
620 new ParameterDefn<float>("AvatarStepAngle", "The angle (in radians) for a vertical surface to be considered a step",
621 0.3f ) ,
622 new ParameterDefn<float>("AvatarStepGroundFudge", "Fudge factor subtracted from avatar base when comparing collision height",
623 0.1f ) ,
618 new ParameterDefn<float>("AvatarStepApproachFactor", "Factor to control angle of approach to step (0=straight on)", 624 new ParameterDefn<float>("AvatarStepApproachFactor", "Factor to control angle of approach to step (0=straight on)",
619 0.6f ), 625 2f ),
620 new ParameterDefn<float>("AvatarStepForceFactor", "Controls the amount of force up applied to step up onto a step", 626 new ParameterDefn<float>("AvatarStepForceFactor", "Controls the amount of force up applied to step up onto a step",
621 1.0f ), 627 0f ),
622 new ParameterDefn<float>("AvatarStepUpCorrectionFactor", "Multiplied by height of step collision to create up movement at step", 628 new ParameterDefn<float>("AvatarStepUpCorrectionFactor", "Multiplied by height of step collision to create up movement at step",
623 2.0f ), 629 0.8f ),
624 new ParameterDefn<int>("AvatarStepSmoothingSteps", "Number of frames after a step collision that we continue walking up stairs", 630 new ParameterDefn<int>("AvatarStepSmoothingSteps", "Number of frames after a step collision that we continue walking up stairs",
625 1 ), 631 1 ),
626 632
diff --git a/bin/OpenSimDefaults.ini b/bin/OpenSimDefaults.ini
index 20b2f0f..d12814d 100644
--- a/bin/OpenSimDefaults.ini
+++ b/bin/OpenSimDefaults.ini
@@ -1070,6 +1070,17 @@
1070 AvatarHeightMidFudge = 0 ; Adjustment at mid point of avatar height range 1070 AvatarHeightMidFudge = 0 ; Adjustment at mid point of avatar height range
1071 AvatarHeightHighFudge = 0 ; Adjustment at high end of height range 1071 AvatarHeightHighFudge = 0 ; Adjustment at high end of height range
1072 1072
1073 ; Avatar walk-up-stairs parameters
1074 ; If an avatar collides with an object 'close to its feet', the avatar will be
1075 ; moved/pushed up do simulate stepping up.
1076 ;AvatarStepHeight = 0.6f ; The height, below which is considered a step collision.
1077 ;AvatarStepAngle = 0.3f ; The angle from vertical (in radians) to consider a surface a step
1078 ;AvatarStepApproachFactor = 2f ; Approach angle factor. O=straight on, .6=~45 degrees.
1079 ;AvatarStepGroundFudge = 0.1f ; Fudge added to bottom of avatar below which step collisions happen
1080 ;AvatarStepForceFactor = 0f ; Avatar is pushed up by its mass times this factor
1081 ;AvatarStepUpCorrectionFactor = 0.8f ; Avatar is displaced up the collision height times this factor
1082 ;AvatarStepSmoothingSteps = 1 ; Number of frames after a step collision that up correction is applied
1083
1073 ; Terminal velocity of a falling avatar 1084 ; Terminal velocity of a falling avatar
1074 ; This is the same http://en.wikipedia.org/wiki/Terminal_velocity#Examples 1085 ; This is the same http://en.wikipedia.org/wiki/Terminal_velocity#Examples
1075 ; negative for a downward speed. 1086 ; negative for a downward speed.