Fix border fence for physicals. Fix llRotLookAt() for Vehicles.
parent
711db25dfa
commit
95a915efd8
|
@ -3001,10 +3001,7 @@ Console.WriteLine(" JointCreateFixed");
|
|||
// This is a temp patch until proper region crossing is developed.
|
||||
|
||||
int failureLimit = _parent_scene.geomCrossingFailuresBeforeOutofbounds;
|
||||
int fence = _parent_scene.geomRegionFence;
|
||||
|
||||
float border_limit = 0.05f; // original limit
|
||||
if (fence == 1) border_limit = 0.5f; // bounce point
|
||||
float fence = _parent_scene.geomRegionFence;
|
||||
|
||||
frcount++; // used to limit debug comment output
|
||||
if (frcount > 50)
|
||||
|
@ -3049,35 +3046,34 @@ Console.WriteLine(" JointCreateFixed");
|
|||
|
||||
// Check if outside region
|
||||
// In Scene.cs/CrossPrimGroupIntoNewRegion the object is checked for 0.1M from border!
|
||||
if (l_position.X > ((float)_parent_scene.WorldExtents.X - border_limit))
|
||||
if (l_position.X > ((float)_parent_scene.WorldExtents.X - fence))
|
||||
{
|
||||
l_position.X = ((float)_parent_scene.WorldExtents.X - border_limit);
|
||||
l_position.X = ((float)_parent_scene.WorldExtents.X - fence);
|
||||
outside = 1;
|
||||
}
|
||||
|
||||
if (l_position.X < border_limit)
|
||||
if (l_position.X < fence)
|
||||
{
|
||||
l_position.X = border_limit;
|
||||
l_position.X = fence;
|
||||
outside = 2;
|
||||
}
|
||||
if (l_position.Y > ((float)_parent_scene.WorldExtents.Y - border_limit))
|
||||
if (l_position.Y > ((float)_parent_scene.WorldExtents.Y - fence))
|
||||
{
|
||||
l_position.Y = ((float)_parent_scene.WorldExtents.Y - border_limit);
|
||||
l_position.Y = ((float)_parent_scene.WorldExtents.Y - fence);
|
||||
outside = 3;
|
||||
}
|
||||
|
||||
if (l_position.Y < border_limit)
|
||||
if (l_position.Y < fence)
|
||||
{
|
||||
l_position.Y = border_limit;
|
||||
l_position.Y = fence;
|
||||
outside = 4;
|
||||
}
|
||||
|
||||
if (outside > 0)
|
||||
{
|
||||
//Console.WriteLine(" fence = {0}",fence);
|
||||
|
||||
//Console.WriteLine("Border {0}", l_position);
|
||||
if (fence == 1) // bounce object off boundary
|
||||
//Console.WriteLine("Border {0} fence={1}", l_position, fence);
|
||||
if (fence > 0.0f) // bounce object off boundary
|
||||
{
|
||||
if (revcount == 0)
|
||||
{
|
||||
|
@ -3647,75 +3643,6 @@ Console.WriteLine("AxisZ {0} set to {1}", i, m_lockZ);
|
|||
}
|
||||
} // end PID MoveToTarget
|
||||
|
||||
/* Original OS implementation: Does not work correctly as another phys object resting on THIS object purturbs its position.
|
||||
This is incorrect behavior. llMoveToTarget must move the Body no matter what phys object is resting on it.
|
||||
|
||||
//if (!d.BodyIsEnabled(Body))
|
||||
//d.BodySetForce(Body, 0f, 0f, 0f);
|
||||
|
||||
// no lock; for now it's only called from within Simulate()
|
||||
|
||||
// If the PID Controller isn't active then we set our force
|
||||
// calculating base velocity to the current position
|
||||
|
||||
if ((m_PIDTau < 1) && (m_PIDTau != 0))
|
||||
{
|
||||
//PID_G = PID_G / m_PIDTau;
|
||||
m_PIDTau = 1;
|
||||
}
|
||||
|
||||
if ((PID_G - m_PIDTau) <= 0)
|
||||
{
|
||||
PID_G = m_PIDTau + 1;
|
||||
}
|
||||
//PidStatus = true;
|
||||
|
||||
// PhysicsVector vec = new PhysicsVector();
|
||||
// d.Vector3 vel = d.BodyGetLinearVel(Body);
|
||||
|
||||
d.Vector3 pos = d.BodyGetPosition(Body);
|
||||
_target_velocity =
|
||||
new Vector3(
|
||||
(m_PIDTarget.X - pos.X) * ((PID_G - m_PIDTau) * timestep),
|
||||
(m_PIDTarget.Y - pos.Y) * ((PID_G - m_PIDTau) * timestep),
|
||||
(m_PIDTarget.Z - pos.Z) * ((PID_G - m_PIDTau) * timestep)
|
||||
);
|
||||
|
||||
if(frcount == 0) Console.WriteLine("PID {0} b={1} fz={2} vel={3}", m_primName, m_buoyancy, fz, _target_velocity);
|
||||
// if velocity is zero, use position control; otherwise, velocity control
|
||||
|
||||
if (_target_velocity.ApproxEquals(Vector3.Zero,0.1f))
|
||||
{
|
||||
// keep track of where we stopped. No more slippin' & slidin'
|
||||
|
||||
// We only want to deactivate the PID Controller if we think we want to have our surrogate
|
||||
// react to the physics scene by moving it's position.
|
||||
// Avatar to Avatar collisions
|
||||
// Prim to avatar collisions
|
||||
|
||||
//fx = (_target_velocity.X - vel.X) * (PID_D) + (_zeroPosition.X - pos.X) * (PID_P * 2);
|
||||
//fy = (_target_velocity.Y - vel.Y) * (PID_D) + (_zeroPosition.Y - pos.Y) * (PID_P * 2);
|
||||
//fz = fz + (_target_velocity.Z - vel.Z) * (PID_D) + (_zeroPosition.Z - pos.Z) * PID_P;
|
||||
d.BodySetPosition(Body, m_PIDTarget.X, m_PIDTarget.Y, m_PIDTarget.Z);
|
||||
d.BodySetLinearVel(Body, 0, 0, 0);
|
||||
d.BodyAddForce(Body, 0, 0, fz);
|
||||
// return;
|
||||
}
|
||||
else
|
||||
{
|
||||
_zeroFlag = false;
|
||||
|
||||
// We're flying and colliding with something
|
||||
fx = ((_target_velocity.X) - vel.X) * (PID_D);
|
||||
fy = ((_target_velocity.Y) - vel.Y) * (PID_D);
|
||||
|
||||
// vec.Z = (_target_velocity.Z - vel.Z) * PID_D + (_zeroPosition.Z - pos.Z) * PID_P;
|
||||
|
||||
fz = fz + ((_target_velocity.Z - vel.Z) * (PID_D) * m_mass);
|
||||
}
|
||||
} // end if (m_usePID)
|
||||
End of old PID system */
|
||||
|
||||
|
||||
/// Dynamics Hover ===================================================================================
|
||||
// Hover PID Controller can only run if the PIDcontroller is not in use.
|
||||
|
@ -3802,7 +3729,51 @@ if(frcount == 0) Console.WriteLine("PID {0} b={1} fz={2} vel={3}", m_primName
|
|||
}
|
||||
} // end m_useHoverPID && !m_usePID
|
||||
|
||||
/// Dynamics RotLookAt =================================================================================
|
||||
|
||||
/// Dynamics Apply Forces ===================================================================================
|
||||
fx *= m_mass;
|
||||
fy *= m_mass;
|
||||
//fz *= m_mass;
|
||||
|
||||
fx += m_force.X;
|
||||
fy += m_force.Y;
|
||||
fz += m_force.Z;
|
||||
|
||||
//m_log.Info("[OBJPID]: X:" + fx.ToString() + " Y:" + fy.ToString() + " Z:" + fz.ToString());
|
||||
if (fx != 0 || fy != 0 || fz != 0)
|
||||
{
|
||||
//m_taintdisable = true;
|
||||
//base.RaiseOutOfBounds(Position);
|
||||
//d.BodySetLinearVel(Body, fx, fy, 0f);
|
||||
if (!d.BodyIsEnabled(Body))
|
||||
{
|
||||
// A physical body at rest on a surface will auto-disable after a while,
|
||||
// this appears to re-enable it incase the surface it is upon vanishes,
|
||||
// and the body should fall again.
|
||||
d.BodySetLinearVel(Body, 0f, 0f, 0f);
|
||||
d.BodySetForce(Body, 0, 0, 0);
|
||||
enableBodySoft();
|
||||
}
|
||||
|
||||
// 35x10 = 350n times the mass per second applied maximum.
|
||||
float nmax = 35f * m_mass;
|
||||
float nmin = -35f * m_mass;
|
||||
|
||||
|
||||
if (fx > nmax)
|
||||
fx = nmax;
|
||||
if (fx < nmin)
|
||||
fx = nmin;
|
||||
if (fy > nmax)
|
||||
fy = nmax;
|
||||
if (fy < nmin)
|
||||
fy = nmin;
|
||||
d.BodyAddForce(Body, fx, fy, fz);
|
||||
//Console.WriteLine("AddForce " + fx + "," + fy + "," + fz);
|
||||
} // end apply forces
|
||||
} // end Vehicle/Dynamics
|
||||
|
||||
/// RotLookAt =================================================================================
|
||||
if (m_useAPID)
|
||||
{
|
||||
// RotLookAt, apparently overrides all other rotation sources. Inputs:
|
||||
|
@ -3848,70 +3819,7 @@ if(frcount == 0) Console.WriteLine("PID {0} b={1} fz={2} vel={3}", m_primName
|
|||
//if(frcount == 0) Console.WriteLine("mass= " + m_mass + " servo= " + RLAservo + " angle= " + diff_angle);
|
||||
} // end m_useAPID
|
||||
|
||||
/// Dynamics Apply Forces ===================================================================================
|
||||
fx *= m_mass;
|
||||
fy *= m_mass;
|
||||
//fz *= m_mass;
|
||||
|
||||
fx += m_force.X;
|
||||
fy += m_force.Y;
|
||||
fz += m_force.Z;
|
||||
|
||||
//m_log.Info("[OBJPID]: X:" + fx.ToString() + " Y:" + fy.ToString() + " Z:" + fz.ToString());
|
||||
if (fx != 0 || fy != 0 || fz != 0)
|
||||
{
|
||||
//m_taintdisable = true;
|
||||
//base.RaiseOutOfBounds(Position);
|
||||
//d.BodySetLinearVel(Body, fx, fy, 0f);
|
||||
if (!d.BodyIsEnabled(Body))
|
||||
{
|
||||
// A physical body at rest on a surface will auto-disable after a while,
|
||||
// this appears to re-enable it incase the surface it is upon vanishes,
|
||||
// and the body should fall again.
|
||||
d.BodySetLinearVel(Body, 0f, 0f, 0f);
|
||||
d.BodySetForce(Body, 0, 0, 0);
|
||||
enableBodySoft();
|
||||
}
|
||||
|
||||
// 35x10 = 350n times the mass per second applied maximum.
|
||||
float nmax = 35f * m_mass;
|
||||
float nmin = -35f * m_mass;
|
||||
|
||||
|
||||
if (fx > nmax)
|
||||
fx = nmax;
|
||||
if (fx < nmin)
|
||||
fx = nmin;
|
||||
if (fy > nmax)
|
||||
fy = nmax;
|
||||
if (fy < nmin)
|
||||
fy = nmin;
|
||||
d.BodyAddForce(Body, fx, fy, fz);
|
||||
//Console.WriteLine("AddForce " + fx + "," + fy + "," + fz);
|
||||
} // end apply forces
|
||||
} // end Dynamics
|
||||
|
||||
/* obsolete?
|
||||
else
|
||||
{ // is not physical, or is not a body or is selected
|
||||
// from old UpdatePositionAndVelocity, ... Not a body.. so Make sure the client isn't interpolating
|
||||
_velocity.X = 0;
|
||||
_velocity.Y = 0;
|
||||
_velocity.Z = 0;
|
||||
|
||||
_acceleration.X = 0;
|
||||
_acceleration.Y = 0;
|
||||
_acceleration.Z = 0;
|
||||
|
||||
m_rotationalVelocity.X = 0;
|
||||
m_rotationalVelocity.Y = 0;
|
||||
m_rotationalVelocity.Z = 0;
|
||||
_zeroFlag = true;
|
||||
return;
|
||||
}
|
||||
*/
|
||||
} // end root prims
|
||||
|
||||
} // end Move()
|
||||
} // end class
|
||||
}
|
||||
|
|
|
@ -224,7 +224,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
public float bodyPIDG = 25;
|
||||
|
||||
public int geomCrossingFailuresBeforeOutofbounds = 5;
|
||||
public int geomRegionFence = 0;
|
||||
public float geomRegionFence = 0.0f;
|
||||
|
||||
public float bodyMotorJointMaxforceTensor = 2;
|
||||
|
||||
|
@ -448,7 +448,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
geomContactPointsStartthrottle = physicsconfig.GetInt("geom_contactpoints_start_throttling", 3);
|
||||
geomUpdatesPerThrottledUpdate = physicsconfig.GetInt("geom_updates_before_throttled_update", 15);
|
||||
geomCrossingFailuresBeforeOutofbounds = physicsconfig.GetInt("geom_crossing_failures_before_outofbounds", 5);
|
||||
geomRegionFence = physicsconfig.GetInt("region_border_fence", 0);
|
||||
geomRegionFence = physicsconfig.GetFloat("region_border_fence", 0.0f);
|
||||
|
||||
geomDefaultDensity = physicsconfig.GetFloat("geometry_default_density", 10.000006836f);
|
||||
bodyFramesAutoDisable = physicsconfig.GetInt("body_frames_auto_disable", 20);
|
||||
|
|
Loading…
Reference in New Issue