aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Physics/OdePlugin
diff options
context:
space:
mode:
authorTeravus Ovares2008-01-18 02:26:43 +0000
committerTeravus Ovares2008-01-18 02:26:43 +0000
commitecd6c1110a8249aec10d70d63dccccae470cf5b3 (patch)
tree0bb35a0a71c4467c79ef570bc4af8ac8e606480d /OpenSim/Region/Physics/OdePlugin
parentparametrize like clauses for avatar picker (diff)
downloadopensim-SC-ecd6c1110a8249aec10d70d63dccccae470cf5b3.zip
opensim-SC-ecd6c1110a8249aec10d70d63dccccae470cf5b3.tar.gz
opensim-SC-ecd6c1110a8249aec10d70d63dccccae470cf5b3.tar.bz2
opensim-SC-ecd6c1110a8249aec10d70d63dccccae470cf5b3.tar.xz
* ODE Physics update. fixed weird rotation of the avatar surrogate.
* Set the avatar's radius to 0.37m, I think this gives the *best* balance between spaces the avatar can fit, and the ability to climb steps * Fixed a few things * Tweaked some more * Played with gravity (-9.8m/s)
Diffstat (limited to 'OpenSim/Region/Physics/OdePlugin')
-rw-r--r--OpenSim/Region/Physics/OdePlugin/ODECharacter.cs57
-rw-r--r--OpenSim/Region/Physics/OdePlugin/OdePlugin.cs12
2 files changed, 43 insertions, 26 deletions
diff --git a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs
index bfdb90f..85aac93 100644
--- a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs
+++ b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs
@@ -71,8 +71,8 @@ namespace OpenSim.Region.Physics.OdePlugin
71 private static float PID_D = 3020.0f; 71 private static float PID_D = 3020.0f;
72 private static float PID_P = 7000.0f; 72 private static float PID_P = 7000.0f;
73 private static float POSTURE_SERVO = 10000.0f; 73 private static float POSTURE_SERVO = 10000.0f;
74 public static float CAPSULE_RADIUS = 0.5f; 74 public static float CAPSULE_RADIUS = 0.37f;
75 public float CAPSULE_LENGTH = 0.79f; 75 public float CAPSULE_LENGTH = 2.140599f;
76 private bool flying = false; 76 private bool flying = false;
77 private bool m_iscolliding = false; 77 private bool m_iscolliding = false;
78 private bool m_iscollidingGround = false; 78 private bool m_iscollidingGround = false;
@@ -326,12 +326,14 @@ namespace OpenSim.Region.Physics.OdePlugin
326 lock (OdeScene.OdeLock) 326 lock (OdeScene.OdeLock)
327 { 327 {
328 d.JointDestroy(Amotor); 328 d.JointDestroy(Amotor);
329
329 PhysicsVector SetSize = value; 330 PhysicsVector SetSize = value;
330 float prevCapsule = CAPSULE_LENGTH; 331 float prevCapsule = CAPSULE_LENGTH;
331 float capsuleradius = CAPSULE_RADIUS; 332 float capsuleradius = CAPSULE_RADIUS;
332 capsuleradius = 0.2f; 333 //capsuleradius = 0.2f;
333 334
334 CAPSULE_LENGTH = (SetSize.Z - ((SetSize.Z*0.43f))); // subtract 43% of the size 335 CAPSULE_LENGTH = (SetSize.Z - ((SetSize.Z*0.43f))); // subtract 43% of the size
336 OpenSim.Framework.Console.MainLog.Instance.Verbose("SIZE", CAPSULE_LENGTH.ToString());
335 d.BodyDestroy(Body); 337 d.BodyDestroy(Body);
336 d.GeomDestroy(Shell); 338 d.GeomDestroy(Shell);
337 AvatarGeomAndBodyCreation(_position.X, _position.Y, 339 AvatarGeomAndBodyCreation(_position.X, _position.Y,
@@ -351,6 +353,7 @@ namespace OpenSim.Region.Physics.OdePlugin
351 /// <param name="npositionZ"></param> 353 /// <param name="npositionZ"></param>
352 private void AvatarGeomAndBodyCreation(float npositionX, float npositionY, float npositionZ) 354 private void AvatarGeomAndBodyCreation(float npositionX, float npositionY, float npositionZ)
353 { 355 {
356
354 int dAMotorEuler = 1; 357 int dAMotorEuler = 1;
355 Shell = d.CreateCapsule(_parent_scene.space, CAPSULE_RADIUS, CAPSULE_LENGTH); 358 Shell = d.CreateCapsule(_parent_scene.space, CAPSULE_RADIUS, CAPSULE_LENGTH);
356 d.MassSetCapsuleTotal(out ShellMass, m_mass, 2, CAPSULE_RADIUS, CAPSULE_LENGTH); 359 d.MassSetCapsuleTotal(out ShellMass, m_mass, 2, CAPSULE_RADIUS, CAPSULE_LENGTH);
@@ -360,7 +363,7 @@ namespace OpenSim.Region.Physics.OdePlugin
360 d.BodySetMass(Body, ref ShellMass); 363 d.BodySetMass(Body, ref ShellMass);
361 364
362 // 90 Stand up on the cap of the capped cyllinder 365 // 90 Stand up on the cap of the capped cyllinder
363 d.RFromAxisAndAngle(out m_StandUpRotation, 1, 0, 0, (float)(Math.PI / 2)); 366 d.RFromAxisAndAngle(out m_StandUpRotation, 1, 0, 1, (float)(Math.PI / 2));
364 367
365 368
366 d.GeomSetRotation(Shell, ref m_StandUpRotation); 369 d.GeomSetRotation(Shell, ref m_StandUpRotation);
@@ -395,21 +398,8 @@ namespace OpenSim.Region.Physics.OdePlugin
395 d.JointSetAMotorParam(Amotor, (int)dParam.FudgeFactor, 0f); 398 d.JointSetAMotorParam(Amotor, (int)dParam.FudgeFactor, 0f);
396 d.JointSetAMotorParam(Amotor, (int)dParam.FMax, 3800000f); 399 d.JointSetAMotorParam(Amotor, (int)dParam.FMax, 3800000f);
397 400
398 401 //standupStraight();
399 // The purpose of this routine here is to quickly stabilize the Body while it's popped up in the air. 402
400 // The amotor needs a few seconds to stabilize so without it, the avatar shoots up sky high when you
401 // change appearance and when you enter the simulator
402 // After this routine is done, the amotor stabilizes much quicker
403 d.Vector3 feet;
404 d.Vector3 head;
405 d.BodyGetRelPointPos(Body, 0.0f, 0.0f, -1.0f, out feet);
406 d.BodyGetRelPointPos(Body, 0.0f, 0.0f, 1.0f, out head);
407 float posture = head.Z - feet.Z;
408
409 // restoring force proportional to lack of posture:
410 float servo = (2.5f - posture) * POSTURE_SERVO;
411 d.BodyAddForceAtRelPos(Body, 0.0f, 0.0f, servo, 0.0f, 0.0f, 1.0f);
412 d.BodyAddForceAtRelPos(Body, 0.0f, 0.0f, -servo, 0.0f, 0.0f, -1.0f);
413 403
414 404
415 } 405 }
@@ -428,6 +418,27 @@ namespace OpenSim.Region.Physics.OdePlugin
428 } 418 }
429 } 419 }
430 420
421 private void standupStraight()
422 {
423
424 // The purpose of this routine here is to quickly stabilize the Body while it's popped up in the air.
425 // The amotor needs a few seconds to stabilize so without it, the avatar shoots up sky high when you
426 // change appearance and when you enter the simulator
427 // After this routine is done, the amotor stabilizes much quicker
428 d.Vector3 feet;
429 d.Vector3 head;
430 d.BodyGetRelPointPos(Body, 0.0f, 0.0f, -1.0f, out feet);
431 d.BodyGetRelPointPos(Body, 0.0f, 0.0f, 1.0f, out head);
432 float posture = head.Z - feet.Z;
433
434 // restoring force proportional to lack of posture:
435 float servo = (2.5f - posture) * POSTURE_SERVO;
436 d.BodyAddForceAtRelPos(Body, 0.0f, 0.0f, servo, 0.0f, 0.0f, 1.0f);
437 d.BodyAddForceAtRelPos(Body, 0.0f, 0.0f, -servo, 0.0f, 0.0f, -1.0f);
438 d.Matrix3 bodyrotation = d.BodyGetRotation(Body);
439 OpenSim.Framework.Console.MainLog.Instance.Verbose("PHYSICSAV", "Rotation: " + bodyrotation.M00 + " : " + bodyrotation.M01 + " : " + bodyrotation.M02 + " : " + bodyrotation.M10 + " : " + bodyrotation.M11 + " : " + bodyrotation.M12 + " : " + bodyrotation.M20 + " : " + bodyrotation.M21 + " : " + bodyrotation.M22);
440 }
441
431 public override PhysicsVector Force 442 public override PhysicsVector Force
432 { 443 {
433 get { return new PhysicsVector(_target_velocity.X, _target_velocity.Y, _target_velocity.Z); } 444 get { return new PhysicsVector(_target_velocity.X, _target_velocity.Y, _target_velocity.Z); }
@@ -467,7 +478,12 @@ namespace OpenSim.Region.Physics.OdePlugin
467 public override Quaternion Orientation 478 public override Quaternion Orientation
468 { 479 {
469 get { return Quaternion.Identity; } 480 get { return Quaternion.Identity; }
470 set { } 481 set {
482 //Matrix3 or = Orientation.ToRotationMatrix();
483 //d.Matrix3 ord = new d.Matrix3(or.m00, or.m10, or.m20, or.m01, or.m11, or.m21, or.m02, or.m12, or.m22);
484 //d.BodySetRotation(Body, ref ord);
485
486 }
471 } 487 }
472 488
473 public override PhysicsVector Acceleration 489 public override PhysicsVector Acceleration
@@ -505,6 +521,7 @@ namespace OpenSim.Region.Physics.OdePlugin
505 if (!collidelock) 521 if (!collidelock)
506 { 522 {
507 d.BodyAddForce(Body, force.X, force.Y, force.Z); 523 d.BodyAddForce(Body, force.X, force.Y, force.Z);
524 //standupStraight();
508 } 525 }
509 } 526 }
510 527
diff --git a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs
index 47839ca..4045add 100644
--- a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs
+++ b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs
@@ -174,7 +174,7 @@ namespace OpenSim.Region.Physics.OdePlugin
174 174
175 // Set the gravity,, don't disable things automatically (we set it explicitly on some things) 175 // Set the gravity,, don't disable things automatically (we set it explicitly on some things)
176 176
177 d.WorldSetGravity(world, 0.0f, 0.0f, -10.0f); 177 d.WorldSetGravity(world, 0.0f, 0.0f, -9.8f);
178 d.WorldSetAutoDisableFlag(world, false); 178 d.WorldSetAutoDisableFlag(world, false);
179 d.WorldSetContactSurfaceLayer(world, 0.001f); 179 d.WorldSetContactSurfaceLayer(world, 0.001f);
180 180
@@ -336,8 +336,8 @@ namespace OpenSim.Region.Physics.OdePlugin
336 336
337 if (contacts[i].depth >= 0.08f) 337 if (contacts[i].depth >= 0.08f)
338 { 338 {
339 /* This is disabled at the moment only because it needs more tweaking 339 //This is disabled at the moment only because it needs more tweaking
340 It will eventually be uncommented 340 //It will eventually be uncommented
341 341
342 if (contacts[i].depth >= 1.00f) 342 if (contacts[i].depth >= 1.00f)
343 { 343 {
@@ -363,7 +363,7 @@ namespace OpenSim.Region.Physics.OdePlugin
363 else 363 else
364 { 364 {
365 365
366 contacts[i].depth = 0.0000000f; 366 //contacts[i].depth = 0.0000000f;
367 } 367 }
368 if (p1.PhysicsActorType == (int) ActorTypes.Agent) 368 if (p1.PhysicsActorType == (int) ActorTypes.Agent)
369 { 369 {
@@ -378,10 +378,10 @@ namespace OpenSim.Region.Physics.OdePlugin
378 else 378 else
379 { 379 {
380 380
381 contacts[i].depth = 0.0000000f; 381 //contacts[i].depth = 0.0000000f;
382 } 382 }
383 } 383 }
384 */ 384
385 385
386 // If you interpenetrate a prim with another prim 386 // If you interpenetrate a prim with another prim
387 if (p1.PhysicsActorType == (int) ActorTypes.Prim && p2.PhysicsActorType == (int) ActorTypes.Prim) 387 if (p1.PhysicsActorType == (int) ActorTypes.Prim && p2.PhysicsActorType == (int) ActorTypes.Prim)