BulletSim: remove double application of buoyancy. Centralize computation of buoyancy. Add motor angular debugging controls.
							parent
							
								
									b592ec265b
								
							
						
					
					
						commit
						98168edc29
					
				|  | @ -124,6 +124,11 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
|         static readonly float PIOverFour = ((float)Math.PI) / 4f; | ||||
|         static readonly float PIOverTwo = ((float)Math.PI) / 2f; | ||||
| 
 | ||||
|         // For debugging, flags to turn on and off individual corrections. | ||||
|         private bool enableAngularVerticalAttraction = true; | ||||
|         private bool enableAngularDeflection = true; | ||||
|         private bool enableAngularBanking = true; | ||||
| 
 | ||||
|         public BSDynamics(BSScene myScene, BSPrim myPrim) | ||||
|         { | ||||
|             PhysicsScene = myScene; | ||||
|  | @ -575,11 +580,13 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
|                 PhysicsScene.PE.SetMassProps(Prim.PhysBody, m_vehicleMass, localInertia); | ||||
|                 PhysicsScene.PE.UpdateInertiaTensor(Prim.PhysBody); | ||||
| 
 | ||||
|                 Vector3 grav = PhysicsScene.DefaultGravity * (1f - Prim.Buoyancy); | ||||
|                 // Set the gravity for the vehicle depending on the buoyancy | ||||
|                 // TODO: what should be done if prim and vehicle buoyancy differ? | ||||
|                 Vector3 grav = Prim.ComputeGravity(m_VehicleBuoyancy); | ||||
|                 PhysicsScene.PE.SetGravity(Prim.PhysBody, grav); | ||||
| 
 | ||||
|                 VDetailLog("{0},BSDynamics.Refresh,mass={1},frict={2},inert={3},aDamp={4}", | ||||
|                                 Prim.LocalID, m_vehicleMass, friction, localInertia, angularDamping); | ||||
|                 VDetailLog("{0},BSDynamics.Refresh,mass={1},frict={2},inert={3},aDamp={4},grav={5}", | ||||
|                                 Prim.LocalID, m_vehicleMass, friction, localInertia, angularDamping, grav); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|  | @ -858,12 +865,6 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
|             linearMotorContribution *= VehicleOrientation; | ||||
|             // All the contributions after this are world relative (mostly Z modifications) | ||||
| 
 | ||||
|             // ================================================================== | ||||
|             // Buoyancy: force to overcome gravity. | ||||
|             // m_VehicleBuoyancy: -1=2g; 0=1g; 1=0g; | ||||
|             // So, if zero, don't change anything (let gravity happen). If one, negate the effect of gravity. | ||||
|             Vector3 buoyancyContribution =  Prim.PhysicsScene.DefaultGravity * m_VehicleBuoyancy; | ||||
| 
 | ||||
|             Vector3 terrainHeightContribution = ComputeLinearTerrainHeightCorrection(pTimestep); | ||||
| 
 | ||||
|             Vector3 hoverContribution = ComputeLinearHover(pTimestep); | ||||
|  | @ -873,12 +874,15 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
|             Vector3 limitMotorUpContribution = ComputeLinearMotorUp(pTimestep); | ||||
| 
 | ||||
|             // ================================================================== | ||||
|             // Select between velocities and forces. Forces will happen over time and | ||||
|             //    will take into account inertia, collisions, etc. Velocities are | ||||
|             //    raw updates to the velocity of the vehicle. | ||||
|             Vector3 newVelocity = linearMotorContribution | ||||
|                             + terrainHeightContribution | ||||
|                             + hoverContribution | ||||
|                             + limitMotorUpContribution; | ||||
| 
 | ||||
|             Vector3 newForce = buoyancyContribution; | ||||
|             Vector3 newForce = Vector3.Zero; | ||||
| 
 | ||||
|             // If not changing some axis, reduce out velocity | ||||
|             if ((m_flags & (VehicleFlag.NO_X)) != 0) | ||||
|  | @ -902,6 +906,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
|             // ================================================================== | ||||
|             // Stuff new linear velocity into the vehicle. | ||||
|             // Since the velocity is just being set, it is not scaled by pTimeStep. Bullet will do that for us. | ||||
|             // Also not scaled by mass since this is a super-physical setting of velocity. | ||||
|             VehicleVelocity = newVelocity; | ||||
| 
 | ||||
|             // Other linear forces are applied as forces. | ||||
|  | @ -911,13 +916,10 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
|                 VehicleAddForce(totalDownForce); | ||||
|             } | ||||
| 
 | ||||
