BulletSim: add terrain contact processing threshold parameter. Initialize contact processing threshold for static object as well as mesh terrain.
							parent
							
								
									397379cd3f
								
							
						
					
					
						commit
						8510f57ad4
					
				| 
						 | 
				
			
			@ -39,6 +39,20 @@ public static class BSParam
 | 
			
		|||
{
 | 
			
		||||
    private static string LogHeader = "[BULLETSIM PARAMETERS]"; 
 | 
			
		||||
 | 
			
		||||
    // Tuning notes:
 | 
			
		||||
    // From: http://bulletphysics.org/Bullet/phpBB3/viewtopic.php?t=6575
 | 
			
		||||
    //    Contact points can be added even if the distance is positive. The constraint solver can deal with
 | 
			
		||||
    //    contacts with positive distances as well as negative (penetration). Contact points are discarded
 | 
			
		||||
    //    if the distance exceeds a certain threshold.
 | 
			
		||||
    //    Bullet has a contact processing threshold and a contact breaking threshold.
 | 
			
		||||
    //    If the distance is larger than the contact breaking threshold, it will be removed after one frame.
 | 
			
		||||
    //    If the distance is larger than the contact processing threshold, the constraint solver will ignore it.
 | 
			
		||||
 | 
			
		||||
    //    This is separate/independent from the collision margin. The collision margin increases the object a bit
 | 
			
		||||
    //    to improve collision detection performance and accuracy.
 | 
			
		||||
    // ===================
 | 
			
		||||
    // From: 
 | 
			
		||||
 | 
			
		||||
    // Level of Detail values kept as float because that's what the Meshmerizer wants
 | 
			
		||||
    public static float MeshLOD { get; private set; }
 | 
			
		||||
    public static float MeshCircularLOD { get; private set; }
 | 
			
		||||
| 
						 | 
				
			
			@ -77,6 +91,7 @@ public static class BSParam
 | 
			
		|||
    public static float TerrainFriction { get; private set; }
 | 
			
		||||
    public static float TerrainHitFraction { get; private set; }
 | 
			
		||||
    public static float TerrainRestitution { get; private set; }
 | 
			
		||||
    public static float TerrainContactProcessingThreshold { get; private set; }
 | 
			
		||||
    public static float TerrainCollisionMargin { get; private set; }
 | 
			
		||||
 | 
			
		||||
    public static float DefaultFriction { get; private set; }
 | 
			
		||||
| 
						 | 
				
			
			@ -458,6 +473,10 @@ public static class BSParam
 | 
			
		|||
            0f,
 | 
			
		||||
            (s) => { return TerrainRestitution; },
 | 
			
		||||
            (s,v) => { TerrainRestitution = v;  /* TODO: set on real terrain */ } ),
 | 
			
		||||
        new ParameterDefn<float>("TerrainContactProcessingThreshold", "Distance from terrain to stop processing collisions" ,
 | 
			
		||||
            0.0f,
 | 
			
		||||
            (s) => { return TerrainContactProcessingThreshold; },
 | 
			
		||||
            (s,v) => { TerrainContactProcessingThreshold = v;  /* TODO: set on real terrain */ } ),
 | 
			
		||||
        new ParameterDefn<float>("TerrainCollisionMargin", "Margin where collision checking starts" ,
 | 
			
		||||
            0.08f,
 | 
			
		||||
            (s) => { return TerrainCollisionMargin; },
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -947,9 +947,9 @@ public class BSPrim : BSPhysObject
 | 
			
		|||
            ZeroMotion(true);
 | 
			
		||||
 | 
			
		||||
            // Set various physical properties so other object interact properly
 | 
			
		||||
            MaterialAttributes matAttrib = BSMaterials.GetAttributes(Material, false);
 | 
			
		||||
            PhysicsScene.PE.SetFriction(PhysBody, Friction);
 | 
			
		||||
            PhysicsScene.PE.SetRestitution(PhysBody, Restitution);
 | 
			
		||||
            PhysicsScene.PE.SetContactProcessingThreshold(PhysBody, BSParam.ContactProcessingThreshold);
 | 
			
		||||
 | 
			
		||||
            // Mass is zero which disables a bunch of physics stuff in Bullet
 | 
			
		||||
            UpdatePhysicalMassProperties(0f, false);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -263,6 +263,7 @@ public sealed class BSTerrainManager : IDisposable
 | 
			
		|||
 | 
			
		||||
                if (MegaRegionParentPhysicsScene == null)
 | 
			
		||||
                {
 | 
			
		||||
                    // This terrain is not part of the mega-region scheme. Create vanilla terrain.
 | 
			
		||||
                    BSTerrainPhys newTerrainPhys = BuildPhysicalTerrain(terrainRegionBase, id, heightMap, minCoords, maxCoords);
 | 
			
		||||
                    m_terrains.Add(terrainRegionBase, newTerrainPhys);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -112,11 +112,13 @@ public sealed class BSTerrainMesh : BSTerrainPhys
 | 
			
		|||
            // Something is very messed up and a crash is in our future.
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        physicsScene.PE.SetShapeCollisionMargin(m_terrainShape, BSParam.TerrainCollisionMargin);
 | 
			
		||||
 | 
			
		||||
        // Set current terrain attributes
 | 
			
		||||
        PhysicsScene.PE.SetFriction(m_terrainBody, BSParam.TerrainFriction);
 | 
			
		||||
        PhysicsScene.PE.SetHitFraction(m_terrainBody, BSParam.TerrainHitFraction);
 | 
			
		||||
        PhysicsScene.PE.SetRestitution(m_terrainBody, BSParam.TerrainRestitution);
 | 
			
		||||
        PhysicsScene.PE.SetContactProcessingThreshold(m_terrainBody, BSParam.TerrainContactProcessingThreshold);
 | 
			
		||||
        PhysicsScene.PE.SetCollisionFlags(m_terrainBody, CollisionFlags.CF_STATIC_OBJECT);
 | 
			
		||||
 | 
			
		||||
        // Static objects are not very massive.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue