aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Physics/BulletSPlugin/BSActorAvatarMove.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Physics/BulletSPlugin/BSActorAvatarMove.cs')
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BSActorAvatarMove.cs24
1 files changed, 17 insertions, 7 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSActorAvatarMove.cs b/OpenSim/Region/Physics/BulletSPlugin/BSActorAvatarMove.cs
index 8e998ba..c0d65be 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 }