/// <summary> /// Detecta la colisión entre una esfera y una lista de triángulos /// </summary> /// <param name="sphere">Esfera</param> /// <param name="triangleList">Lista de triángulos</param> /// <param name="data">Datos de la colisión</param> /// <returns>Devuelve verdadero si hay colisión, o falso en el resto de los casos</returns> private static bool SphereAndTriangleList(CollisionSphere sphere, Triangle[] triangleList, ref CollisionData data) { bool contact = false; if (data.ContactsLeft > 0) { if (triangleList != null && triangleList.Length > 0) { foreach (Triangle triangle in triangleList) { if (data.ContactsLeft > 0) { // Comprobar la intersección if (CollisionDetector.SphereAndTriangle(sphere, triangle, ref data)) { contact = true; } } else { break; } } } } return(contact); }
/// <summary> /// Detecta la colisión entre una esfera y una lista de triángulos /// </summary> /// <param name="sphere">Esfera</param> /// <param name="triangleSoup">Lista de triángulos</param> /// <param name="data">Datos de la colisión</param> /// <returns>Devuelve verdadero si hay colisión, o falso en el resto de los casos</returns> public static bool SphereAndTriangleSoup(CollisionSphere sphere, CollisionTriangleSoup triangleSoup, ref CollisionData data) { if (data.ContactsLeft <= 0) { // Si no hay más contactos disponibles se sale de la función. return(false); } foreach (Triangle triangle in triangleSoup.Triangles) { // Comprobar la intersección if (IntersectionTests.SphereAndTri(sphere, triangle, true)) { // Informar la colisión if (CollisionDetector.SphereAndHalfSpace(sphere, new CollisionPlane(triangle.Plane), ref data)) { return(true); } } } return(false); }
/// <summary> /// Detecta la colisión entre una caja y una lista de triángulos /// </summary> /// <param name="box">Caja</param> /// <param name="triangleList">Lista de triángulos</param> /// <param name="data">Datos de colisión a llenar</param> /// <returns>Devuelve verdadero si existe colisión, falso en el resto de los casos</returns> private static bool BoxAndTriangleList(CollisionBox box, Triangle[] triangleList, ref CollisionData data) { if (data.ContactsLeft <= 0) { // Si no hay más contactos disponibles se sale de la función. return(false); } bool intersection = false; if (data.ContactsLeft > 0) { int firstContact = data.ContactCount; foreach (Triangle triangle in triangleList) { // Comprobar la intersección con el triángulo if (IntersectionTests.BoxAndTri(box, triangle)) { if (data.ContactsLeft > 0) { if (CollisionDetector.BoxAndTriangle(box, triangle, ref data)) { intersection = true; } } else { break; } } } //int contactCount = data.ContactCount - firstContact; //if (intersection && contactCount > 1) //{ // //Agrupar los contactos // Vector3 contactPoint = Vector3.Zero; // Vector3 contactNormal = Vector3.Zero; // float penetration = 0f; // for (int i = firstContact; i < data.ContactCount; i++) // { // contactPoint += data.ContactArray[i].ContactPoint; // contactNormal += data.ContactArray[i].ContactNormal; // penetration += data.ContactArray[i].Penetration; // } // contactPoint /= contactCount; // contactNormal /= contactCount; // penetration /= contactCount; // Contact newContact = new Contact(); // data.ContactArray[firstContact].ContactPoint = contactPoint; // data.ContactArray[firstContact].ContactNormal = Vector3.Normalize(contactNormal); // data.ContactArray[firstContact].Penetration = penetration; // data.SetContactIndex(firstContact + 1); //} } return(intersection); }