Angular motor adjustments
parent
6a70349512
commit
9568718add
|
@ -224,6 +224,8 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
// These are vector properties but the engine lets you use a single float value to
|
// These are vector properties but the engine lets you use a single float value to
|
||||||
// set all of the components to the same value
|
// set all of the components to the same value
|
||||||
case Vehicle.ANGULAR_FRICTION_TIMESCALE:
|
case Vehicle.ANGULAR_FRICTION_TIMESCALE:
|
||||||
|
if (pValue > 30f) pValue = 30f;
|
||||||
|
if (pValue < 0.1f) pValue = 0.1f;
|
||||||
m_angularFrictionTimescale = new Vector3(pValue, pValue, pValue);
|
m_angularFrictionTimescale = new Vector3(pValue, pValue, pValue);
|
||||||
break;
|
break;
|
||||||
case Vehicle.ANGULAR_MOTOR_DIRECTION:
|
case Vehicle.ANGULAR_MOTOR_DIRECTION:
|
||||||
|
@ -250,6 +252,12 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
switch (pParam)
|
switch (pParam)
|
||||||
{
|
{
|
||||||
case Vehicle.ANGULAR_FRICTION_TIMESCALE:
|
case Vehicle.ANGULAR_FRICTION_TIMESCALE:
|
||||||
|
if (pValue.X > 30f) pValue.X = 30f;
|
||||||
|
if (pValue.X < 0.1f) pValue.X = 0.1f;
|
||||||
|
if (pValue.Y > 30f) pValue.Y = 30f;
|
||||||
|
if (pValue.Y < 0.1f) pValue.Y = 0.1f;
|
||||||
|
if (pValue.Z > 30f) pValue.Z = 30f;
|
||||||
|
if (pValue.Z < 0.1f) pValue.Z = 0.1f;
|
||||||
m_angularFrictionTimescale = new Vector3(pValue.X, pValue.Y, pValue.Z);
|
m_angularFrictionTimescale = new Vector3(pValue.X, pValue.Y, pValue.Z);
|
||||||
break;
|
break;
|
||||||
case Vehicle.ANGULAR_MOTOR_DIRECTION:
|
case Vehicle.ANGULAR_MOTOR_DIRECTION:
|
||||||
|
@ -306,7 +314,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
{
|
{
|
||||||
case Vehicle.TYPE_SLED:
|
case Vehicle.TYPE_SLED:
|
||||||
m_linearFrictionTimescale = new Vector3(30, 1, 1000);
|
m_linearFrictionTimescale = new Vector3(30, 1, 1000);
|
||||||
m_angularFrictionTimescale = new Vector3(1000, 1000, 1000);
|
m_angularFrictionTimescale = new Vector3(30, 30, 30);
|
||||||
// m_lLinMotorVel = Vector3.Zero;
|
// m_lLinMotorVel = Vector3.Zero;
|
||||||
m_linearMotorTimescale = 1000;
|
m_linearMotorTimescale = 1000;
|
||||||
m_linearMotorDecayTimescale = 120;
|
m_linearMotorDecayTimescale = 120;
|
||||||
|
@ -333,7 +341,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
break;
|
break;
|
||||||
case Vehicle.TYPE_CAR:
|
case Vehicle.TYPE_CAR:
|
||||||
m_linearFrictionTimescale = new Vector3(100, 2, 1000);
|
m_linearFrictionTimescale = new Vector3(100, 2, 1000);
|
||||||
m_angularFrictionTimescale = new Vector3(1000, 1000, 1000);
|
m_angularFrictionTimescale = new Vector3(30, 30, 30); // was 1000, but sl max frict time is 30.
|
||||||
// m_lLinMotorVel = Vector3.Zero;
|
// m_lLinMotorVel = Vector3.Zero;
|
||||||
m_linearMotorTimescale = 1;
|
m_linearMotorTimescale = 1;
|
||||||
m_linearMotorDecayTimescale = 60;
|
m_linearMotorDecayTimescale = 60;
|
||||||
|
@ -548,6 +556,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
if (m_linearFrictionTimescale.Z < 300.0f)
|
if (m_linearFrictionTimescale.Z < 300.0f)
|
||||||
{
|
{
|
||||||
float fricfactor = m_linearFrictionTimescale.Z / pTimestep;
|
float fricfactor = m_linearFrictionTimescale.Z / pTimestep;
|
||||||
|
//if(frcount == 0) Console.WriteLine("Zfric={0}", fricfactor);
|
||||||
float fricZ = m_lLinObjectVel.Z / fricfactor;
|
float fricZ = m_lLinObjectVel.Z / fricfactor;
|
||||||
m_lLinObjectVel.Z -= fricZ;
|
m_lLinObjectVel.Z -= fricZ;
|
||||||
}
|
}
|
||||||
|
@ -639,7 +648,6 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
*/
|
*/
|
||||||
//if(frcount == 0) Console.WriteLine("MoveAngular ");
|
//if(frcount == 0) Console.WriteLine("MoveAngular ");
|
||||||
|
|
||||||
//####
|
|
||||||
// Get what the body is doing, this includes 'external' influences
|
// Get what the body is doing, this includes 'external' influences
|
||||||
d.Vector3 angularObjectVel = d.BodyGetAngularVel(Body);
|
d.Vector3 angularObjectVel = d.BodyGetAngularVel(Body);
|
||||||
Vector3 angObjectVel = new Vector3(angularObjectVel.X, angularObjectVel.Y, angularObjectVel.Z);
|
Vector3 angObjectVel = new Vector3(angularObjectVel.X, angularObjectVel.Y, angularObjectVel.Z);
|
||||||
|
@ -652,9 +660,18 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
// Decay Angular Motor 2.
|
// Decay Angular Motor 2.
|
||||||
if (m_angularMotorDecayTimescale < 300.0f)
|
if (m_angularMotorDecayTimescale < 300.0f)
|
||||||
{
|
{
|
||||||
float decayfactor = m_angularMotorDecayTimescale/pTimestep; // df = Dec / pts
|
//####
|
||||||
Vector3 decayAmount = (m_angularMotorDVel/decayfactor); // v-da = v-Dvel / df = v-Dvel * pts / Dec
|
if ( Vector3.Mag(m_angularMotorDVel) < 1.0f)
|
||||||
m_angularMotorDVel -= decayAmount; // v-Dvel = v-Dvel - (v-Dvel / df = v-Dvel * pts / Dec)
|
{
|
||||||
|
float decayfactor = (m_angularMotorDecayTimescale)/pTimestep;
|
||||||
|
Vector3 decayAmount = (m_angularMotorDVel/decayfactor);
|
||||||
|
m_angularMotorDVel -= decayAmount;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Vector3 decel = Vector3.Normalize(m_angularMotorDVel) * pTimestep / m_angularMotorDecayTimescale;
|
||||||
|
m_angularMotorDVel -= decel;
|
||||||
|
}
|
||||||
|
|
||||||
if (m_angularMotorDVel.ApproxEquals(Vector3.Zero, 0.01f))
|
if (m_angularMotorDVel.ApproxEquals(Vector3.Zero, 0.01f))
|
||||||
{
|
{
|
||||||
|
@ -743,22 +760,9 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
//if(frcount == 0) Console.WriteLine("V2+= {0}", angObjectVel);
|
//if(frcount == 0) Console.WriteLine("V2+= {0}", angObjectVel);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_angularFrictionTimescale.X < 300.0f)
|
angObjectVel.X -= angObjectVel.X / (m_angularFrictionTimescale.X * 0.7f / pTimestep);
|
||||||
{
|
angObjectVel.Y -= angObjectVel.Y / (m_angularFrictionTimescale.Y * 0.7f / pTimestep);
|
||||||
float fricfactor = m_angularFrictionTimescale.X / pTimestep;
|
angObjectVel.Z -= angObjectVel.Z / (m_angularFrictionTimescale.Z * 0.7f / pTimestep);
|
||||||
angObjectVel.X -= angObjectVel.X / fricfactor;
|
|
||||||
}
|
|
||||||
if (m_angularFrictionTimescale.Y < 300.0f)
|
|
||||||
{
|
|
||||||
float fricfactor = m_angularFrictionTimescale.Y / pTimestep;
|
|
||||||
angObjectVel.Y -= angObjectVel.Y / fricfactor;
|
|
||||||
}
|
|
||||||
if (m_angularFrictionTimescale.Z < 300.0f)
|
|
||||||
{
|
|
||||||
float fricfactor = m_angularFrictionTimescale.Z / pTimestep;
|
|
||||||
angObjectVel.Z -= angObjectVel.Z / fricfactor;
|
|
||||||
Console.WriteLine("z fric");
|
|
||||||
}
|
|
||||||
} // else no signif. motion
|
} // else no signif. motion
|
||||||
|
|
||||||
//if(frcount == 0) Console.WriteLine("Dmotor {0} Obj {1}", m_angularMotorDVel, angObjectVel);
|
//if(frcount == 0) Console.WriteLine("Dmotor {0} Obj {1}", m_angularMotorDVel, angObjectVel);
|
||||||
|
|
Loading…
Reference in New Issue