aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorRobert Adams2012-10-31 09:26:58 -0700
committerRobert Adams2012-11-03 21:14:58 -0700
commit28e2cd3fa21835b124552dec024745f5784f6b3a (patch)
tree03b422548908cb2c4ec734c27ac2ad9824015cca
parentBulletSim: remove center-of-mass setting for linksets because it causes the c... (diff)
downloadopensim-SC-28e2cd3fa21835b124552dec024745f5784f6b3a.zip
opensim-SC-28e2cd3fa21835b124552dec024745f5784f6b3a.tar.gz
opensim-SC-28e2cd3fa21835b124552dec024745f5784f6b3a.tar.bz2
opensim-SC-28e2cd3fa21835b124552dec024745f5784f6b3a.tar.xz
BulletSim: vehicle tweeking.
Add AddTorque() method to BSPrim. Remove some manual motor actions in computing angular force (will eventually be replaced with motor class). Remove some experimental changes.
-rw-r--r--OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs136
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BSLinksetConstraints.cs2
-rw-r--r--OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs45
3 files changed, 90 insertions, 93 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs b/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs
index 4981007..5c61774 100644
--- a/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs
@@ -511,21 +511,6 @@ namespace OpenSim.Region.Physics.BulletSPlugin
511 // Do any updating needed for a vehicle 511 // Do any updating needed for a vehicle
512 public void Refresh() 512 public void Refresh()
513 { 513 {
514 /*
515 * Doesnt work unless BSDynamics senses and corrects for all collisions
516 if (IsActive)
517 BulletSimAPI.AddToCollisionFlags2(Prim.BSBody.ptr, CollisionFlags.CF_KINEMATIC_OBJECT);
518 else
519 BulletSimAPI.RemoveFromCollisionFlags2(Prim.BSBody.ptr, CollisionFlags.CF_KINEMATIC_OBJECT);
520 */
521 /*
522 * Doesn't work because with zero inertia, Bullet will not apply any forces to the object.
523 if (IsActive)
524 {
525 BulletSimAPI.SetMassProps2(Prim.BSBody.ptr, Prim.MassRaw, Vector3.Zero);
526 BulletSimAPI.UpdateInertiaTensor2(Prim.BSBody.ptr);
527 }
528 */
529 if (IsActive) 514 if (IsActive)
530 { 515 {
531 // Friction effects are handled by this vehicle code 516 // Friction effects are handled by this vehicle code
@@ -539,29 +524,21 @@ namespace OpenSim.Region.Physics.BulletSPlugin
539 { 524 {
540 if (!IsActive) return; 525 if (!IsActive) return;
541 526
542 m_lastAngularVelocity = Prim.ForceRotationalVelocity; // DEBUG: account for what Bullet did last time 527 // DEBUG
528 // Because Bullet does apply forces to the vehicle, our last computed
529 // linear and angular velocities are not what is happening now.
530 // Vector3 externalAngularVelocity = Prim.ForceRotationalVelocity - m_lastAngularVelocity;
531 // m_lastAngularVelocity += (externalAngularVelocity * 0.5f) * pTimestep;
532 // m_lastAngularVelocity = Prim.ForceRotationalVelocity; // DEBUG: account for what Bullet did last time
533 // m_lastLinearVelocityVector = Prim.ForceVelocity * Quaternion.Inverse(Prim.ForceOrientation); // DEBUG:
534 // END DEBUG
543 535
544 MoveLinear(pTimestep); 536 MoveLinear(pTimestep);
545 MoveAngular(pTimestep); 537 MoveAngular(pTimestep);
546 LimitRotation(pTimestep); 538 LimitRotation(pTimestep);
547 539
548 /* Experimental
549 // Wonder if Bullet could handle collision penetration while this applies the forces.
550 // Apply the computed forces on the vehicle
551 Prim.ForcePosition += Prim.ForceVelocity * Prim.MassRaw * pTimestep;
552
553 if (Prim.ForceRotationalVelocity != Vector3.Zero)
554 {
555 Quaternion newOrientation = Prim.ForceOrientation;
556 newOrientation.Normalize();
557 Quaternion appliedRotation = new Quaternion((Prim.ForceRotationalVelocity * pTimestep), 0f);
558 newOrientation += (appliedRotation * newOrientation) * 0.5f;
559 newOrientation.Normalize();
560 Prim.ForceOrientation = newOrientation;
561 }
562 */
563 // DEBUG: Trying to figure out why Bullet goes crazy when the root prim is moved. 540 // DEBUG: Trying to figure out why Bullet goes crazy when the root prim is moved.
564 BulletSimAPI.SetInterpolationVelocity2(Prim.BSBody.ptr, m_newVelocity, m_lastAngularVelocity); // DEBUG DEBUG DEBUG 541 // BulletSimAPI.SetInterpolationVelocity2(Prim.BSBody.ptr, m_newVelocity, m_lastAngularVelocity); // DEBUG DEBUG DEBUG
565 542
566 // remember the position so next step we can limit absolute movement effects 543 // remember the position so next step we can limit absolute movement effects
567 m_lastPositionVector = Prim.ForcePosition; 544 m_lastPositionVector = Prim.ForcePosition;
@@ -583,7 +560,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
583 Vector3 vehicleVelocity = Prim.ForceVelocity * Quaternion.Inverse(Prim.ForceOrientation); // DEBUG 560 Vector3 vehicleVelocity = Prim.ForceVelocity * Quaternion.Inverse(Prim.ForceOrientation); // DEBUG
584 561
585 // add drive to body 562 // add drive to body
586 Vector3 addAmount = (m_linearMotorDirection - m_lastLinearVelocityVector)/(m_linearMotorTimescale / pTimestep); 563 Vector3 addAmount = (m_linearMotorDirection - m_lastLinearVelocityVector)/(m_linearMotorTimescale) * pTimestep;
587 // lastLinearVelocityVector is the current body velocity vector 564 // lastLinearVelocityVector is the current body velocity vector
588 m_lastLinearVelocityVector += addAmount; 565 m_lastLinearVelocityVector += addAmount;
589 566
@@ -593,11 +570,12 @@ namespace OpenSim.Region.Physics.BulletSPlugin
593 Vector3 frictionFactor = (Vector3.One / m_linearFrictionTimescale) * pTimestep; 570 Vector3 frictionFactor = (Vector3.One / m_linearFrictionTimescale) * pTimestep;
594 m_lastLinearVelocityVector *= (Vector3.One - frictionFactor); 571 m_lastLinearVelocityVector *= (Vector3.One - frictionFactor);
595 572
596 VDetailLog("{0},MoveLinear,nonZero,origdir={1},origvel={2},vehVel={3},add={4},decay={5},lmDir={6},lmVel={7}", 573 // Rotate new object velocity from vehicle relative to world coordinates
597 Prim.LocalID, origDir, origVel, vehicleVelocity, addAmount, decayFactor, m_linearMotorDirection, m_lastLinearVelocityVector);
598
599 // convert requested object velocity to object relative vector
600 m_newVelocity = m_lastLinearVelocityVector * Prim.ForceOrientation; 574 m_newVelocity = m_lastLinearVelocityVector * Prim.ForceOrientation;
575
576 VDetailLog("{0},MoveLinear,nonZero,origdir={1},origvel={2},vehVel={3},add={4},decay={5},frict={6},lmDir={7},lmVel={8},newVel={9}",
577 Prim.LocalID, origDir, origVel, vehicleVelocity, addAmount, decayFactor, frictionFactor,
578 m_linearMotorDirection, m_lastLinearVelocityVector, m_newVelocity);
601 } 579 }
602 else 580 else
603 { 581 {
@@ -609,18 +587,15 @@ namespace OpenSim.Region.Physics.BulletSPlugin
609 VDetailLog("{0},MoveLinear,zeroed", Prim.LocalID); 587 VDetailLog("{0},MoveLinear,zeroed", Prim.LocalID);
610 } 588 }
611 589
612 // m_newVelocity is velocity computed from linear motor 590 // m_newVelocity is velocity computed from linear motor in world coordinates
613 591
614 // Add the various forces into m_dir which will be our new direction vector (velocity) 592 // Gravity and Buoyancy
615
616 // add Gravity and Buoyancy
617 // There is some gravity, make a gravity force vector that is applied after object velocity. 593 // There is some gravity, make a gravity force vector that is applied after object velocity.
618 // m_VehicleBuoyancy: -1=2g; 0=1g; 1=0g; 594 // m_VehicleBuoyancy: -1=2g; 0=1g; 1=0g;
619 // Vector3 grav = Prim.PhysicsScene.DefaultGravity * (Prim.Linkset.LinksetMass * (1f - m_VehicleBuoyancy));
620 Vector3 grav = Prim.PhysicsScene.DefaultGravity * (1f - m_VehicleBuoyancy); 595 Vector3 grav = Prim.PhysicsScene.DefaultGravity * (1f - m_VehicleBuoyancy);
621 596
622 /* 597 /*
623 * RA: Not sure why one would do this 598 * RA: Not sure why one would do this unless we are hoping external forces are doing gravity, ...
624 // Preserve the current Z velocity 599 // Preserve the current Z velocity
625 Vector3 vel_now = m_prim.Velocity; 600 Vector3 vel_now = m_prim.Velocity;
626 m_dir.Z = vel_now.Z; // Preserve the accumulated falling velocity 601 m_dir.Z = vel_now.Z; // Preserve the accumulated falling velocity
@@ -676,7 +651,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
676 else 651 else
677 { 652 {
678 float verticalError = pos.Z - m_VhoverTargetHeight; 653 float verticalError = pos.Z - m_VhoverTargetHeight;
679 // RA: where does the 50 come from> 654 // RA: where does the 50 come from?
680 float verticalCorrectionVelocity = pTimestep * ((verticalError * 50.0f) / m_VhoverTimescale); 655 float verticalCorrectionVelocity = pTimestep * ((verticalError * 50.0f) / m_VhoverTimescale);
681 // Replace Vertical speed with correction figure if significant 656 // Replace Vertical speed with correction figure if significant
682 if (Math.Abs(verticalError) > 0.01f) 657 if (Math.Abs(verticalError) > 0.01f)
@@ -784,37 +759,24 @@ namespace OpenSim.Region.Physics.BulletSPlugin
784 // m_angularFrictionTimescale // body angular velocity decay rate 759 // m_angularFrictionTimescale // body angular velocity decay rate
785 // m_lastAngularVelocity // what was last applied to body 760 // m_lastAngularVelocity // what was last applied to body
786 761
787 // Get what the body is doing, this includes 'external' influences 762 if (m_angularMotorDirection.LengthSquared() > 0.0001)
788 Vector3 angularVelocity = Prim.ForceRotationalVelocity;
789
790 if (m_angularMotorApply > 0)
791 { 763 {
792 // Rather than snapping the angular motor velocity from the old value to
793 // a newly set velocity, this routine steps the value from the previous
794 // value (m_angularMotorVelocity) to the requested value (m_angularMotorDirection).
795 // There are m_angularMotorApply steps.
796 Vector3 origVel = m_angularMotorVelocity; 764 Vector3 origVel = m_angularMotorVelocity;
797 Vector3 origDir = m_angularMotorDirection; 765 Vector3 origDir = m_angularMotorDirection;
798 766
799 // ramp up to new value
800 // new velocity += error / ( time to get there / step interval) 767 // new velocity += error / ( time to get there / step interval)
801 // requested speed - last motor speed 768 // requested speed - last motor speed
802 m_angularMotorVelocity += (m_angularMotorDirection - m_angularMotorVelocity) / (m_angularMotorTimescale / pTimestep); 769 m_angularMotorVelocity += (m_angularMotorDirection - m_angularMotorVelocity) / (m_angularMotorTimescale / pTimestep);
770 // decay requested direction
771 m_angularMotorDirection *= (1.0f - (pTimestep * 1.0f/m_angularMotorDecayTimescale));
803 772
804 VDetailLog("{0},MoveAngular,angularMotorApply,apply={1},angTScale={2},timeStep={3},origvel={4},origDir={5},vel={6}", 773 VDetailLog("{0},MoveAngular,angularMotorApply,angTScale={1},timeStep={2},origvel={3},origDir={4},vel={5}",
805 Prim.LocalID, m_angularMotorApply, m_angularMotorTimescale, pTimestep, origVel, origDir, m_angularMotorVelocity); 774 Prim.LocalID, m_angularMotorTimescale, pTimestep, origVel, origDir, m_angularMotorVelocity);
806
807 m_angularMotorApply--;
808 } 775 }
809 else 776 else
810 { 777 {
811 // No motor recently applied, keep the body velocity 778 m_angularMotorVelocity = Vector3.Zero;
812 // and decay the velocity 779 }
813 if (m_angularMotorVelocity.LengthSquared() < 0.0001)
814 m_angularMotorVelocity = Vector3.Zero;
815 else
816 m_angularMotorVelocity -= m_angularMotorVelocity / (m_angularMotorDecayTimescale / pTimestep);
817 } // end motor section
818 780
819 #region Vertical attactor 781 #region Vertical attactor
820 782
@@ -824,22 +786,19 @@ namespace OpenSim.Region.Physics.BulletSPlugin
824 786
825 if (m_verticalAttractionTimescale < 300 && m_lastAngularVelocity != Vector3.Zero) 787 if (m_verticalAttractionTimescale < 300 && m_lastAngularVelocity != Vector3.Zero)
826 { 788 {
827 float VAservo = 0.2f; 789 float VAservo = pTimestep * 0.2f / m_verticalAttractionTimescale;
828 if (Prim.Linkset.LinksetIsColliding) 790 if (Prim.Linkset.LinksetIsColliding)
829 VAservo = 0.05f / (m_verticalAttractionTimescale / pTimestep); 791 VAservo = pTimestep * 0.05f / (m_verticalAttractionTimescale);
830 792
831 VAservo *= (m_verticalAttractionEfficiency * m_verticalAttractionEfficiency); 793 VAservo *= (m_verticalAttractionEfficiency * m_verticalAttractionEfficiency);
832 794
833 // get present body rotation 795 // Create a vector of the vehicle "up" in world coordinates
834 Quaternion rotq = Prim.ForceOrientation; 796 Vector3 verticalError = Vector3.UnitZ * Prim.ForceOrientation;
835 // vector pointing up 797 // verticalError.X and .Y are the World error amounts. They are 0 when there is no
836 Vector3 verticalError = Vector3.UnitZ; 798 // error (Vehicle Body is 'vertical'), and .Z will be 1. As the body leans to its
837 799 // side |.X| will increase to 1 and .Z fall to 0. As body inverts |.X| will fall
838 // rotate it to Body Angle 800 // and .Z will go // negative. Similar for tilt and |.Y|. .X and .Y must be
839 verticalError = verticalError * rotq; 801 // modulated to prevent a stable inverted body.
840 // verticalError.X and .Y are the World error amounts. They are 0 when there is no error (Vehicle Body is 'vertical'), and .Z will be 1.
841 // As the body leans to its side |.X| will increase to 1 and .Z fall to 0. As body inverts |.X| will fall and .Z will go
842 // negative. Similar for tilt and |.Y|. .X and .Y must be modulated to prevent a stable inverted body.
843 802
844 // Error is 0 (no error) to +/- 2 (max error) 803 // Error is 0 (no error) to +/- 2 (max error)
845 if (verticalError.Z < 0.0f) 804 if (verticalError.Z < 0.0f)
@@ -850,13 +809,15 @@ namespace OpenSim.Region.Physics.BulletSPlugin
850 // scale it by VAservo 809 // scale it by VAservo
851 verticalError = verticalError * VAservo; 810 verticalError = verticalError * VAservo;
852 811
853 // As the body rotates around the X axis, then verticalError.Y increases; Rotated around Y then .X increases, so 812 // As the body rotates around the X axis, then verticalError.Y increases; Rotated around Y
854 // Change Body angular velocity X based on Y, and Y based on X. Z is not changed. 813 // then .X increases, so change Body angular velocity X based on Y, and Y based on X.
814 // Z is not changed.
855 vertattr.X = verticalError.Y; 815 vertattr.X = verticalError.Y;
856 vertattr.Y = - verticalError.X; 816 vertattr.Y = - verticalError.X;
857 vertattr.Z = 0f; 817 vertattr.Z = 0f;
858 818
859 // scaling appears better usingsquare-law 819 // scaling appears better usingsquare-law
820 Vector3 angularVelocity = Prim.ForceRotationalVelocity;
860 float bounce = 1.0f - (m_verticalAttractionEfficiency * m_verticalAttractionEfficiency); 821 float bounce = 1.0f - (m_verticalAttractionEfficiency * m_verticalAttractionEfficiency);
861 vertattr.X += bounce * angularVelocity.X; 822 vertattr.X += bounce * angularVelocity.X;
862 vertattr.Y += bounce * angularVelocity.Y; 823 vertattr.Y += bounce * angularVelocity.Y;
@@ -956,15 +917,22 @@ namespace OpenSim.Region.Physics.BulletSPlugin
956 VDetailLog("{0},MoveAngular,zeroSmallValues,lastAngular={1}", Prim.LocalID, m_lastAngularVelocity); 917 VDetailLog("{0},MoveAngular,zeroSmallValues,lastAngular={1}", Prim.LocalID, m_lastAngularVelocity);
957 } 918 }
958 919
959 // apply friction
960 Vector3 decayamount = Vector3.One / (m_angularFrictionTimescale / pTimestep);
961 m_lastAngularVelocity -= m_lastAngularVelocity * decayamount;
962
963 // Apply to the body 920 // Apply to the body
964 // The above calculates the absolute angular velocity needed 921 // The above calculates the absolute angular velocity needed
965 Prim.ForceRotationalVelocity = m_lastAngularVelocity; 922 // Prim.ForceRotationalVelocity = m_lastAngularVelocity;
923
924 // Apply a force to overcome current angular velocity
925 Vector3 applyAngularForce = (m_lastAngularVelocity - Prim.ForceRotationalVelocity) * Prim.Linkset.LinksetMass;
926 // Vector3 applyAngularForce = (m_lastAngularVelocity - Prim.ForceRotationalVelocity);
927 // Prim.AddAngularForce(applyAngularForce, false);
928 Prim.ApplyTorqueImpulse(applyAngularForce, false);
929
930 // Apply friction for next time
931 Vector3 decayamount = (Vector3.One / m_angularFrictionTimescale) * pTimestep;
932 m_lastAngularVelocity *= Vector3.One - decayamount;
966 933
967 VDetailLog("{0},MoveAngular,done,decay={1},lastAngular={2}", Prim.LocalID, decayamount, m_lastAngularVelocity); 934 VDetailLog("{0},MoveAngular,done,applyAForce={1},decay={2},lastAngular={3}",
935 Prim.LocalID, applyAngularForce, decayamount, m_lastAngularVelocity);
968 } //end MoveAngular 936 } //end MoveAngular
969 937
970 internal void LimitRotation(float timestep) 938 internal void LimitRotation(float timestep)
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSLinksetConstraints.cs b/OpenSim/Region/Physics/BulletSPlugin/BSLinksetConstraints.cs
index ecb6ad4..8cdbd9b 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSLinksetConstraints.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSLinksetConstraints.cs
@@ -299,7 +299,7 @@ public sealed class BSLinksetConstraints : BSLinkset
299 // DEBUG: see of inter-linkset collisions are causing problems 299 // DEBUG: see of inter-linkset collisions are causing problems
300 // BulletSimAPI.SetCollisionFilterMask2(LinksetRoot.BSBody.ptr, 300 // BulletSimAPI.SetCollisionFilterMask2(LinksetRoot.BSBody.ptr,
301 // (uint)CollisionFilterGroups.LinksetFilter, (uint)CollisionFilterGroups.LinksetMask); 301 // (uint)CollisionFilterGroups.LinksetFilter, (uint)CollisionFilterGroups.LinksetMask);
302 DetailLog("{0},BSLinksetConstraint.RecomputeLinksetConstraints,setCenterOfMass,rBody={1},linksetMass={2}", 302 DetailLog("{0},BSLinksetConstraint.RecomputeLinksetConstraints,set,rBody={1},linksetMass={2}",
303 LinksetRoot.LocalID, LinksetRoot.BSBody.ptr.ToString("X"), linksetMass); 303 LinksetRoot.LocalID, LinksetRoot.BSBody.ptr.ToString("X"), linksetMass);
304 304
305 foreach (BSPhysObject child in m_children) 305 foreach (BSPhysObject child in m_children)
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs
index 7851a40..9ced61fa 100644
--- a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs
@@ -378,7 +378,9 @@ public sealed class BSPrim : BSPhysObject
378 { 378 {
379 OMV.Vector3 localInertia = BulletSimAPI.CalculateLocalInertia2(BSShape.ptr, physMass); 379 OMV.Vector3 localInertia = BulletSimAPI.CalculateLocalInertia2(BSShape.ptr, physMass);
380 BulletSimAPI.SetMassProps2(BSBody.ptr, physMass, localInertia); 380 BulletSimAPI.SetMassProps2(BSBody.ptr, physMass, localInertia);
381 BulletSimAPI.UpdateInertiaTensor2(BSBody.ptr); 381 // center of mass is at the zero of the object
382 BulletSimAPI.SetCenterOfMassByPosRot2(BSBody.ptr, ForcePosition, ForceOrientation);
383 // BulletSimAPI.UpdateInertiaTensor2(BSBody.ptr);
382 DetailLog("{0},BSPrim.UpdateMassProperties,mass={1},localInertia={2}", LocalID, physMass, localInertia); 384 DetailLog("{0},BSPrim.UpdateMassProperties,mass={1},localInertia={2}", LocalID, physMass, localInertia);
383 } 385 }
384 } 386 }
@@ -462,9 +464,16 @@ public sealed class BSPrim : BSPhysObject
462 // Called from Scene when doing simulation step so we're in taint processing time. 464 // Called from Scene when doing simulation step so we're in taint processing time.
463 public override void StepVehicle(float timeStep) 465 public override void StepVehicle(float timeStep)
464 { 466 {
465 if (IsPhysical) 467 if (IsPhysical && _vehicle.IsActive)
466 { 468 {
467 _vehicle.Step(timeStep); 469 _vehicle.Step(timeStep);
470 /* // TEST TEST DEBUG DEBUG -- trying to reduce the extra action of Bullet simulation step
471 PhysicsScene.PostTaintObject("BSPrim.StepVehicles", LocalID, delegate()
472 {
473 // This resets the interpolation values and recomputes the tensor variables
474 BulletSimAPI.SetCenterOfMassByPosRot2(BSBody.ptr, ForcePosition, ForceOrientation);
475 });
476 */
468 } 477 }
469 } 478 }
470 479
@@ -502,7 +511,9 @@ public sealed class BSPrim : BSPhysObject
502 } 511 }
503 public override OMV.Vector3 Torque { 512 public override OMV.Vector3 Torque {
504 get { return _torque; } 513 get { return _torque; }
505 set { _torque = value; 514 set {
515 _torque = value;
516 AddAngularForce(_torque, false, false);
506 // DetailLog("{0},BSPrim.SetTorque,call,torque={1}", LocalID, _torque); 517 // DetailLog("{0},BSPrim.SetTorque,call,torque={1}", LocalID, _torque);
507 } 518 }
508 } 519 }
@@ -831,7 +842,7 @@ public sealed class BSPrim : BSPhysObject
831 // m_log.DebugFormat("{0}: RotationalVelocity={1}", LogHeader, _rotationalVelocity); 842 // m_log.DebugFormat("{0}: RotationalVelocity={1}", LogHeader, _rotationalVelocity);
832 PhysicsScene.TaintedObject("BSPrim.setRotationalVelocity", delegate() 843 PhysicsScene.TaintedObject("BSPrim.setRotationalVelocity", delegate()
833 { 844 {
834 // DetailLog("{0},BSPrim.SetRotationalVel,taint,rotvel={1}", LocalID, _rotationalVelocity); 845 DetailLog("{0},BSPrim.SetRotationalVel,taint,rotvel={1}", LocalID, _rotationalVelocity);
835 BulletSimAPI.SetAngularVelocity2(BSBody.ptr, _rotationalVelocity); 846 BulletSimAPI.SetAngularVelocity2(BSBody.ptr, _rotationalVelocity);
836 }); 847 });
837 } 848 }
@@ -972,14 +983,31 @@ public sealed class BSPrim : BSPhysObject
972 } 983 }
973 m_accumulatedAngularForces.Clear(); 984 m_accumulatedAngularForces.Clear();
974 } 985 }
975 // DetailLog("{0},BSPrim.AddAngularForce,taint,aForce={1}", LocalID, fSum); 986 DetailLog("{0},BSPrim.AddAngularForce,taint,aForce={1}", LocalID, fSum);
976 if (fSum != OMV.Vector3.Zero) 987 if (fSum != OMV.Vector3.Zero)
988 {
977 BulletSimAPI.ApplyTorque2(BSBody.ptr, fSum); 989 BulletSimAPI.ApplyTorque2(BSBody.ptr, fSum);
990 _torque = fSum;
991 }
978 }; 992 };
979 if (inTaintTime) 993 if (inTaintTime)
980 addAngularForceOperation(); 994 addAngularForceOperation();
981 else 995 else
982 PhysicsScene.TaintedObject("BSPrim.AddForce", addAngularForceOperation); 996 PhysicsScene.TaintedObject("BSPrim.AddAngularForce", addAngularForceOperation);
997 }
998 // A torque impulse.
999 public void ApplyTorqueImpulse(OMV.Vector3 impulse, bool inTaintTime)
1000 {
1001 OMV.Vector3 applyImpulse = impulse;
1002 BSScene.TaintCallback applyTorqueImpulseOperation = delegate()
1003 {
1004 DetailLog("{0},BSPrim.ApplyTorqueImpulse,taint,tImpulse={1}", LocalID, applyImpulse);
1005 BulletSimAPI.ApplyTorqueImpulse2(BSBody.ptr, applyImpulse);
1006 };
1007 if (inTaintTime)
1008 applyTorqueImpulseOperation();
1009 else
1010 PhysicsScene.TaintedObject("BSPrim.ApplyTorqueImpulse", applyTorqueImpulseOperation);
983 } 1011 }
984 public override void SetMomentum(OMV.Vector3 momentum) { 1012 public override void SetMomentum(OMV.Vector3 momentum) {
985 // DetailLog("{0},BSPrim.SetMomentum,call,mom={1}", LocalID, momentum); 1013 // DetailLog("{0},BSPrim.SetMomentum,call,mom={1}", LocalID, momentum);
@@ -1418,8 +1446,9 @@ public sealed class BSPrim : BSPhysObject
1418 1446
1419 PositionSanityCheck(true); 1447 PositionSanityCheck(true);
1420 1448
1421 DetailLog("{0},BSPrim.UpdateProperties,call,pos={1},orient={2},vel={3},accel={4},rotVel={5}", 1449 OMV.Vector3 direction = OMV.Vector3.UnitX * _orientation;
1422 LocalID, _position, _orientation, _velocity, _acceleration, _rotationalVelocity); 1450 DetailLog("{0},BSPrim.UpdateProperties,call,pos={1},orient={2},dir={3},vel={4},rotVel={5}",
1451 LocalID, _position, _orientation, direction, _velocity, _rotationalVelocity);
1423 1452
1424 // BulletSimAPI.DumpRigidBody2(PhysicsScene.World.ptr, BSBody.ptr); // DEBUG DEBUG DEBUG 1453 // BulletSimAPI.DumpRigidBody2(PhysicsScene.World.ptr, BSBody.ptr); // DEBUG DEBUG DEBUG
1425 1454