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)