private List <CollisionPointStructure> SoftBodyCollisionStep( ISoftShape softShapeA, ISoftShape softShapeB) { var result = new List <CollisionPointStructure>(); var shapeA = (IShape)softShapeA; var shapeB = (IShape)softShapeB; var convexDecompositionA = new ConvexDecompositionEngine( shapeA.AABBox, Array.ConvertAll(softShapeA.ShapePoints, item => new Vertex3Index(item.Position, item.TriangleIndex, item.ID)), softShapeA.DecompositionParameter); var convexDecompositionB = new ConvexDecompositionEngine( shapeB.AABBox, Array.ConvertAll(softShapeB.ShapePoints, item => new Vertex3Index(item.Position, item.TriangleIndex, item.ID)), softShapeB.DecompositionParameter); List <ShapeDecompositionOutput> decompConvexShapeA = convexDecompositionA.Execute().GetConvexShapeList(true); List <ShapeDecompositionOutput> decompConvexShapeB = convexDecompositionB.Execute().GetConvexShapeList(true); AABB[][] boxCollision = new AABB[2][]; boxCollision[0] = Array.ConvertAll(decompConvexShapeA.ToArray(), x => x.Region); boxCollision[1] = Array.ConvertAll(decompConvexShapeB.ToArray(), x => x.Region); List <CollisionPair> collisionPair = broadPhaseCollisionEngine.Execute( boxCollision[0], boxCollision[1], parameters.CollisionDistance); var lockMe = new object(); Parallel.ForEach( collisionPair, new ParallelOptions { MaxDegreeOfParallelism = parameters.MaxThreadNumber }, pair => { CollisionPointStructure collisionPointStruct = SoftBodyNarrowPhase( decompConvexShapeA[pair.objectIndexA], decompConvexShapeB[pair.objectIndexB], shapeA.ID, shapeB.ID); if (collisionPointStruct != null) { lock (lockMe) { result.Add(collisionPointStruct); } } }); return(result); }
/// <summary> /// Rigid Body Collision Detection for CompoundShape and ConvexShape /// </summary> /// <param name="A"></param> /// <param name="B"></param> /// <returns></returns> private List <CollisionPointStructure> RigidBodyCollisionStep( IShape A, IShape B, double collisionDistance) { List <CollisionPointStructure> collisionPointStructure = new List <CollisionPointStructure>(); IGeometry[] geometryA = ShapeDefinition.Helper.GetGeometry(A); IGeometry[] geometryB = ShapeDefinition.Helper.GetGeometry(B); List <CollisionPair> collisionPair = CheckGeometryAABB( geometryA, geometryB); if (collisionPair.Count > 0) { var verticesA = Helper.GetVertexPosition(A); var verticesB = Helper.GetVertexPosition(B); VertexProperties[] vertexObjA = null; VertexProperties[] vertexObjB = null; if (A is ConvexShape) { vertexObjA = Helper.SetVertexPosition(geometryA[0], verticesA); } if (B is ConvexShape) { vertexObjB = Helper.SetVertexPosition(geometryB[0], verticesB); } foreach (var collidingPair in collisionPair) { if (!(A is ConvexShape)) { vertexObjA = Helper.SetVertexPosition(geometryA[collidingPair.objectIndexA], verticesA); } if (!(B is ConvexShape)) { vertexObjB = Helper.SetVertexPosition(geometryB[collidingPair.objectIndexB], verticesB); } CollisionPointStructure collision = convexBodyNarrowPhase.Execute(vertexObjA, vertexObjB, A.ID, B.ID, collisionDistance); if (collision != null) { collisionPointStructure.Add(collision); } } } return(collisionPointStructure); }
public CollisionPointStructure Execute( IShape shapeA, IShape shapeB, double collisionDistance) { CollisionPointStructure collisionPointStruct = ExecuteNarrowPhase( shapeA, shapeB, collisionDistance); return(collisionPointStruct); }
public List <CollisionPointStructure> Execute( IShape[] shapes, List <CollisionPair> collisionPairs, double collisionDistance) { var result = new List <CollisionPointStructure>(); foreach (var pair in collisionPairs) { CollisionPointStructure collisionPointStruct = ExecuteNarrowPhase( shapes[pair.objectIndexA], shapes[pair.objectIndexB], collisionDistance); if (collisionPointStruct != null) { result.Add(collisionPointStruct); } } return(result); }