示例#1
0
        bool SphereToSphereCollision(Entity firstEntity, ComponentColliderSphere firstCollider, Entity secondEntity, ComponentColliderSphere secondCollider)
        {
            if ((secondEntity.Transform.Position - firstEntity.Transform.Position).Length <= firstCollider.Size + secondCollider.Size)
            {
                return(true);
            }

            return(false);
        }
示例#2
0
        bool SphereToCubeCollision(Entity sphereEntity, ComponentColliderSphere sphereCollider, Entity cubeEntity, ComponentColliderCube cubeCollider)
        {
            var closestPointToCube    = sphereEntity.Transform.Position + (sphereEntity.Transform.Position - cubeEntity.Transform.Position).Normalized() * sphereCollider.Size;
            var OldClosestPointToCube = sphereEntity.Transform.OldPosition + (sphereEntity.Transform.OldPosition - cubeEntity.Transform.Position).Normalized() * sphereCollider.Size;

            var normalMov = closestPointToCube - OldClosestPointToCube;

            normalMov.Normalize();

            var movementNormal = Vector3.Cross(normalMov, new Vector3(0, 1, 0));

            var rightSide = cubeEntity.Transform.Position + cubeEntity.Transform.Right * (cubeCollider.Size.X);
            var leftSide  = cubeEntity.Transform.Position + (-cubeEntity.Transform.Right) * (cubeCollider.Size.X);

            if (SegmentToSegmentIntersection(OldClosestPointToCube, closestPointToCube, movementNormal,
                                             rightSide + cubeEntity.Transform.Forward * (cubeCollider.Size.Z),
                                             leftSide + cubeEntity.Transform.Forward * (cubeCollider.Size.Z),
                                             cubeEntity.Transform.Forward))
            {
                return(true);
            }

            if (SegmentToSegmentIntersection(OldClosestPointToCube, closestPointToCube, movementNormal,
                                             rightSide + -cubeEntity.Transform.Forward * (cubeCollider.Size.Z),
                                             leftSide + -cubeEntity.Transform.Forward * (cubeCollider.Size.Z),
                                             -cubeEntity.Transform.Forward))
            {
                return(true);
            }

            var forwardSide  = cubeEntity.Transform.Position + cubeEntity.Transform.Forward * (cubeCollider.Size.Z);
            var backwardSide = cubeEntity.Transform.Position + (-cubeEntity.Transform.Forward) * (cubeCollider.Size.Z);

            if (SegmentToSegmentIntersection(OldClosestPointToCube, closestPointToCube, movementNormal,
                                             forwardSide + cubeEntity.Transform.Right * (cubeCollider.Size.X),
                                             backwardSide + cubeEntity.Transform.Right * (cubeCollider.Size.X),
                                             cubeEntity.Transform.Right))
            {
                return(true);
            }

            if (SegmentToSegmentIntersection(OldClosestPointToCube, closestPointToCube, movementNormal,
                                             forwardSide + -cubeEntity.Transform.Right * (cubeCollider.Size.X),
                                             backwardSide + -cubeEntity.Transform.Right * (cubeCollider.Size.X),
                                             -cubeEntity.Transform.Right))
            {
                return(true);
            }

            return(false);
        }