static BaseModel() { CollisionGroup.DefineCollisionRule(kinematicGroup, machineGroup, CollisionRule.NoBroadPhase); CollisionGroup.DefineCollisionRule(kinematicGroup, tubeGroup, CollisionRule.NoBroadPhase); CollisionGroup.DefineCollisionRule(machineGroup, tubeGroup, CollisionRule.NoBroadPhase); CollisionGroup.DefineCollisionRule(kinematicGroup, kinematicGroup, CollisionRule.NoBroadPhase); CollisionGroup.DefineCollisionRule(machineGroup, machineGroup, CollisionRule.NoBroadPhase); CollisionGroup.DefineCollisionRule(tubeGroup, tubeGroup, CollisionRule.NoBroadPhase); CollisionGroup.DefineCollisionRule(noSolverGroupL, noSolverGroupB, CollisionRule.NoSolver); CollisionGroup.DefineCollisionRule(noSolverGroupL, tubeGroup, CollisionRule.NoBroadPhase); CollisionGroup.DefineCollisionRule(noSolverGroupL, kinematicGroup, CollisionRule.NoBroadPhase); CollisionGroup.DefineCollisionRule(noSolverGroupL, machineGroup, CollisionRule.NoBroadPhase); MaterialManager.MaterialInteractions.Add(new MaterialPair { MaterialA = tubeMaterial, MaterialB = boxMaterial }, delegate(Material a, Material b, out InteractionProperties properties) { properties = new InteractionProperties { StaticFriction = 0.62f, KineticFriction = 0.62f, Bounciness = 0 }; }); MaterialManager.MaterialInteractions.Add(new MaterialPair { MaterialA = boxMaterial, MaterialB = machineMaterial }, delegate(Material a, Material b, out InteractionProperties properties) { properties = new InteractionProperties { StaticFriction = 0.001f, KineticFriction = 0.001f, Bounciness = 0 }; }); }
/// <summary> /// Updates the material interaction properties of the pair handler's constraint. /// </summary> /// <param name="properties">Properties to use.</param> public override void UpdateMaterialProperties(InteractionProperties properties) { foreach (var pairHandler in subPairs.Values) { pairHandler.UpdateMaterialProperties(properties); } }
/// <summary> /// Blender used to combine materials into a pair's interaction properties. /// </summary> /// <param name="a">Material associated with the first object to blend.</param> /// <param name="b">Material associated with the second object to blend.</param> /// <param name="properties">Blended material values.</param> public static void DefaultMaterialBlender(Material a, Material b, out InteractionProperties properties) { properties = new InteractionProperties { Bounciness = a.bounciness * b.bounciness, KineticFriction = a.kineticFriction * b.kineticFriction, StaticFriction = a.staticFriction * b.staticFriction }; }
///<summary> /// Computes the interaction properties between two materials. ///</summary> ///<param name="materialA">First material of the pair.</param> ///<param name="materialB">Second material of the pair.</param> ///<param name="properties">Interaction properties between two materials.</param> public static void GetInteractionProperties(Material materialA, Material materialB, out InteractionProperties properties) { MaterialBlender specialBlender; if (MaterialInteractions.TryGetValue(new MaterialPair(materialA, materialB), out specialBlender)) specialBlender(materialA, materialB, out properties); else MaterialBlender(materialA, materialB, out properties); }
///<summary> /// Computes the interaction properties between two materials. ///</summary> ///<param name="materialA">First material of the pair.</param> ///<param name="materialB">Second material of the pair.</param> ///<param name="properties">Interaction properties between two materials.</param> public static void GetInteractionProperties(Material materialA, Material materialB, out InteractionProperties properties) { if (MaterialInteractions.TryGetValue(new MaterialPair(materialA, materialB), out properties)) { return; } properties = new InteractionProperties(); properties.StaticFriction = FrictionBlender(materialA.staticFriction, materialB.staticFriction, null); properties.KineticFriction = FrictionBlender(materialA.kineticFriction, materialB.kineticFriction, null); properties.Bounciness = BouncinessBlender(materialA.bounciness, materialB.bounciness, null); }
/// <summary> /// Updates the material interaction properties of the pair handler's constraint. /// </summary> /// <param name="properties">Properties to use.</param> public override void UpdateMaterialProperties(InteractionProperties properties) { ContactConstraint.MaterialInteraction = properties; }
///<summary> /// Forces an update of the pair's material properties. ///</summary> /// <param name="properties">Properties to use in the collision.</param> public abstract void UpdateMaterialProperties(InteractionProperties properties);