|             VDetailLog("{0},  MoveLinear,done,newVel={1},totDown={2},IsColliding={3}", | ||||
|                                 Prim.LocalID, newVelocity, totalDownForce, Prim.IsColliding); | ||||
|             VDetailLog("{0},  MoveLinear,done,linContrib={1},terrContrib={2},hoverContrib={3},limitContrib={4},buoyContrib={5}", | ||||
|             VDetailLog("{0},  MoveLinear,done,linContrib={1},terrContrib={2},hoverContrib={3},limitContrib={4},totDown={5},isColl={6},newVel={7}", | ||||
|                                 Prim.LocalID, | ||||
|                                 linearMotorContribution, terrainHeightContribution, hoverContribution,  | ||||
|                                 limitMotorUpContribution, buoyancyContribution | ||||
|             ); | ||||
|                                 linearMotorContribution, terrainHeightContribution, hoverContribution, limitMotorUpContribution, | ||||
|                                 totalDownForce, Prim.IsColliding, newVelocity ); | ||||
| 
 | ||||
|         } // end MoveLinear() | ||||
| 
 | ||||
|  | @ -1088,6 +1090,8 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
|             //    for preventing ground vehicles with large linear deflection, like bumper cars, | ||||
|             //    from climbing their linear deflection into the sky.  | ||||
|             // That is, NO_DEFLECTION_UP says angular motion should not add any pitch or roll movement | ||||
|             // TODO: This is here because this is where ODE put it but documentation says it | ||||
|             //    is a linear effect. Where should this check go? | ||||
|             if ((m_flags & (VehicleFlag.NO_DEFLECTION_UP)) != 0) | ||||
|             { | ||||
|                 angularMotorContribution.X = 0f; | ||||
|  | @ -1179,7 +1183,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
|             Vector3 ret = Vector3.Zero; | ||||
| 
 | ||||
|             // If vertical attaction timescale is reasonable | ||||
|             if (m_verticalAttractionTimescale < m_verticalAttractionCutoff) | ||||
|             if (enableAngularVerticalAttraction && m_verticalAttractionTimescale < m_verticalAttractionCutoff) | ||||
|             { | ||||
|                 // Take a vector pointing up and convert it from world to vehicle relative coords. | ||||
|                 Vector3 verticalError = Vector3.UnitZ * VehicleOrientation; | ||||
|  | @ -1230,7 +1234,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
|             //     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 && VehicleVelocity != Vector3.Zero) | ||||
|             if (enableAngularDeflection && m_angularDeflectionEfficiency != 0 && VehicleVelocity != Vector3.Zero) | ||||
|             { | ||||
|                 // The direction the vehicle is moving | ||||
|                 Vector3 movingDirection = VehicleVelocity; | ||||
|  | @ -1303,7 +1307,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
|         { | ||||
|             Vector3 ret = Vector3.Zero; | ||||
| 
 | ||||
|             if (m_bankingEfficiency != 0 && m_verticalAttractionTimescale < m_verticalAttractionCutoff) | ||||
|             if (enableAngularBanking && m_bankingEfficiency != 0 && m_verticalAttractionTimescale < m_verticalAttractionCutoff) | ||||
|             { | ||||
|                 // Rotate a UnitZ vector (pointing up) to how the vehicle is oriented. | ||||
|                 // As the vehicle rolls to the right or left, the Y value will increase from | ||||
|  |  | |||
|  | @ -410,7 +410,7 @@ public sealed class BSPrim : BSPhysObject | |||
|             } | ||||
|             else | ||||
|             { | ||||
|                 OMV.Vector3 grav = ComputeGravity(); | ||||
|                 OMV.Vector3 grav = ComputeGravity(Buoyancy); | ||||
| 
 | ||||
|                 if (inWorld) | ||||
|                 { | ||||
|  | @ -445,12 +445,12 @@ public sealed class BSPrim : BSPhysObject | |||
|     } | ||||
| 
 | ||||
|     // Return what gravity should be set to this very moment | ||||
|     private OMV.Vector3 ComputeGravity() | ||||
|     public OMV.Vector3 ComputeGravity(float buoyancy) | ||||
|     { | ||||
|         OMV.Vector3 ret = PhysicsScene.DefaultGravity; | ||||
| 
 | ||||
|         if (!IsStatic) | ||||
|             ret *= (1f - Buoyancy); | ||||
|             ret *= (1f - buoyancy); | ||||
| 
 | ||||
|         return ret; | ||||
|     } | ||||
|  | @ -1561,21 +1561,6 @@ public sealed class BSPrim : BSPhysObject | |||
| 
 | ||||
|     // The physics engine says that properties have updated. Update same and inform | ||||
|     // the world that things have changed. | ||||
|     // TODO: do we really need to check for changed? Maybe just copy values and call RequestPhysicsterseUpdate() | ||||
|     enum UpdatedProperties { | ||||
|         Position      = 1 << 0, | ||||
|         Rotation      = 1 << 1, | ||||
|         Velocity      = 1 << 2, | ||||
|         Acceleration  = 1 << 3, | ||||
|         RotationalVel = 1 << 4 | ||||
|     } | ||||
| 
 | ||||
|     const float ROTATION_TOLERANCE = 0.01f; | ||||
|     const float VELOCITY_TOLERANCE = 0.001f; | ||||
|     const float POSITION_TOLERANCE = 0.05f; | ||||
|     const float ACCELERATION_TOLERANCE = 0.01f; | ||||
|     const float ROTATIONAL_VELOCITY_TOLERANCE = 0.01f; | ||||
| 
 | ||||
|     public override void UpdateProperties(EntityProperties entprop) | ||||
|     { | ||||
|         // Updates only for individual prims and for the root object of a linkset. | ||||
|  | @ -1588,7 +1573,7 @@ public sealed class BSPrim : BSPhysObject | |||
|                 entprop.RotationalVelocity = OMV.Vector3.Zero; | ||||
|             } | ||||
| 
 | ||||
|             // Assign directly to the local variables so the normal set action does not happen | ||||
|             // Assign directly to the local variables so the normal set actions do not happen | ||||
|             _position = entprop.Position; | ||||
|             _orientation = entprop.Rotation; | ||||
|             _velocity = entprop.Velocity; | ||||
|  |  | |||
|  | @ -486,6 +486,7 @@ public sealed class BSScene : PhysicsScene, IPhysicsParameters | |||
|         ProcessTaints(); | ||||
| 
 | ||||
|         // Some of the physical objects requre individual, pre-step calls | ||||
|         //      (vehicles and avatar movement, in particular) | ||||
|         TriggerPreStepEvent(timeStep); | ||||
| 
 | ||||
|         // the prestep actions might have added taints | ||||
|  |  | |||
|  | @ -1,12 +1,17 @@ | |||
| CURRENT PRIORITIES | ||||
| ================================================= | ||||
| Avatars walking up stairs (HALF DONE) | ||||
| Vehicle movement on terrain smoothness | ||||
| Nebadon vehicles turning funny in arena | ||||
| limitMotorUp calibration (more down?) | ||||
| Vehicle angular vertical attraction | ||||
| Vehicle angular deflection | ||||
| 	Preferred orientation angular correction fix | ||||
| vehicle angular banking | ||||
| Avatars walking up stairs (HALF DONE) | ||||
|     Radius of the capsule affects ability to climb edges. | ||||
| Vehicle movement on terrain smoothness | ||||
| Surfboard go wonky when turning | ||||
| 	Angular motor direction is global coordinates rather than local coordinates? | ||||
| Boats float low in the water | ||||
| Boats float low in the water (DONE) | ||||
| Avatar movement | ||||
| 	flying into a wall doesn't stop avatar who keeps appearing to move through the obstacle (DONE) | ||||
| 	walking up stairs is not calibrated correctly (stairs out of Kepler cabin) | ||||
|  | @ -33,19 +38,15 @@ CRASHES | |||
| 
 | ||||
| VEHICLES TODO LIST: | ||||
| ================================================= | ||||
| Angular motor direction is global coordinates rather than local coordinates | ||||
| Border crossing with linked vehicle causes crash | ||||
| Vehicles (Move smoothly) | ||||
| Add vehicle collisions so IsColliding is properly reported. | ||||
| 	Needed for banking, limitMotorUp, movementLimiting, ... | ||||
| VehicleAddForce is not scaled by the simulation step but it is only | ||||
| 	applied for one step. Should it be scaled? | ||||
| Some vehicles should not be able to turn if no speed or off ground. | ||||
| Cannot edit/move a vehicle being ridden: it jumps back to the origional position. | ||||
| Neb car jiggling left and right | ||||
| 	Happens on terrain and any other mesh object. Flat cubes are much smoother. | ||||
| 	This has been reduced but not eliminated. | ||||
| Implement referenceFrame for all the motion routines. | ||||
| For limitMotorUp, use raycast down to find if vehicle is in the air. | ||||
| 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 llGetVel() is returning a smooth and good value for vehicle movement. | ||||
|  | @ -54,14 +55,13 @@ Implement function efficiency for lineaar and angular motion. | |||
| 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 | ||||
| Linkset explosion after three "rides" on Nebadon lite vehicle (LinksetConstraint) | ||||
| For limitMotorUp, use raycast down to find if vehicle is in the air. | ||||
| Remove vehicle angular velocity zeroing in BSPrim.UpdateProperties(). | ||||
| 	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: | ||||
| GENERAL TODO LIST: | ||||
| ================================================= | ||||
| Implement an avatar mesh shape. The Bullet capsule is way too limited. | ||||
| 	Consider just hand creating a vertex/index array in a new BSShapeAvatar. | ||||
|  | @ -121,11 +121,9 @@ LinksetCompound: when one of the children changes orientation (like tires | |||
| Verify/think through scripts in children of linksets. What do they reference | ||||
| 	and return when getting position, velocity, ... | ||||
| Confirm constraint linksets still work after making all the changes for compound linksets. | ||||
| Use PostTaint callback to do rebuilds for constraint linksets to reduce rebuilding | ||||
| Add 'changed' flag or similar to reduce the number of times a linkset is rebuilt. | ||||
| 	For compound linksets, add ability to remove or reposition individual child shapes. | ||||
| Disable activity of passive linkset children. | ||||
| 	Since the linkset is a compound object, the old prims are left lying | ||||
| 	around and need to be phantomized so they don't collide, ... | ||||
| Speed up creation of large physical linksets | ||||
| 	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). | ||||
|  | @ -138,25 +136,21 @@ MORE | |||
| Use the HACD convex hull routine in Bullet rather than the C# version. | ||||
| Do we need to do convex hulls all the time? Can complex meshes be left meshes? | ||||
| 	There is some problem with meshes and collisions | ||||
| Test avatar walking up stairs. How does compare with SL. | ||||
|     Radius of the capsule affects ability to climb edges. | ||||
| 	Hulls are not as detailed as meshes. Hulled vehicles insides are different shape. | ||||
| Debounce avatar contact so legs don't keep folding up when standing. | ||||
| Implement LSL physics controls. Like STATUS_ROTATE_X. | ||||
| Add border extensions to terrain to help region crossings and objects leaving region. | ||||
| Use a different capsule shape for avatar when sitting | ||||
| 	LL uses a pyrimidal shape scaled by the avatar's bounding box | ||||
| 	http://wiki.secondlife.com/wiki/File:Avmeshforms.png | ||||
| 
 | ||||
| Performance test with lots of avatars. Can BulletSim support a thousand? | ||||
| Optimize collisions in C++: only send up to the object subscribed to collisions. | ||||
|     Use collision subscription and remove the collsion(A,B) and collision(B,A) | ||||
| Check whether SimMotionState needs large if statement (see TODO). | ||||
| 
 | ||||
| Implement 'top colliders' info. | ||||
| Avatar jump | ||||
| Performance measurement and changes to make quicker. | ||||
| Implement detailed physics stats (GetStats()). | ||||
| 
 | ||||
| Measure performance improvement from hulls | ||||
| Test not using ghost objects for volume detect implementation. | ||||
| Performance of closures and delegates for taint processing | ||||
|  | @ -164,9 +158,7 @@ Performance of closures and delegates for taint processing | |||
| 	Is any slowdown introduced by the existing implementation significant? | ||||
| Is there are more efficient method of implementing pre and post step actions? | ||||
| 	See http://www.codeproject.com/Articles/29922/Weak-Events-in-C | ||||
| 
 | ||||
| Physics Arena central pyramid: why is one side permiable? | ||||
| 
 | ||||
| In SL, perfect spheres don't seem to have rolling friction. Add special case. | ||||
| Enforce physical parameter min/max: | ||||
| 	Gravity: [-1, 28] | ||||
|  | @ -197,22 +189,19 @@ Generalize Dynamics and PID with standardized motors. | |||
| Generalize Linkset and vehicles into PropertyManagers | ||||
|     Methods for Refresh, RemoveBodyDependencies, RestoreBodyDependencies | ||||
| 	Potentially add events for shape destruction, etc. | ||||
| Complete implemention of preStepActions | ||||
| 	Replace vehicle step call with prestep event. | ||||
| 	Is there a need for postStepActions? postStepTaints? | ||||
| Better mechanism for resetting linkset set and vehicle parameters when body rebuilt. | ||||
| 	BSPrim.CreateGeomAndObject is kludgy with the callbacks, etc. | ||||
| Implement linkset by setting position of children when root updated. (LinksetManual) | ||||
| 	Linkset implementation using manual prim movement. | ||||
| LinkablePrim class? Would that simplify/centralize the linkset logic? | ||||
| BSScene.UpdateParameterSet() is broken. How to set params on objects? | ||||
| Remove HeightmapInfo from terrain specification | ||||
|     Since C++ code does not need terrain height, this structure et al are not needed. | ||||
| Add floating motor for BS_FLOATS_ON_WATER so prim and avatar will | ||||
|     bob at the water level. BSPrim.PositionSanityCheck(). | ||||
|     bob at the water level. BSPrim.PositionSanityCheck() | ||||
| Should taints check for existance or activeness of target? | ||||
| 	When destroying linksets/etc, taints can be generated for objects that are | ||||
| 	actually gone when the taint happens. Crashes don't happen because the taint closure | ||||
| 	keeps the object from being freed, but that is just an accident. | ||||
| 	Possibly have and 'active' flag that is checked by the taint processor? | ||||
| 	Possibly have an 'active' flag that is checked by the taint processor? | ||||
| Parameters for physics logging should be moved from BSScene to BSParam (at least boolean ones) | ||||
| Can some of the physical wrapper classes (BulletBody, BulletWorld, BulletShape) be 'sealed'? | ||||
| There are TOO MANY interfaces from BulletSim core to Bullet itself | ||||
|  | @ -282,3 +271,18 @@ Redo BulletSimAPI to allow native C# implementation of Bullet option (DONE) | |||
| Meshes rendering as bounding boxes (DONE) | ||||
| 	(Resolution: Added test for mesh/sculpties in native shapes so it didn't think it was a box) | ||||
| llMoveToTarget (Resolution: added simple motor to update the position.) | ||||
| Angular motor direction is global coordinates rather than local coordinates (DONE) | ||||
| Add vehicle collisions so IsColliding is properly reported. (DONE) | ||||
| 	Needed for banking, limitMotorUp, movementLimiting, ... | ||||
| 	(Resolution: added CollisionFlags.BS_VEHICLE_COLLISION and code to use it) | ||||
| VehicleAddForce is not scaled by the simulation step but it is only | ||||
| 	applied for one step. Should it be scaled? (DONE) | ||||
| 	(Resolution: use force for timed things, Impulse for immediate, non-timed things) | ||||
| Complete implemention of preStepActions (DONE) | ||||
| 	Replace vehicle step call with prestep event. | ||||
| 	Is there a need for postStepActions? postStepTaints? | ||||
| Disable activity of passive linkset children. (DONE) | ||||
| 	Since the linkset is a compound object, the old prims are left lying | ||||
| 	around and need to be phantomized so they don't collide, ... | ||||
| Remove HeightmapInfo from terrain specification (DONE) | ||||
|     Since C++ code does not need terrain height, this structure et al are not needed. | ||||
		Loading…
	
		Reference in New Issue
	
	 Robert Adams
						Robert Adams