a few changes to ubOde avatar collisions

0.9.0-post-fixes
UbitUmarov 2017-07-01 01:43:58 +01:00
parent 965d004fbe
commit edc7575f9e
5 changed files with 39 additions and 39 deletions

View File

@ -103,7 +103,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde
public float walkDivisor = 1.3f;
public float runDivisor = 0.8f;
private bool flying = false;
private bool m_flying = false;
private bool m_iscolliding = false;
private bool m_iscollidingGround = false;
private bool m_iscollidingObj = false;
@ -298,10 +298,10 @@ namespace OpenSim.Region.PhysicsModule.ubOde
public override bool Flying
{
get { return flying; }
get { return m_flying; }
set
{
flying = value;
m_flying = value;
// m_log.DebugFormat("[PHYSICS]: Set OdeCharacter Flying to {0}", flying);
}
}
@ -900,10 +900,9 @@ namespace OpenSim.Region.PhysicsModule.ubOde
}
public bool Collide(IntPtr me, IntPtr other, bool reverse, ref d.ContactGeom contact,
ref d.ContactGeom altContact , ref bool useAltcontact, ref bool feetcollision)
ref bool feetcollision)
{
feetcollision = false;
useAltcontact = false;
if (me == capsule)
{
@ -943,12 +942,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde
}
return true;
}
/*
d.AABB aabb;
d.GeomGetAABB(other,out aabb);
float othertop = aabb.MaxZ - _position.Z;
*/
// if (offset.Z > 0 || othertop > -feetOff || contact.normal.Z > 0.35f)
if (offset.Z > 0 || contact.normal.Z > 0.35f)
{
if (offset.Z <= 0)
@ -965,27 +959,40 @@ namespace OpenSim.Region.PhysicsModule.ubOde
return true;
}
altContact = contact;
useAltcontact = true;
if(m_flying)
return true;
offset.Z -= 0.2f;
offset.Normalize();
if (contact.depth > 0.1f)
contact.depth = 0.1f;
float tdp = contact.depth;
float t = contact.normal.Z * contact.normal.Z;
t = Math.Abs(t);
if(t > 1e-6)
{
tdp /= t;
tdp *= offset.Z * offset.Z;
}
else
tdp *= 10;
if (tdp > 0.25f)
tdp = 0.25f;
contact.depth = tdp;
if (reverse)
{
altContact.normal.X = offset.X;
altContact.normal.Y = offset.Y;
altContact.normal.Z = offset.Z;
contact.normal.X = offset.X;
contact.normal.Y = offset.Y;
contact.normal.Z = offset.Z;
}
else
{
altContact.normal.X = -offset.X;
altContact.normal.Y = -offset.Y;
altContact.normal.Z = -offset.Z;
contact.normal.X = -offset.X;
contact.normal.Y = -offset.Y;
contact.normal.Z = -offset.Z;
}
feetcollision = true;
@ -1098,7 +1105,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde
float ftmp;
if (flying)
if (m_flying)
{
ftmp = timeStep;
posch.X += vel.X * ftmp;
@ -1122,7 +1129,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde
vec.Z = depth * PID_P * 50;
if (!flying)
if (!m_flying)
{
vec.Z += -vel.Z * PID_D;
if(n.Z < 0.4f)
@ -1259,7 +1266,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde
// movement relative to surface if moving on it
// dont disturbe vertical movement, ie jumps
if (m_iscolliding && !flying && ctz.Z == 0 && m_collideNormal.Z > 0.2f && m_collideNormal.Z < 0.94f)
if (m_iscolliding && !m_flying && ctz.Z == 0 && m_collideNormal.Z > 0.2f && m_collideNormal.Z < 0.94f)
{
float p = ctz.X * m_collideNormal.X + ctz.Y * m_collideNormal.Y;
ctz.X *= (float)Math.Sqrt(1 - m_collideNormal.X * m_collideNormal.X);
@ -1276,7 +1283,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde
{
// if velocity is zero, use position control; otherwise, velocity control
if (tviszero && m_iscolliding && !flying)
if (tviszero && m_iscolliding && !m_flying)
{
// keep track of where we stopped. No more slippin' & slidin'
if (!_zeroFlag)
@ -1313,7 +1320,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde
if (m_iscolliding)
{
if (!flying)
if (!m_flying)
{
// we are on a surface
if (ctz.Z > 0f)
@ -1361,7 +1368,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde
}
else // ie not colliding
{
if (flying || hoverPIDActive) //(!m_iscolliding && flying)
if (m_flying || hoverPIDActive) //(!m_iscolliding && flying)
{
// we're in mid air suspended
vec.X += (ctz.X - vel.X) * (PID_D);
@ -1397,13 +1404,13 @@ namespace OpenSim.Region.PhysicsModule.ubOde
breakfactor = m_mass;
vec.X -= breakfactor * vel.X;
vec.Y -= breakfactor * vel.Y;
if (flying)
if (m_flying)
vec.Z -= 0.5f * breakfactor * vel.Z;
else
vec.Z -= .16f* m_mass * vel.Z;
}
if (flying || hoverPIDActive)
if (m_flying || hoverPIDActive)
{
vec.Z -= m_parent_scene.gravityz * m_mass;

View File

@ -951,8 +951,6 @@ namespace OpenSim.Region.PhysicsModule.ubOde
SharedTmpcontact.surface.mu = mu;
SharedTmpcontact.surface.bounce = bounce;
d.ContactGeom altContact = new d.ContactGeom();
bool useAltcontact = false;
bool noskip = true;
if(dop1ava || dop2ava)
@ -961,11 +959,10 @@ namespace OpenSim.Region.PhysicsModule.ubOde
while (true)
{
noskip = true;
useAltcontact = false;
if (dop1ava)
{
if ((((OdeCharacter)p1).Collide(g1, g2, false, ref curContact, ref altContact , ref useAltcontact, ref FeetCollision)))
if ((((OdeCharacter)p1).Collide(g1, g2, false, ref curContact, ref FeetCollision)))
{
if (p2.PhysicsActorType == (int)ActorTypes.Agent)
{
@ -980,7 +977,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde
}
else if (dop2ava)
{
if ((((OdeCharacter)p2).Collide(g2, g1, true, ref curContact, ref altContact , ref useAltcontact, ref FeetCollision)))
if ((((OdeCharacter)p2).Collide(g2, g1, true, ref curContact, ref FeetCollision)))
{
if (p1.PhysicsActorType == (int)ActorTypes.Agent)
{
@ -996,10 +993,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde
if (noskip)
{
if(useAltcontact)
Joint = CreateContacJoint(ref altContact,smoothMesh);
else
Joint = CreateContacJoint(ref curContact,smoothMesh);
Joint = CreateContacJoint(ref curContact,smoothMesh);
if (Joint == IntPtr.Zero)
break;

View File

@ -61,7 +61,6 @@
; osslParcelOG = "PARCEL_GROUP_MEMBER,PARCEL_OWNER,"
; NPC macros
; There are a block of macros to creating and controlling NPCs.
; These can be mis-used so limit use to those you can trust.
osslNPC = ${XEngine|osslParcelOG}ESTATE_MANAGER,ESTATE_OWNER

Binary file not shown.

Binary file not shown.