diff options
author | Robert Adams | 2012-10-31 09:26:58 -0700 |
---|---|---|
committer | Robert Adams | 2012-11-03 21:14:58 -0700 |
commit | 28e2cd3fa21835b124552dec024745f5784f6b3a (patch) | |
tree | 03b422548908cb2c4ec734c27ac2ad9824015cca | |
parent | BulletSim: remove center-of-mass setting for linksets because it causes the c... (diff) | |
download | opensim-SC_OLD-28e2cd3fa21835b124552dec024745f5784f6b3a.zip opensim-SC_OLD-28e2cd3fa21835b124552dec024745f5784f6b3a.tar.gz opensim-SC_OLD-28e2cd3fa21835b124552dec024745f5784f6b3a.tar.bz2 opensim-SC_OLD-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.cs | 136 | ||||
-rwxr-xr-x | OpenSim/Region/Physics/BulletSPlugin/BSLinksetConstraints.cs | 2 | ||||
-rw-r--r-- | OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs | 45 |
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 | ||