aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs66
1 files changed, 19 insertions, 47 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs b/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs
index cbad3bf..4d067cf 100644
--- a/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs
@@ -125,7 +125,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
125 //Attractor properties 125 //Attractor properties
126 private BSVMotor m_verticalAttractionMotor = new BSVMotor("VerticalAttraction"); 126 private BSVMotor m_verticalAttractionMotor = new BSVMotor("VerticalAttraction");
127 private float m_verticalAttractionEfficiency = 1.0f; // damped 127 private float m_verticalAttractionEfficiency = 1.0f; // damped
128 private float m_verticalAttractionTimescale = 500f; // Timescale > 300 means no vert attractor. 128 private float m_verticalAttractionTimescale = 600f; // Timescale > 500 means no vert attractor.
129 129
130 public BSDynamics(BSScene myScene, BSPrim myPrim) 130 public BSDynamics(BSScene myScene, BSPrim myPrim)
131 { 131 {
@@ -573,6 +573,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
573 // Vector3 localInertia = new Vector3(1f, 1f, 1f); 573 // Vector3 localInertia = new Vector3(1f, 1f, 1f);
574 Vector3 localInertia = new Vector3(m_vehicleMass, m_vehicleMass, m_vehicleMass); 574 Vector3 localInertia = new Vector3(m_vehicleMass, m_vehicleMass, m_vehicleMass);
575 BulletSimAPI.SetMassProps2(Prim.PhysBody.ptr, m_vehicleMass, localInertia); 575 BulletSimAPI.SetMassProps2(Prim.PhysBody.ptr, m_vehicleMass, localInertia);
576 BulletSimAPI.UpdateInertiaTensor2(Prim.PhysBody.ptr);
576 577
577 VDetailLog("{0},BSDynamics.Refresh,frict={1},inert={2},aDamp={3}", 578 VDetailLog("{0},BSDynamics.Refresh,frict={1},inert={2},aDamp={3}",
578 Prim.LocalID, friction, localInertia, angularDamping); 579 Prim.LocalID, friction, localInertia, angularDamping);
@@ -958,34 +959,6 @@ namespace OpenSim.Region.Physics.BulletSPlugin
958 // Apply the effect of the angular motor. 959 // Apply the effect of the angular motor.
959 private void MoveAngular(float pTimestep) 960 private void MoveAngular(float pTimestep)
960 { 961 {
961 // m_angularMotorDirection // angular velocity requested by LSL motor
962 // m_angularMotorVelocity // current angular motor velocity (ramps up and down)
963 // m_angularMotorTimescale // motor angular velocity ramp up time
964 // m_angularMotorDecayTimescale // motor angular velocity decay rate
965 // m_angularFrictionTimescale // body angular velocity decay rate
966 // m_lastAngularVelocity // what was last applied to body
967
968 /*
969 if (m_angularMotorDirection.LengthSquared() > 0.0001)
970 {
971 Vector3 origVel = m_angularMotorVelocity;
972 Vector3 origDir = m_angularMotorDirection;
973
974 // new velocity += error / ( time to get there / step interval)
975 // requested direction - current vehicle direction
976 m_angularMotorVelocity += (m_angularMotorDirection - m_angularMotorVelocity) / (m_angularMotorTimescale / pTimestep);
977 // decay requested direction
978 m_angularMotorDirection *= (1.0f - (pTimestep * 1.0f/m_angularMotorDecayTimescale));
979
980 VDetailLog("{0}, MoveAngular,angularMotorApply,angTScale={1},timeStep={2},origvel={3},origDir={4},vel={5}",
981 Prim.LocalID, m_angularMotorTimescale, pTimestep, origVel, origDir, m_angularMotorVelocity);
982 }
983 else
984 {
985 m_angularMotorVelocity = Vector3.Zero;
986 }
987 */
988
989 Vector3 angularMotorContribution = m_angularMotor.Step(pTimestep); 962 Vector3 angularMotorContribution = m_angularMotor.Step(pTimestep);
990 963
991 // ================================================================== 964 // ==================================================================
@@ -1050,9 +1023,8 @@ namespace OpenSim.Region.Physics.BulletSPlugin
1050 // ================================================================== 1023 // ==================================================================
1051 if (m_lastAngularVelocity.ApproxEquals(Vector3.Zero, 0.01f)) 1024 if (m_lastAngularVelocity.ApproxEquals(Vector3.Zero, 0.01f))
1052 { 1025 {
1053 m_lastAngularVelocity = Vector3.Zero; // Reduce small value to zero.
1054 // TODO: zeroing is good but it also sets values in unmanaged code. Remove the stores when idle. 1026 // TODO: zeroing is good but it also sets values in unmanaged code. Remove the stores when idle.
1055 VDetailLog("{0}, MoveAngular,done,zero,lastAngular={1}", Prim.LocalID, m_lastAngularVelocity); 1027 VDetailLog("{0}, MoveAngular,done,zero", Prim.LocalID);
1056 VehicleRotationalVelocity = Vector3.Zero; 1028 VehicleRotationalVelocity = Vector3.Zero;
1057 Prim.ZeroAngularMotion(true); 1029 Prim.ZeroAngularMotion(true);
1058 } 1030 }
@@ -1063,15 +1035,14 @@ namespace OpenSim.Region.Physics.BulletSPlugin
1063 // Since we are stuffing the angular velocity directly into the object, the computed 1035 // Since we are stuffing the angular velocity directly into the object, the computed
1064 // velocity needs to be scaled by the timestep. 1036 // velocity needs to be scaled by the timestep.
1065 // Also remove any motion that is on the object so added motion is only from vehicle. 1037 // Also remove any motion that is on the object so added motion is only from vehicle.
1066 Vector3 applyAngularForce = ((m_lastAngularVelocity * pTimestep) - VehicleRotationalVelocity); 1038 Vector3 setAngularVelocity = ((m_lastAngularVelocity * pTimestep) - VehicleRotationalVelocity);
1067 // Unscale the force by the angular factor so it overwhelmes the Bullet additions. 1039 VehicleRotationalVelocity = setAngularVelocity;
1068 VehicleRotationalVelocity = applyAngularForce;
1069 1040
1070 VDetailLog("{0}, MoveAngular,done,nonZero,angMotor={1},vertAttr={2},bank={3},deflect={4},newAngForce={5},lastAngular={6}", 1041 VDetailLog("{0}, MoveAngular,done,nonZero,angMotorContrib={1},vertAttrContrib={2},bankContrib={3},deflectContrib={4},totalContrib={5},setAngVelocity={6}",
1071 Prim.LocalID, 1042 Prim.LocalID,
1072 angularMotorContribution, verticalAttractionContribution, 1043 angularMotorContribution, verticalAttractionContribution,
1073 bankingContribution, deflectionContribution, 1044 bankingContribution, deflectionContribution,
1074 applyAngularForce, m_lastAngularVelocity 1045 m_lastAngularVelocity, setAngularVelocity
1075 ); 1046 );
1076 } 1047 }
1077 } 1048 }
@@ -1083,12 +1054,13 @@ namespace OpenSim.Region.Physics.BulletSPlugin
1083 // If vertical attaction timescale is reasonable and we applied an angular force last time... 1054 // If vertical attaction timescale is reasonable and we applied an angular force last time...
1084 if (m_verticalAttractionTimescale < 500) 1055 if (m_verticalAttractionTimescale < 500)
1085 { 1056 {
1057 /*
1086 Vector3 verticalError = Vector3.UnitZ * VehicleOrientation; 1058 Vector3 verticalError = Vector3.UnitZ * VehicleOrientation;
1087 verticalError.Normalize(); 1059 verticalError.Normalize();
1088 m_verticalAttractionMotor.SetCurrent(verticalError); 1060 m_verticalAttractionMotor.SetCurrent(verticalError);
1089 m_verticalAttractionMotor.SetTarget(Vector3.UnitZ); 1061 m_verticalAttractionMotor.SetTarget(Vector3.UnitZ);
1090 ret = m_verticalAttractionMotor.Step(pTimestep); 1062 ret = m_verticalAttractionMotor.Step(pTimestep);
1091 /* 1063 */
1092 // Take a vector pointing up and convert it from world to vehicle relative coords. 1064 // Take a vector pointing up and convert it from world to vehicle relative coords.
1093 Vector3 verticalError = Vector3.UnitZ * VehicleOrientation; 1065 Vector3 verticalError = Vector3.UnitZ * VehicleOrientation;
1094 verticalError.Normalize(); 1066 verticalError.Normalize();
@@ -1108,25 +1080,25 @@ namespace OpenSim.Region.Physics.BulletSPlugin
1108 } 1080 }
1109 1081
1110 // Y error means needed rotation around X axis and visa versa. 1082 // Y error means needed rotation around X axis and visa versa.
1111 verticalAttractionContribution.X = verticalError.Y; 1083 ret.X = verticalError.Y;
1112 verticalAttractionContribution.Y = - verticalError.X; 1084 ret.Y = - verticalError.X;
1113 verticalAttractionContribution.Z = 0f; 1085 ret.Z = 0f;
1114 1086
1115 // scale by the time scale and timestep 1087 // scale by the time scale and timestep
1116 Vector3 unscaledContrib = verticalAttractionContribution; 1088 Vector3 unscaledContrib = ret;
1117 verticalAttractionContribution /= m_verticalAttractionTimescale; 1089 ret /= m_verticalAttractionTimescale;
1118 verticalAttractionContribution *= pTimestep; 1090 ret *= pTimestep;
1119 1091
1120 // apply efficiency 1092 // apply efficiency
1121 Vector3 preEfficiencyContrib = verticalAttractionContribution; 1093 Vector3 preEfficiencyContrib = ret;
1094 // Effenciency squared seems to give a more realistic effect
1122 float efficencySquared = m_verticalAttractionEfficiency * m_verticalAttractionEfficiency; 1095 float efficencySquared = m_verticalAttractionEfficiency * m_verticalAttractionEfficiency;
1123 verticalAttractionContribution *= (m_verticalAttractionEfficiency * m_verticalAttractionEfficiency); 1096 ret *= efficencySquared;
1124 1097
1125 VDetailLog("{0}, MoveAngular,verticalAttraction,,verticalError={1},unscaled={2},preEff={3},eff={4},effSq={5},vertAttr={6}", 1098 VDetailLog("{0}, MoveAngular,verticalAttraction,,verticalError={1},unscaled={2},preEff={3},eff={4},effSq={5},vertAttr={6}",
1126 Prim.LocalID, verticalError, unscaledContrib, preEfficiencyContrib, 1099 Prim.LocalID, verticalError, unscaledContrib, preEfficiencyContrib,
1127 m_verticalAttractionEfficiency, efficencySquared, 1100 m_verticalAttractionEfficiency, efficencySquared,
1128 verticalAttractionContribution); 1101 ret);
1129 */
1130 1102
1131 } 1103 }
1132 return ret; 1104 return ret;