예제 #1
0
        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);
        }
예제 #2
0
        /// <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);
        }
예제 #3
0
        public CollisionPointStructure Execute(
            IShape shapeA,
            IShape shapeB,
            double collisionDistance)
        {
            CollisionPointStructure collisionPointStruct = ExecuteNarrowPhase(
                shapeA,
                shapeB,
                collisionDistance);

            return(collisionPointStruct);
        }
예제 #4
0
        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);
        }