diff options
author | Robert Adams | 2013-01-20 22:35:42 -0800 |
---|---|---|
committer | Robert Adams | 2013-01-20 23:09:54 -0800 |
commit | 52b341e2e24384395fddc7d32fd66358f5062468 (patch) | |
tree | a0b28ec5b79004b1a556db78d835e486b8040632 /OpenSim/Region/Physics/BulletSPlugin/BSMotors.cs | |
parent | BulletSim: fix problem of avatar sliding very slowly occasionally after stopp... (diff) | |
download | opensim-SC-52b341e2e24384395fddc7d32fd66358f5062468.zip opensim-SC-52b341e2e24384395fddc7d32fd66358f5062468.tar.gz opensim-SC-52b341e2e24384395fddc7d32fd66358f5062468.tar.bz2 opensim-SC-52b341e2e24384395fddc7d32fd66358f5062468.tar.xz |
BulletSim: More aggressive as setting character velocity to zero
when should be standing.
Modify angular force routines to be the same pattern as linear force routines.
BulletSim vehicle turning is scaled like SL and is DIFFERENT THAN ODE!!
Fix some bugs in BSMotor dealing with the motor going to zero.
Add a bunch of parameters: MaxLinearVelocity, MaxAngularVelocity,
MaxAddForceMagnitude, VehicleMaxLinearVelocity, VehicleMaxAngularVelocity,
and most of the values are defaulted to values that are larger
than in SL.
Use the new parameters in BSPrim, BSCharacter and BSDynamic.
Diffstat (limited to 'OpenSim/Region/Physics/BulletSPlugin/BSMotors.cs')
-rwxr-xr-x | OpenSim/Region/Physics/BulletSPlugin/BSMotors.cs | 26 |
1 files changed, 19 insertions, 7 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSMotors.cs b/OpenSim/Region/Physics/BulletSPlugin/BSMotors.cs index 82fd2d2..9501e2d 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSMotors.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSMotors.cs | |||
@@ -149,6 +149,7 @@ public class BSVMotor : BSMotor | |||
149 | 149 | ||
150 | Vector3 correction = Vector3.Zero; | 150 | Vector3 correction = Vector3.Zero; |
151 | Vector3 error = TargetValue - CurrentValue; | 151 | Vector3 error = TargetValue - CurrentValue; |
152 | LastError = error; | ||
152 | if (!ErrorIsZero(error)) | 153 | if (!ErrorIsZero(error)) |
153 | { | 154 | { |
154 | correction = StepError(timeStep, error); | 155 | correction = StepError(timeStep, error); |
@@ -188,9 +189,15 @@ public class BSVMotor : BSMotor | |||
188 | else | 189 | else |
189 | { | 190 | { |
190 | // Difference between what we have and target is small. Motor is done. | 191 | // Difference between what we have and target is small. Motor is done. |
191 | CurrentValue = TargetValue = Vector3.Zero; | 192 | if (TargetValue.ApproxEquals(Vector3.Zero, ErrorZeroThreshold)) |
192 | MDetailLog("{0}, BSVMotor.Step,zero,{1},origTgt={2},origCurr={3},ret={4}", | 193 | { |
193 | BSScene.DetailLogZero, UseName, origCurrVal, origTarget, CurrentValue); | 194 | // The target can step down to nearly zero but not get there. If close to zero |
195 | // it is really zero. | ||
196 | TargetValue = Vector3.Zero; | ||
197 | } | ||
198 | CurrentValue = TargetValue; | ||
199 | MDetailLog("{0}, BSVMotor.Step,zero,{1},origTgt={2},origCurr={3},currTgt={4},currCurr={5}", | ||
200 | BSScene.DetailLogZero, UseName, origCurrVal, origTarget, TargetValue, CurrentValue); | ||
194 | } | 201 | } |
195 | 202 | ||
196 | return correction; | 203 | return correction; |
@@ -205,9 +212,8 @@ public class BSVMotor : BSMotor | |||
205 | { | 212 | { |
206 | if (!Enabled) return Vector3.Zero; | 213 | if (!Enabled) return Vector3.Zero; |
207 | 214 | ||
208 | LastError = error; | ||
209 | Vector3 returnCorrection = Vector3.Zero; | 215 | Vector3 returnCorrection = Vector3.Zero; |
210 | if (!ErrorIsZero()) | 216 | if (!ErrorIsZero(error)) |
211 | { | 217 | { |
212 | // correction = error / secondsItShouldTakeToCorrect | 218 | // correction = error / secondsItShouldTakeToCorrect |
213 | Vector3 correctionAmount; | 219 | Vector3 correctionAmount; |
@@ -309,6 +315,7 @@ public class BSFMotor : BSMotor | |||
309 | 315 | ||
310 | float correction = 0f; | 316 | float correction = 0f; |
311 | float error = TargetValue - CurrentValue; | 317 | float error = TargetValue - CurrentValue; |
318 | LastError = error; | ||
312 | if (!ErrorIsZero(error)) | 319 | if (!ErrorIsZero(error)) |
313 | { | 320 | { |
314 | correction = StepError(timeStep, error); | 321 | correction = StepError(timeStep, error); |
@@ -346,6 +353,12 @@ public class BSFMotor : BSMotor | |||
346 | else | 353 | else |
347 | { | 354 | { |
348 | // Difference between what we have and target is small. Motor is done. | 355 | // Difference between what we have and target is small. Motor is done. |
356 | if (Util.InRange<float>(TargetValue, -ErrorZeroThreshold, ErrorZeroThreshold)) | ||
357 | { | ||
358 | // The target can step down to nearly zero but not get there. If close to zero | ||
359 | // it is really zero. | ||
360 | TargetValue = 0f; | ||
361 | } | ||
349 | CurrentValue = TargetValue; | 362 | CurrentValue = TargetValue; |
350 | MDetailLog("{0}, BSFMotor.Step,zero,{1},origTgt={2},origCurr={3},ret={4}", | 363 | MDetailLog("{0}, BSFMotor.Step,zero,{1},origTgt={2},origCurr={3},ret={4}", |
351 | BSScene.DetailLogZero, UseName, origCurrVal, origTarget, CurrentValue); | 364 | BSScene.DetailLogZero, UseName, origCurrVal, origTarget, CurrentValue); |
@@ -358,9 +371,8 @@ public class BSFMotor : BSMotor | |||
358 | { | 371 | { |
359 | if (!Enabled) return 0f; | 372 | if (!Enabled) return 0f; |
360 | 373 | ||
361 | LastError = error; | ||
362 | float returnCorrection = 0f; | 374 | float returnCorrection = 0f; |
363 | if (!ErrorIsZero()) | 375 | if (!ErrorIsZero(error)) |
364 | { | 376 | { |
365 | // correction = error / secondsItShouldTakeToCorrect | 377 | // correction = error / secondsItShouldTakeToCorrect |
366 | float correctionAmount; | 378 | float correctionAmount; |