diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
index 499d060db7..31f0efe7de 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
@@ -4744,6 +4744,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP
position = presence.OffsetPosition;
velocity = presence.Velocity;
acceleration = Vector3.Zero;
+
+ // Interestingly, sending this to non-zero will cause the client's avatar to start moving & accelerating
+ // in that direction, even though we don't model this on the server. Implementing this in the future
+ // may improve movement smoothness.
+// acceleration = new Vector3(1, 0, 0);
+
angularVelocity = Vector3.Zero;
rotation = presence.Rotation;
diff --git a/OpenSim/Region/Physics/Manager/PhysicsActor.cs b/OpenSim/Region/Physics/Manager/PhysicsActor.cs
index 1c36e55b95..96dcfb6b0a 100644
--- a/OpenSim/Region/Physics/Manager/PhysicsActor.cs
+++ b/OpenSim/Region/Physics/Manager/PhysicsActor.cs
@@ -202,10 +202,18 @@ namespace OpenSim.Region.Physics.Manager
public virtual void SetMaterial (int material)
{
-
}
+ ///
+ /// Position of this actor.
+ ///
+ ///
+ /// Setting this directly moves the actor to a given position.
+ /// Getting this retrieves the position calculated by physics scene updates, using factors such as velocity and
+ /// collisions.
+ ///
public abstract Vector3 Position { get; set; }
+
public abstract float Mass { get; }
public abstract Vector3 Force { get; set; }
@@ -215,11 +223,24 @@ namespace OpenSim.Region.Physics.Manager
public abstract void VehicleRotationParam(int param, Quaternion rotation);
public abstract void VehicleFlags(int param, bool remove);
- public abstract void SetVolumeDetect(int param); // Allows the detection of collisions with inherently non-physical prims. see llVolumeDetect for more
+ ///
+ /// Allows the detection of collisions with inherently non-physical prims. see llVolumeDetect for more
+ ///
+ public abstract void SetVolumeDetect(int param);
public abstract Vector3 GeometricCenter { get; }
public abstract Vector3 CenterOfMass { get; }
+
+ ///
+ /// Velocity of this actor.
+ ///
+ ///
+ /// Setting this provides a target velocity for physics scene updates.
+ /// Getting this returns the velocity calculated by physics scene updates, using factors such as target velocity,
+ /// time to accelerate and collisions.
+ ///
public abstract Vector3 Velocity { get; set; }
+
public abstract Vector3 Torque { get; set; }
public abstract float CollisionScore { get; set;}
public abstract Vector3 Acceleration { get; }
diff --git a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs
index 92927e44ea..7f3ae6b35f 100644
--- a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs
+++ b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs
@@ -886,7 +886,6 @@ namespace OpenSim.Region.Physics.OdePlugin
d.BodyAddForce(Body, force.X, force.Y, force.Z);
//d.BodySetRotation(Body, ref m_StandUpRotation);
//standupStraight();
-
}
}
@@ -901,7 +900,8 @@ namespace OpenSim.Region.Physics.OdePlugin
///
///
/// If there is something wrong with the character (e.g. its position is non-finite)
- /// then it is added to this list. The ODE structures associated with it are also destroyed.
+ /// then it is added to this list. The ODE structures associated with it are also destroyed.
+ ///
public void Move(float timeStep, List defects)
{
// no lock; for now it's only called from within Simulate()
@@ -966,7 +966,7 @@ namespace OpenSim.Region.Physics.OdePlugin
d.Vector3 pos = d.BodyGetPosition(Body);
vec.X = (_target_velocity.X - vel.X) * (PID_D) + (_zeroPosition.X - pos.X) * (PID_P * 2);
- vec.Y = (_target_velocity.Y - vel.Y)*(PID_D) + (_zeroPosition.Y - pos.Y)* (PID_P * 2);
+ vec.Y = (_target_velocity.Y - vel.Y) * (PID_D) + (_zeroPosition.Y - pos.Y)* (PID_P * 2);
if (flying)
{
vec.Z = (_target_velocity.Z - vel.Z) * (PID_D) + (_zeroPosition.Z - pos.Z) * PID_P;
@@ -995,6 +995,10 @@ namespace OpenSim.Region.Physics.OdePlugin
// we're in mid air suspended
vec.X = ((_target_velocity.X / movementdivisor) - vel.X) * (PID_D / 6);
vec.Y = ((_target_velocity.Y / movementdivisor) - vel.Y) * (PID_D / 6);
+
+// m_log.DebugFormat(
+// "[ODE CHARACTER]: !m_iscolliding && flying, vec {0}, _target_velocity {1}, movementdivisor {2}, vel {3}",
+// vec, _target_velocity, movementdivisor, vel);
}
if (m_iscolliding && !flying && _target_velocity.Z > 0.0f)
@@ -1020,11 +1024,11 @@ namespace OpenSim.Region.Physics.OdePlugin
// d.Vector3 pos = d.BodyGetPosition(Body);
if (_target_velocity.X > 0)
{
- vec.X = ((_target_velocity.X - vel.X)/1.2f)*PID_D;
+ vec.X = ((_target_velocity.X - vel.X) / 1.2f) * PID_D;
}
if (_target_velocity.Y > 0)
{
- vec.Y = ((_target_velocity.Y - vel.Y)/1.2f)*PID_D;
+ vec.Y = ((_target_velocity.Y - vel.Y) / 1.2f) * PID_D;
}
}
@@ -1167,7 +1171,7 @@ namespace OpenSim.Region.Physics.OdePlugin
///
/// Used internally to destroy the ODE structures associated with this character.
///
- public void DestroyOdeStructures()
+ private void DestroyOdeStructures()
{
// destroy avatar capsule and related ODE data
if (Amotor != IntPtr.Zero)