aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim')
-rw-r--r--OpenSim/Region/Physics/OdePlugin/OdePlugin.cs28
1 files changed, 24 insertions, 4 deletions
diff --git a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs
index bfbd880..a6834d4 100644
--- a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs
+++ b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs
@@ -272,6 +272,8 @@ namespace OpenSim.Region.Physics.OdePlugin
272 public class OdeCharacter : PhysicsActor 272 public class OdeCharacter : PhysicsActor
273 { 273 {
274 private PhysicsVector _position; 274 private PhysicsVector _position;
275 private d.Vector3 _zeroPosition;
276 private bool _zeroFlag=false;
275 private PhysicsVector _velocity; 277 private PhysicsVector _velocity;
276 private PhysicsVector _acceleration; 278 private PhysicsVector _acceleration;
277 private bool flying = false; 279 private bool flying = false;
@@ -402,11 +404,29 @@ namespace OpenSim.Region.Physics.OdePlugin
402 // no lock; for now it's only called from within Simulate() 404 // no lock; for now it's only called from within Simulate()
403 PhysicsVector vec = new PhysicsVector(); 405 PhysicsVector vec = new PhysicsVector();
404 d.Vector3 vel = d.BodyGetLinearVel(BoundingCapsule); 406 d.Vector3 vel = d.BodyGetLinearVel(BoundingCapsule);
405 vec.X = (vel.X - this._velocity.X) * -75000.0f; 407
406 vec.Y = (vel.Y - this._velocity.Y) * -75000.0f; 408 // if velocity is zero, use position control; otherwise, velocity control
407 if (flying) 409 if (_velocity.X == 0.0f & _velocity.Y == 0.0f & _velocity.Z == 0.0f & !flying)
408 { 410 {
409 vec.Z = (vel.Z - this._velocity.Z) * -75000.0f; 411 // keep track of where we stopped. No more slippin' & slidin'
412 if (!_zeroFlag)
413 {
414 _zeroFlag = true;
415 _zeroPosition = d.BodyGetPosition(BoundingCapsule);
416 }
417 d.Vector3 pos = d.BodyGetPosition(BoundingCapsule);
418 vec.X = (_velocity.X - vel.X) * 75000.0f + (_zeroPosition.X - pos.X) * 120000.0f;
419 vec.Y = (_velocity.Y - vel.Y) * 75000.0f + (_zeroPosition.Y - pos.Y) * 120000.0f;
420 }
421 else
422 {
423 _zeroFlag = false;
424 vec.X = (_velocity.X - vel.X) * 75000.0f;
425 vec.Y = (_velocity.Y - vel.Y) * 75000.0f;
426 if (flying)
427 {
428 vec.Z = (_velocity.Z - vel.Z) * 75000.0f;
429 }
410 } 430 }
411 d.BodyAddForce(this.BoundingCapsule, vec.X, vec.Y, vec.Z); 431 d.BodyAddForce(this.BoundingCapsule, vec.X, vec.Y, vec.Z);
412 } 432 }