aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Physics
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Physics')
-rw-r--r--OpenSim/Region/Physics/ChOdePlugin/ODECharacter.cs30
1 files changed, 21 insertions, 9 deletions
diff --git a/OpenSim/Region/Physics/ChOdePlugin/ODECharacter.cs b/OpenSim/Region/Physics/ChOdePlugin/ODECharacter.cs
index 7a5093b..38c38b6 100644
--- a/OpenSim/Region/Physics/ChOdePlugin/ODECharacter.cs
+++ b/OpenSim/Region/Physics/ChOdePlugin/ODECharacter.cs
@@ -142,7 +142,7 @@ namespace OpenSim.Region.Physics.OdePlugin
142 // unique UUID of this character object 142 // unique UUID of this character object
143 public UUID m_uuid; 143 public UUID m_uuid;
144 public bool bad = false; 144 public bool bad = false;
145 145
146 public OdeCharacter(String avName, OdeScene parent_scene, Vector3 pos, CollisionLocker dode, Vector3 size, float pid_d, float pid_p, float capsule_radius, float tensor, float density, float height_fudge_factor, float walk_divisor, float rundivisor) 146 public OdeCharacter(String avName, OdeScene parent_scene, Vector3 pos, CollisionLocker dode, Vector3 size, float pid_d, float pid_p, float capsule_radius, float tensor, float density, float height_fudge_factor, float walk_divisor, float rundivisor)
147 { 147 {
148 m_uuid = UUID.Random(); 148 m_uuid = UUID.Random();
@@ -892,7 +892,7 @@ namespace OpenSim.Region.Physics.OdePlugin
892 892
893 // If the PID Controller isn't active then we set our force 893 // If the PID Controller isn't active then we set our force
894 // calculating base velocity to the current position 894 // calculating base velocity to the current position
895 895
896 if (Body == IntPtr.Zero) 896 if (Body == IntPtr.Zero)
897 return; 897 return;
898 898
@@ -972,8 +972,17 @@ namespace OpenSim.Region.Physics.OdePlugin
972 // Prim to avatar collisions 972 // Prim to avatar collisions
973 973
974 d.Vector3 pos = d.BodyGetPosition(Body); 974 d.Vector3 pos = d.BodyGetPosition(Body);
975 vec.X = (_target_velocity.X - vel.X) * (PID_D) + (_zeroPosition.X - pos.X) * (PID_P * 2); 975 float errX = _zeroPosition.X - pos.X;
976 vec.Y = (_target_velocity.Y - vel.Y)*(PID_D) + (_zeroPosition.Y - pos.Y)* (PID_P * 2); 976 float errY = _zeroPosition.Y - pos.Y;
977 if( (Math.Abs(errX) > 0.1f) || (Math.Abs(errY) > 0.1f) )
978 {
979 vec.X = (_target_velocity.X - vel.X) * (PID_D) + (errX) * (PID_P * 2);
980 vec.Y = (_target_velocity.Y - vel.Y) * (PID_D) + (errY) * (PID_P * 2);
981 }
982 else
983 { // close, jump to lateral destination
984 d.BodySetPosition(Body, _zeroPosition.X, _zeroPosition.Y, pos.Z);
985 }
977 if (flying) 986 if (flying)
978 { 987 {
979 vec.Z = (_target_velocity.Z - vel.Z) * (PID_D) + (_zeroPosition.Z - pos.Z) * PID_P; 988 vec.Z = (_target_velocity.Z - vel.Z) * (PID_D) + (_zeroPosition.Z - pos.Z) * PID_P;
@@ -1056,11 +1065,14 @@ namespace OpenSim.Region.Physics.OdePlugin
1056 } 1065 }
1057 if (vec.IsFinite()) 1066 if (vec.IsFinite())
1058 { 1067 {
1059 doForce(vec); 1068 if (!vec.ApproxEquals(Vector3.Zero, 0.01f))
1060 if (!_zeroFlag) 1069 {
1061 { 1070 doForce(vec);
1062 AlignAvatarTiltWithCurrentDirectionOfMovement(vec); 1071 if (!_zeroFlag)
1063 } 1072 {
1073 AlignAvatarTiltWithCurrentDirectionOfMovement(vec);
1074 }
1075 }
1064 } 1076 }
1065 else 1077 else
1066 { 1078 {