/// <summary> /// Detecta la intersección entre una caja y un plano /// </summary> /// <param name="box">Caja</param> /// <param name="normal">Normal del plano</param> /// <param name="d">Distancia del plano</param> /// <returns>Devuelve verdadero si hay intersección</returns> public static bool BoxAndPlane(CollisionBox box, Vector3 normal, float d) { // Proyectar la caja sobre la normal del plano float projectedBox = box.ProyectToVector(normal); // Obtener la distancia del centro de la caja al plano sobre la normal float boxDistance = Vector3.Dot(normal, box.Position) - projectedBox; // Si la distancia es menor a d, hay intersección return(boxDistance <= d); }
/// <summary> /// Obtiene si hay superposición de las cajas sobre el eje especificado /// </summary> /// <param name="one">Caja primera</param> /// <param name="two">Caja segunda</param> /// <param name="axis">Eje</param> /// <param name="toCentre">Vector de separación entre centros</param> /// <returns>Devuelve verdadero si hay superposición</returns> private static bool OverlapOnAxis(CollisionBox one, CollisionBox two, Vector3 axis, Vector3 toCentre) { // Proyectar las extensiones sobre el eje float oneProject = one.ProyectToVector(axis); float twoProject = two.ProyectToVector(axis); // Projectar el vector entre los centros en el eje float distance = Math.Abs(Vector3.Dot(toCentre, axis)); // Si la distancia entre centros es mayor que la suma de las proyecciones, no hay intersección return(distance < oneProject + twoProject); }
/// <summary> /// Obtiene la penetración de las proyecciones de las cajas en el eje especificado /// </summary> /// <param name="one">Caja uno</param> /// <param name="two">Caja dos</param> /// <param name="axis">Eje</param> /// <param name="toCentre">Distancia entre centros</param> /// <returns>Devuelve la penetración de las proyecciones de las cajas sobre el eje.</returns> private static float PenetrationOnAxis(CollisionBox box, Triangle tri, Vector3 edge, Vector3 toCentre) { // Proyectar las extensiones de cada caja sobre el eje float oneProject = box.ProyectToVector(edge); float twoProject = tri.ProyectToVector(edge); // Obtener la distancia entre centros de las cajas sobre el eje float distance = Convert.ToSingle(Math.Abs(Vector3.Dot(toCentre, edge))); // Positivo indica solapamiento, negativo separación return(oneProject + twoProject - distance); }