diff options
author | Robert Adams | 2013-05-13 13:03:13 -0700 |
---|---|---|
committer | Robert Adams | 2013-05-13 13:30:42 -0700 |
commit | 15360cbb6ba83e40f474cca84082c908af49c58e (patch) | |
tree | 353ca61be20e82ce3acf7e654f33509bd8707850 /OpenSim/Region | |
parent | BulletSim: use heightmap terrain when using BulletXNA. (diff) | |
download | opensim-SC-15360cbb6ba83e40f474cca84082c908af49c58e.zip opensim-SC-15360cbb6ba83e40f474cca84082c908af49c58e.tar.gz opensim-SC-15360cbb6ba83e40f474cca84082c908af49c58e.tar.bz2 opensim-SC-15360cbb6ba83e40f474cca84082c908af49c58e.tar.xz |
BulletSim: add adjustment for avatar capsule height scaling. Makes
avatar standing on ground view better and enables tuning.
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs | 27 | ||||
-rwxr-xr-x | OpenSim/Region/Physics/BulletSPlugin/BSParam.cs | 9 |
2 files changed, 32 insertions, 4 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs b/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs index 542f732..3671fc2 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs | |||
@@ -1,4 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) Contributors, http://opensimulator.org/ | 2 | * Copyright (c) Contributors, http://opensimulator.org/ |
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | 3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. |
4 | * | 4 | * |
@@ -649,12 +649,12 @@ public sealed class BSCharacter : BSPhysObject | |||
649 | OMV.Vector3 newScale; | 649 | OMV.Vector3 newScale; |
650 | 650 | ||
651 | // Bullet's capsule total height is the "passed height + radius * 2"; | 651 | // Bullet's capsule total height is the "passed height + radius * 2"; |
652 | // The base capsule is 1 diameter and 2 height (passed radius=0.5, passed height = 1) | 652 | // The base capsule is 1 unit in diameter and 2 units in height (passed radius=0.5, passed height = 1) |
653 | // The number we pass in for 'scaling' is the multiplier to get that base | 653 | // The number we pass in for 'scaling' is the multiplier to get that base |
654 | // shape to be the size desired. | 654 | // shape to be the size desired. |
655 | // So, when creating the scale for the avatar height, we take the passed height | 655 | // So, when creating the scale for the avatar height, we take the passed height |
656 | // (size.Z) and remove the caps. | 656 | // (size.Z) and remove the caps. |
657 | // Another oddity of the Bullet capsule implementation is that it presumes the Y | 657 | // An oddity of the Bullet capsule implementation is that it presumes the Y |
658 | // dimension is the radius of the capsule. Even though some of the code allows | 658 | // dimension is the radius of the capsule. Even though some of the code allows |
659 | // for a asymmetrical capsule, other parts of the code presume it is cylindrical. | 659 | // for a asymmetrical capsule, other parts of the code presume it is cylindrical. |
660 | 660 | ||
@@ -662,8 +662,27 @@ public sealed class BSCharacter : BSPhysObject | |||
662 | newScale.X = size.X / 2f; | 662 | newScale.X = size.X / 2f; |
663 | newScale.Y = size.Y / 2f; | 663 | newScale.Y = size.Y / 2f; |
664 | 664 | ||
665 | float heightAdjust = BSParam.AvatarHeightMidFudge; | ||
666 | if (BSParam.AvatarHeightLowFudge != 0f || BSParam.AvatarHeightHighFudge != 0f) | ||
667 | { | ||
668 | // An avatar is between 1.61 and 2.12 meters. Midpoint is 1.87m. | ||
669 | // The "times 4" relies on the fact that the difference from the midpoint to the extremes is exactly 0.25 | ||
670 | float midHeightOffset = size.Z - 1.87f; | ||
671 | if (midHeightOffset < 0f) | ||
672 | { | ||
673 | // Small avatar. Add the adjustment based on the distance from midheight | ||
674 | heightAdjust += -1f * midHeightOffset * 4f * BSParam.AvatarHeightLowFudge; | ||
675 | } | ||
676 | else | ||
677 | { | ||
678 | // Large avatar. Add the adjustment based on the distance from midheight | ||
679 | heightAdjust += midHeightOffset * 4f * BSParam.AvatarHeightHighFudge; | ||
680 | } | ||
681 | } | ||
665 | // The total scale height is the central cylindar plus the caps on the two ends. | 682 | // The total scale height is the central cylindar plus the caps on the two ends. |
666 | newScale.Z = (size.Z + (Math.Min(size.X, size.Y) * 2)) / 2f; | 683 | newScale.Z = (size.Z + (Math.Min(size.X, size.Y) * 2) + heightAdjust) / 2f; |
684 | // m_log.DebugFormat("{0} ComputeAvatarScale: size={1},adj={2},scale={3}", LogHeader, size, heightAdjust, newScale); | ||
685 | |||
667 | // If smaller than the endcaps, just fake like we're almost that small | 686 | // If smaller than the endcaps, just fake like we're almost that small |
668 | if (newScale.Z < 0) | 687 | if (newScale.Z < 0) |
669 | newScale.Z = 0.1f; | 688 | newScale.Z = 0.1f; |
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSParam.cs b/OpenSim/Region/Physics/BulletSPlugin/BSParam.cs index 5504478..d33292f 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSParam.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSParam.cs | |||
@@ -125,6 +125,9 @@ public static class BSParam | |||
125 | public static float AvatarCapsuleWidth { get; private set; } | 125 | public static float AvatarCapsuleWidth { get; private set; } |
126 | public static float AvatarCapsuleDepth { get; private set; } | 126 | public static float AvatarCapsuleDepth { get; private set; } |
127 | public static float AvatarCapsuleHeight { get; private set; } | 127 | public static float AvatarCapsuleHeight { get; private set; } |
128 | public static float AvatarHeightLowFudge { get; private set; } | ||
129 | public static float AvatarHeightMidFudge { get; private set; } | ||
130 | public static float AvatarHeightHighFudge { get; private set; } | ||
128 | public static float AvatarContactProcessingThreshold { get; private set; } | 131 | public static float AvatarContactProcessingThreshold { get; private set; } |
129 | public static float AvatarBelowGroundUpCorrectionMeters { get; private set; } | 132 | public static float AvatarBelowGroundUpCorrectionMeters { get; private set; } |
130 | public static float AvatarStepHeight { get; private set; } | 133 | public static float AvatarStepHeight { get; private set; } |
@@ -539,6 +542,12 @@ public static class BSParam | |||
539 | 0.45f ), | 542 | 0.45f ), |
540 | new ParameterDefn<float>("AvatarCapsuleHeight", "Default height of space around avatar", | 543 | new ParameterDefn<float>("AvatarCapsuleHeight", "Default height of space around avatar", |
541 | 1.5f ), | 544 | 1.5f ), |
545 | new ParameterDefn<float>("AvatarHeightLowFudge", "A fudge factor to make small avatars stand on the ground", | ||
546 | -0.2f ), | ||
547 | new ParameterDefn<float>("AvatarHeightMidFudge", "A fudge distance to adjust average sized avatars to be standing on ground", | ||
548 | 0.1f ), | ||
549 | new ParameterDefn<float>("AvatarHeightHighFudge", "A fudge factor to make tall avatars stand on the ground", | ||
550 | 0.1f ), | ||
542 | new ParameterDefn<float>("AvatarContactProcessingThreshold", "Distance from capsule to check for collisions", | 551 | new ParameterDefn<float>("AvatarContactProcessingThreshold", "Distance from capsule to check for collisions", |
543 | 0.1f ), | 552 | 0.1f ), |
544 | new ParameterDefn<float>("AvatarBelowGroundUpCorrectionMeters", "Meters to move avatar up if it seems to be below ground", | 553 | new ParameterDefn<float>("AvatarBelowGroundUpCorrectionMeters", "Meters to move avatar up if it seems to be below ground", |