BulletSim: angularMotorUp working again (seems a little slow as it takes longer than timescale to correct, but getting better). Disabled angularDeflection (need to resolve interactions between angular corrections). Update TODO list.
parent
b7ad44e3a6
commit
e73dac4deb
|
@ -91,6 +91,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
|
||||||
private Vector3 m_lastVertAttractor = Vector3.Zero; // what VA was last applied to body
|
private Vector3 m_lastVertAttractor = Vector3.Zero; // what VA was last applied to body
|
||||||
|
|
||||||
//Deflection properties
|
//Deflection properties
|
||||||
|
private BSVMotor m_angularDeflectionMotor = new BSVMotor("AngularDeflection");
|
||||||
private float m_angularDeflectionEfficiency = 0;
|
private float m_angularDeflectionEfficiency = 0;
|
||||||
private float m_angularDeflectionTimescale = 0;
|
private float m_angularDeflectionTimescale = 0;
|
||||||
private float m_linearDeflectionEfficiency = 0;
|
private float m_linearDeflectionEfficiency = 0;
|
||||||
|
@ -102,6 +103,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
|
||||||
private float m_bankingTimescale = 0;
|
private float m_bankingTimescale = 0;
|
||||||
|
|
||||||
//Hover and Buoyancy properties
|
//Hover and Buoyancy properties
|
||||||
|
private BSVMotor m_hoverMotor = new BSVMotor("Hover");
|
||||||
private float m_VhoverHeight = 0f;
|
private float m_VhoverHeight = 0f;
|
||||||
private float m_VhoverEfficiency = 0f;
|
private float m_VhoverEfficiency = 0f;
|
||||||
private float m_VhoverTimescale = 0f;
|
private float m_VhoverTimescale = 0f;
|
||||||
|
@ -118,6 +120,10 @@ namespace OpenSim.Region.Physics.BulletSPlugin
|
||||||
// Timescale > cutoff means no vert attractor.
|
// Timescale > cutoff means no vert attractor.
|
||||||
private float m_verticalAttractionTimescale = 510f;
|
private float m_verticalAttractionTimescale = 510f;
|
||||||
|
|
||||||
|
// Just some recomputed constants:
|
||||||
|
static readonly float PIOverFour = ((float)Math.PI) / 4f;
|
||||||
|
static readonly float PIOverTwo = ((float)Math.PI) / 2f;
|
||||||
|
|
||||||
public BSDynamics(BSScene myScene, BSPrim myPrim)
|
public BSDynamics(BSScene myScene, BSPrim myPrim)
|
||||||
{
|
{
|
||||||
PhysicsScene = myScene;
|
PhysicsScene = myScene;
|
||||||
|
@ -563,9 +569,6 @@ namespace OpenSim.Region.Physics.BulletSPlugin
|
||||||
// Vehicles report collision events so we know when it's on the ground
|
// Vehicles report collision events so we know when it's on the ground
|
||||||
BulletSimAPI.AddToCollisionFlags2(Prim.PhysBody.ptr, CollisionFlags.BS_VEHICLE_COLLISIONS);
|
BulletSimAPI.AddToCollisionFlags2(Prim.PhysBody.ptr, CollisionFlags.BS_VEHICLE_COLLISIONS);
|
||||||
|
|
||||||
// DEBUG DEBUG DEBUG: use uniform inertia to smooth movement added by Bullet
|
|
||||||
// Vector3 localInertia = new Vector3(1f, 1f, 1f);
|
|
||||||
// Vector3 localInertia = new Vector3(m_vehicleMass, m_vehicleMass, m_vehicleMass);
|
|
||||||
Vector3 localInertia = BulletSimAPI.CalculateLocalInertia2(Prim.PhysShape.ptr, m_vehicleMass);
|
Vector3 localInertia = BulletSimAPI.CalculateLocalInertia2(Prim.PhysShape.ptr, m_vehicleMass);
|
||||||
BulletSimAPI.SetMassProps2(Prim.PhysBody.ptr, m_vehicleMass, localInertia);
|
BulletSimAPI.SetMassProps2(Prim.PhysBody.ptr, m_vehicleMass, localInertia);
|
||||||
BulletSimAPI.UpdateInertiaTensor2(Prim.PhysBody.ptr);
|
BulletSimAPI.UpdateInertiaTensor2(Prim.PhysBody.ptr);
|
||||||
|
@ -613,7 +616,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
|
||||||
private Quaternion? m_knownOrientation;
|
private Quaternion? m_knownOrientation;
|
||||||
private Vector3? m_knownRotationalVelocity;
|
private Vector3? m_knownRotationalVelocity;
|
||||||
private Vector3 m_knownRotationalForce;
|
private Vector3 m_knownRotationalForce;
|
||||||
private float? m_knownForwardSpeed;
|
private Vector3? m_knownForwardVelocity; // vehicle relative forward speed
|
||||||
|
|
||||||
private const int m_knownChangedPosition = 1 << 0;
|
private const int m_knownChangedPosition = 1 << 0;
|
||||||
private const int m_knownChangedVelocity = 1 << 1;
|
private const int m_knownChangedVelocity = 1 << 1;
|
||||||
|
@ -632,7 +635,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
|
||||||
m_knownOrientation = null;
|
m_knownOrientation = null;
|
||||||
m_knownRotationalVelocity = null;
|
m_knownRotationalVelocity = null;
|
||||||
m_knownRotationalForce = Vector3.Zero;
|
m_knownRotationalForce = Vector3.Zero;
|
||||||
m_knownForwardSpeed = null;
|
m_knownForwardVelocity = null;
|
||||||
m_knownChanged = 0;
|
m_knownChanged = 0;
|
||||||
}
|
}
|
||||||
private void PushKnownChanged()
|
private void PushKnownChanged()
|
||||||
|
@ -755,13 +758,21 @@ namespace OpenSim.Region.Physics.BulletSPlugin
|
||||||
m_knownRotationalForce += aForce;
|
m_knownRotationalForce += aForce;
|
||||||
m_knownChanged |= m_knownChangedRotationalForce;
|
m_knownChanged |= m_knownChangedRotationalForce;
|
||||||
}
|
}
|
||||||
|
// Vehicle relative forward velocity
|
||||||
|
private Vector3 VehicleForwardVelocity
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (m_knownForwardVelocity == null)
|
||||||
|
m_knownForwardVelocity = VehicleVelocity * Quaternion.Inverse(Quaternion.Normalize(VehicleOrientation));
|
||||||
|
return (Vector3)m_knownForwardVelocity;
|
||||||
|
}
|
||||||
|
}
|
||||||
private float VehicleForwardSpeed
|
private float VehicleForwardSpeed
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
if (m_knownForwardSpeed == null)
|
return VehicleForwardVelocity.X;
|
||||||
m_knownForwardSpeed = (VehicleVelocity * Quaternion.Inverse(VehicleOrientation)).X;
|
|
||||||
return (float)m_knownForwardSpeed;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1025,7 +1036,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
|
||||||
// set directly on the vehicle.
|
// set directly on the vehicle.
|
||||||
private void MoveAngular(float pTimestep)
|
private void MoveAngular(float pTimestep)
|
||||||
{
|
{
|
||||||
// The user wants how many radians per second angular change?
|
// The user wants this many radians per second angular change?
|
||||||
Vector3 angularMotorContribution = m_angularMotor.Step(pTimestep);
|
Vector3 angularMotorContribution = m_angularMotor.Step(pTimestep);
|
||||||
|
|
||||||
// ==================================================================
|
// ==================================================================
|
||||||
|
@ -1137,27 +1148,23 @@ namespace OpenSim.Region.Physics.BulletSPlugin
|
||||||
// Y error means needed rotation around X axis and visa versa.
|
// Y error means needed rotation around X axis and visa versa.
|
||||||
// Since the error goes from zero to one, the asin is the corresponding angle.
|
// Since the error goes from zero to one, the asin is the corresponding angle.
|
||||||
ret.X = (float)Math.Asin(verticalError.Y);
|
ret.X = (float)Math.Asin(verticalError.Y);
|
||||||
ret.Y = (float)Math.Asin(verticalError.X);
|
// (Tilt forward (positive X) needs to tilt back (rotate negative) around Y axis.)
|
||||||
|
ret.Y = -(float)Math.Asin(verticalError.X);
|
||||||
|
|
||||||
// If verticalError.Z is negative, the vehicle is upside down. Add additional push.
|
// If verticalError.Z is negative, the vehicle is upside down. Add additional push.
|
||||||
if (verticalError.Z < 0f)
|
if (verticalError.Z < 0f)
|
||||||
{
|
{
|
||||||
ret.X += (float)Math.PI / 4f;
|
ret.X += PIOverFour;
|
||||||
ret.Y += (float)Math.PI / 4f;
|
ret.Y += PIOverFour;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Put the signs back on so the rotation is in the correct direction.
|
|
||||||
ret.X *= (float)Math.Sign(verticalError.Y);
|
|
||||||
// (Tilt forward (positive X) needs to tilt back (rotate negative) around Y axis.)
|
|
||||||
ret.Y *= -(float)Math.Sign(verticalError.X);
|
|
||||||
|
|
||||||
// 'ret' is now the necessary velocity to correct tilt in one second.
|
// 'ret' is now the necessary velocity to correct tilt in one second.
|
||||||
// Correction happens over a number of seconds.
|
// Correction happens over a number of seconds.
|
||||||
Vector3 unscaledContrib = ret;
|
Vector3 unscaledContrib = ret;
|
||||||
ret /= m_verticalAttractionTimescale;
|
ret /= m_verticalAttractionTimescale;
|
||||||
|
|
||||||
VDetailLog("{0}, MoveAngular,verticalAttraction,,verticalError={1},unscaled={2},eff={3},vertAttr={4}",
|
VDetailLog("{0}, MoveAngular,verticalAttraction,,verticalError={1},unscaled={2},eff={3},ts={4},vertAttr={5}",
|
||||||
Prim.LocalID, verticalError, unscaledContrib, m_verticalAttractionEfficiency, ret);
|
Prim.LocalID, verticalError, unscaledContrib, m_verticalAttractionEfficiency, m_verticalAttractionTimescale, ret);
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -1170,6 +1177,12 @@ namespace OpenSim.Region.Physics.BulletSPlugin
|
||||||
public Vector3 ComputeAngularDeflection()
|
public Vector3 ComputeAngularDeflection()
|
||||||
{
|
{
|
||||||
Vector3 ret = Vector3.Zero;
|
Vector3 ret = Vector3.Zero;
|
||||||
|
return ret; // DEBUG DEBUG DEBUG
|
||||||
|
// Disable angular deflection for the moment.
|
||||||
|
// Since angularMotorUp and angularDeflection are computed independently, they will calculate
|
||||||
|
// approximately the same X or Y correction. When added together (when contributions are combined)
|
||||||
|
// this creates an over-correction and then wabbling as the target is overshot.
|
||||||
|
// TODO: rethink how the different correction computations inter-relate.
|
||||||
|
|
||||||
if (m_angularDeflectionEfficiency != 0)
|
if (m_angularDeflectionEfficiency != 0)
|
||||||
{
|
{
|
||||||
|
@ -1181,15 +1194,24 @@ namespace OpenSim.Region.Physics.BulletSPlugin
|
||||||
Vector3 pointingDirection = Vector3.UnitX * VehicleOrientation;
|
Vector3 pointingDirection = Vector3.UnitX * VehicleOrientation;
|
||||||
pointingDirection.Normalize();
|
pointingDirection.Normalize();
|
||||||
|
|
||||||
// The difference between what is and what should be
|
// The difference between what is and what should be.
|
||||||
Vector3 deflectionError = movingDirection - pointingDirection;
|
Vector3 deflectionError = movingDirection - pointingDirection;
|
||||||
|
|
||||||
|
// Don't try to correct very large errors (not our job)
|
||||||
|
if (Math.Abs(deflectionError.X) > PIOverFour) deflectionError.X = 0f;
|
||||||
|
if (Math.Abs(deflectionError.Y) > PIOverFour) deflectionError.Y = 0f;
|
||||||
|
if (Math.Abs(deflectionError.Z) > PIOverFour) deflectionError.Z = 0f;
|
||||||
|
|
||||||
|
// ret = m_angularDeflectionCorrectionMotor(1f, deflectionError);
|
||||||
|
|
||||||
// Scale the correction by recovery timescale and efficiency
|
// Scale the correction by recovery timescale and efficiency
|
||||||
ret = (-deflectionError * VehicleForwardSpeed) * m_angularDeflectionEfficiency;
|
ret = (-deflectionError) * m_angularDeflectionEfficiency;
|
||||||
ret /= m_angularDeflectionTimescale;
|
ret /= m_angularDeflectionTimescale;
|
||||||
|
|
||||||
VDetailLog("{0}, MoveAngular,Deflection,movingDir={1},pointingDir={2},deflectError={3},ret={4}",
|
VDetailLog("{0}, MoveAngular,Deflection,movingDir={1},pointingDir={2},deflectError={3},ret={4}",
|
||||||
Prim.LocalID, movingDirection, pointingDirection, deflectionError, ret);
|
Prim.LocalID, movingDirection, pointingDirection, deflectionError, ret);
|
||||||
|
VDetailLog("{0}, MoveAngular,Deflection,fwdSpd={1},defEff={2},defTS={3}",
|
||||||
|
Prim.LocalID, VehicleForwardSpeed, m_angularDeflectionEfficiency, m_angularDeflectionTimescale);
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -1305,6 +1327,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
|
||||||
private float ClampInRange(float low, float val, float high)
|
private float ClampInRange(float low, float val, float high)
|
||||||
{
|
{
|
||||||
return Math.Max(low, Math.Min(val, high));
|
return Math.Max(low, Math.Min(val, high));
|
||||||
|
// return Utils.Clamp(val, low, high);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Invoke the detailed logger and output something if it's enabled.
|
// Invoke the detailed logger and output something if it's enabled.
|
||||||
|
|
|
@ -8,9 +8,10 @@ Enable vehicle border crossings (at least as poorly as ODE)
|
||||||
Vehicle recreated in new sim at small Z value (offset from root value?) (DONE)
|
Vehicle recreated in new sim at small Z value (offset from root value?) (DONE)
|
||||||
Calibrate turning radius (DONE)
|
Calibrate turning radius (DONE)
|
||||||
limitMotorUp calibration (more down?)
|
limitMotorUp calibration (more down?)
|
||||||
study PID motors (include 'efficiency' implementation
|
study PID motors (include 'efficiency' implementation (DONE)
|
||||||
Add to avatar movement
|
Add to avatar movement
|
||||||
|
|
||||||
|
|
||||||
CRASHES
|
CRASHES
|
||||||
=================================================
|
=================================================
|
||||||
20121129.1411: editting/moving phys object across region boundries causes crash
|
20121129.1411: editting/moving phys object across region boundries causes crash
|
||||||
|
@ -25,7 +26,6 @@ CRASHES
|
||||||
VEHICLES TODO LIST:
|
VEHICLES TODO LIST:
|
||||||
=================================================
|
=================================================
|
||||||
Border crossing with linked vehicle causes crash
|
Border crossing with linked vehicle causes crash
|
||||||
Neb vehicle taking > 25ms of physics time!!
|
|
||||||
Vehicles (Move smoothly)
|
Vehicles (Move smoothly)
|
||||||
Add vehicle collisions so IsColliding is properly reported.
|
Add vehicle collisions so IsColliding is properly reported.
|
||||||
Needed for banking, limitMotorUp, movementLimiting, ...
|
Needed for banking, limitMotorUp, movementLimiting, ...
|
||||||
|
@ -34,28 +34,25 @@ Cannot edit/move a vehicle being ridden: it jumps back to the origional position
|
||||||
Neb car jiggling left and right
|
Neb car jiggling left and right
|
||||||
Happens on terrain and any other mesh object. Flat cubes are much smoother.
|
Happens on terrain and any other mesh object. Flat cubes are much smoother.
|
||||||
This has been reduced but not eliminated.
|
This has been reduced but not eliminated.
|
||||||
Light cycle falling over when driving
|
|
||||||
Implement referenceFrame for all the motion routines.
|
Implement referenceFrame for all the motion routines.
|
||||||
Angular motion around Z moves the vehicle in world Z and not vehicle Z in ODE.
|
Angular motion around Z moves the vehicle in world Z and not vehicle Z in ODE.
|
||||||
Verify that angular motion specified around Z moves in the vehicle coordinates.
|
Verify that angular motion specified around Z moves in the vehicle coordinates.
|
||||||
Verify llGetVel() is returning a smooth and good value for vehicle movement.
|
Verify llGetVel() is returning a smooth and good value for vehicle movement.
|
||||||
llGetVel() should return the root's velocity if requested in a child prim.
|
llGetVel() should return the root's velocity if requested in a child prim.
|
||||||
Implement function efficiency for lineaar and angular motion.
|
Implement function efficiency for lineaar and angular motion.
|
||||||
Should vehicle angular/linear movement friction happen after all the components
|
|
||||||
or does it only apply to the basic movement?
|
|
||||||
After getting off a vehicle, the root prim is phantom (can be walked through)
|
After getting off a vehicle, the root prim is phantom (can be walked through)
|
||||||
Need to force a position update for the root prim after compound shape destruction
|
Need to force a position update for the root prim after compound shape destruction
|
||||||
Linkset explosion after three "rides" on Nebadon lite vehicle (LinksetConstraint)
|
Linkset explosion after three "rides" on Nebadon lite vehicle (LinksetConstraint)
|
||||||
For limitMotorUp, use raycast down to find if vehicle is in the air.
|
For limitMotorUp, use raycast down to find if vehicle is in the air.
|
||||||
Remove vehicle angular velocity zeroing in BSPrim.UpdateProperties().
|
Remove vehicle angular velocity zeroing in BSPrim.UpdateProperties().
|
||||||
A kludge that isn't fixing the real problem of Bullet adding extra motion.
|
A kludge that isn't fixing the real problem of Bullet adding extra motion.
|
||||||
|
Incorporate inter-relationship of angular corrections. For instance, angularDeflection
|
||||||
|
and angularMotorUp will compute same X or Y correction. When added together
|
||||||
|
creates over-correction and over-shoot and wabbling.
|
||||||
|
|
||||||
BULLETSIM TODO LIST:
|
BULLETSIM TODO LIST:
|
||||||
=================================================
|
=================================================
|
||||||
Revisit CollisionMargin. Builders notice the 0.04 spacing between prims.
|
Revisit CollisionMargin. Builders notice the 0.04 spacing between prims.
|
||||||
Avatar height off after unsitting (floats off ground)
|
|
||||||
Editting appearance then moving restores.
|
|
||||||
Must not be initializing height when recreating capsule after unsit.
|
|
||||||
Duplicating a physical prim causes old prim to jump away
|
Duplicating a physical prim causes old prim to jump away
|
||||||
Dup a phys prim and the original become unselected and thus interacts w/ selected prim.
|
Dup a phys prim and the original become unselected and thus interacts w/ selected prim.
|
||||||
Scenes with hundred of thousands of static objects take a lot of physics CPU time.
|
Scenes with hundred of thousands of static objects take a lot of physics CPU time.
|
||||||
|
@ -83,6 +80,8 @@ Add osGetPhysicsEngineName() so scripters can tell whether BulletSim or ODE
|
||||||
Linkset.Position and Linkset.Orientation requre rewrite to properly return
|
Linkset.Position and Linkset.Orientation requre rewrite to properly return
|
||||||
child position. LinksetConstraint acts like it's at taint time!!
|
child position. LinksetConstraint acts like it's at taint time!!
|
||||||
Implement LockAngularMotion -- implements llSetStatus(ROTATE_AXIS_*, T/F)
|
Implement LockAngularMotion -- implements llSetStatus(ROTATE_AXIS_*, T/F)
|
||||||
|
Should the different PID factors have non-equal contributions for different
|
||||||
|
values of Efficiency?
|
||||||
|
|
||||||
LINKSETS
|
LINKSETS
|
||||||
======================================================
|
======================================================
|
||||||
|
@ -100,17 +99,16 @@ Disable activity of passive linkset children.
|
||||||
Since the linkset is a compound object, the old prims are left lying
|
Since the linkset is a compound object, the old prims are left lying
|
||||||
around and need to be phantomized so they don't collide, ...
|
around and need to be phantomized so they don't collide, ...
|
||||||
Speed up creation of large physical linksets
|
Speed up creation of large physical linksets
|
||||||
For instance, sitting in Neb's car (130 prims) takes several seconds to become physical
|
For instance, sitting in Neb's car (130 prims) takes several seconds to become physical.
|
||||||
|
REALLY bad for very large physical linksets (freezes the sim for many seconds).
|
||||||
Eliminate collisions between objects in a linkset. (LinksetConstraint)
|
Eliminate collisions between objects in a linkset. (LinksetConstraint)
|
||||||
Have UserPointer point to struct with localID and linksetID?
|
Have UserPointer point to struct with localID and linksetID?
|
||||||
Objects in original linkset still collide with each other?
|
Objects in original linkset still collide with each other?
|
||||||
|
|
||||||
MORE
|
MORE
|
||||||
======================================================
|
======================================================
|
||||||
Find/remove avatar collision with ID=0.
|
|
||||||
Test avatar walking up stairs. How does compare with SL.
|
Test avatar walking up stairs. How does compare with SL.
|
||||||
Radius of the capsule affects ability to climb edges.
|
Radius of the capsule affects ability to climb edges.
|
||||||
Tune terrain/object friction to be closer to SL.
|
|
||||||
Debounce avatar contact so legs don't keep folding up when standing.
|
Debounce avatar contact so legs don't keep folding up when standing.
|
||||||
Implement LSL physics controls. Like STATUS_ROTATE_X.
|
Implement LSL physics controls. Like STATUS_ROTATE_X.
|
||||||
Add border extensions to terrain to help region crossings and objects leaving region.
|
Add border extensions to terrain to help region crossings and objects leaving region.
|
||||||
|
@ -203,3 +201,16 @@ Single prim vehicles don't seem to properly vehiclize.
|
||||||
Add material type linkage and input all the material property definitions.
|
Add material type linkage and input all the material property definitions.
|
||||||
Skeleton classes and table are in the sources but are not filled or used.
|
Skeleton classes and table are in the sources but are not filled or used.
|
||||||
(Resolution:
|
(Resolution:
|
||||||
|
Neb vehicle taking > 25ms of physics time!!
|
||||||
|
(Resolution: compound linksets were being rebuild WAY too often)
|
||||||
|
Avatar height off after unsitting (floats off ground)
|
||||||
|
Editting appearance then moving restores.
|
||||||
|
Must not be initializing height when recreating capsule after unsit.
|
||||||
|
(Resolution: confusion of scale vs size for native objects removed)
|
||||||
|
Light cycle falling over when driving (Resolution: implemented angularMotorUp)
|
||||||
|
Should vehicle angular/linear movement friction happen after all the components
|
||||||
|
or does it only apply to the basic movement?
|
||||||
|
(Resolution: friction added before returning newly computed motor value.
|
||||||
|
What is expected by some vehicles (turning up friction to moderate speed))
|
||||||
|
Tune terrain/object friction to be closer to SL.
|
||||||
|
(Resolution: added material type with friction and resolution)
|
||||||
|
|
Loading…
Reference in New Issue