/// <summary> /// Gibt zurück ob zwei Flächen miteinander Kollidieren können(Achtung noch keine gedrehten Flächen) /// </summary> /// <param name="p1">Fläche 1</param> /// <param name="p2">Fläche 2</param> /// <returns>Ergebnis der Kollisions</returns> public static bool Intersect(CollisionPlane p1, CollisionPlane p2) { //TODO: Erweitern auf schräge Fläche var vec = p1.normal * p2.normal; bool result = false; if (vec.X < 0) { var ry = (p2.edgepos1.Y > p1.edgepos1.Y && p2.edgepos1.Y < p1.edgepos2.Y) || (p2.edgepos2.Y <p1.edgepos2.Y && p2.edgepos2.Y> p1.edgepos1.Y) || (p1.edgepos1.Y > p2.edgepos1.Y && p1.edgepos1.Y < p2.edgepos2.Y) || (p1.edgepos2.Y <p2.edgepos2.Y && p1.edgepos2.Y> p2.edgepos1.Y); var rz = (p2.edgepos1.Z > p1.edgepos1.Z && p2.edgepos1.Z < p1.edgepos2.Z) || (p2.edgepos2.Z <p1.edgepos2.Z && p2.edgepos2.Z> p1.edgepos1.Z) || (p1.edgepos1.Z > p2.edgepos1.Z && p1.edgepos1.Z < p2.edgepos2.Z) || (p1.edgepos2.Z <p2.edgepos2.Z && p1.edgepos2.Z> p2.edgepos1.Z); result = rz && ry; } else if (vec.Y < 0) { var rx = (p2.edgepos1.X > p1.edgepos1.X && p2.edgepos1.X < p1.edgepos2.X) || (p2.edgepos2.X <p1.edgepos2.X && p2.edgepos2.X> p1.edgepos1.X) || (p1.edgepos1.X > p2.edgepos1.X && p1.edgepos1.X < p2.edgepos2.X) || (p1.edgepos2.X <p2.edgepos2.X && p1.edgepos2.X> p2.edgepos1.X); var rz = (p2.edgepos1.Z > p1.edgepos1.Z && p2.edgepos1.Z < p1.edgepos2.Z) || (p2.edgepos2.Z <p1.edgepos2.Z && p2.edgepos2.Z> p1.edgepos1.Z) || (p1.edgepos1.Z > p2.edgepos1.Z && p1.edgepos1.Z < p2.edgepos2.Z) || (p1.edgepos2.Z <p2.edgepos2.Z && p1.edgepos2.Z> p2.edgepos1.Z); result = rx && rz; } else if (vec.Z < 0) { var rx = (p2.edgepos1.X > p1.edgepos1.X && p2.edgepos1.X < p1.edgepos2.X) || (p2.edgepos2.X <p1.edgepos2.X && p2.edgepos2.X> p1.edgepos1.X) || (p1.edgepos1.X > p2.edgepos1.X && p1.edgepos1.X < p2.edgepos2.X) || (p1.edgepos2.X <p2.edgepos2.X && p1.edgepos2.X> p2.edgepos1.X); var ry = (p2.edgepos1.Y > p1.edgepos1.Y && p2.edgepos1.Y < p1.edgepos2.Y) || (p2.edgepos2.Y <p1.edgepos2.Y && p2.edgepos2.Y> p1.edgepos1.Y) || (p1.edgepos1.Y > p2.edgepos1.Y && p1.edgepos1.Y < p2.edgepos2.Y) || (p1.edgepos2.Y <p2.edgepos2.Y && p1.edgepos2.Y> p2.edgepos1.Y); result = rx && ry; } return(result); }
/// <summary> /// Gibt den Abstand zweier Flächen zurück(Mittelpunkt zu Mittelpunkt) /// </summary> /// <param name="p1">Fläche 1</param> /// <param name="p2">Fläche 2</param> /// <returns>Abstand der Flächen zueinander</returns> public static Vector3 GetDistance(CollisionPlane p1, CollisionPlane p2) { var alpha = p1.normal * p2.normal; var dvector = new Vector3(); dvector.X = alpha.X != 0 ? 1 : 0; dvector.Y = alpha.Y != 0 ? 1 : 0; dvector.Z = alpha.Z != 0 ? 1 : 0; var distance = (p1.pos - p2.pos) * dvector; return(distance); }
/// <summary> /// Gibt zurück ob zwei Flächen miteinander Kollidieren können(Achtung noch keine gedrehten Flächen) /// </summary> /// <param name="p1">Fläche 1</param> /// <param name="p2">Fläche 2</param> /// <returns>Ergebnis der Kollisions</returns> public static bool Intersect(CollisionPlane p1, CollisionPlane p2) { //TODO: Erweitern auf schräge Fläche var vec = p1.normal * p2.normal; bool result = false; if (vec.X < 0) { var ry = (p2.edgepos1.Y > p1.edgepos1.Y && p2.edgepos1.Y < p1.edgepos2.Y) || (p2.edgepos2.Y < p1.edgepos2.Y && p2.edgepos2.Y > p1.edgepos1.Y) || (p1.edgepos1.Y > p2.edgepos1.Y && p1.edgepos1.Y < p2.edgepos2.Y) || (p1.edgepos2.Y < p2.edgepos2.Y && p1.edgepos2.Y > p2.edgepos1.Y); var rz = (p2.edgepos1.Z > p1.edgepos1.Z && p2.edgepos1.Z < p1.edgepos2.Z) || (p2.edgepos2.Z < p1.edgepos2.Z && p2.edgepos2.Z > p1.edgepos1.Z) || (p1.edgepos1.Z > p2.edgepos1.Z && p1.edgepos1.Z < p2.edgepos2.Z) || (p1.edgepos2.Z < p2.edgepos2.Z && p1.edgepos2.Z > p2.edgepos1.Z); result = rz && ry; } else if (vec.Y < 0) { var rx = (p2.edgepos1.X > p1.edgepos1.X && p2.edgepos1.X < p1.edgepos2.X) || (p2.edgepos2.X < p1.edgepos2.X && p2.edgepos2.X > p1.edgepos1.X) || (p1.edgepos1.X > p2.edgepos1.X && p1.edgepos1.X < p2.edgepos2.X) || (p1.edgepos2.X < p2.edgepos2.X && p1.edgepos2.X > p2.edgepos1.X); var rz = (p2.edgepos1.Z > p1.edgepos1.Z && p2.edgepos1.Z < p1.edgepos2.Z) || (p2.edgepos2.Z < p1.edgepos2.Z && p2.edgepos2.Z > p1.edgepos1.Z) || (p1.edgepos1.Z > p2.edgepos1.Z && p1.edgepos1.Z < p2.edgepos2.Z) || (p1.edgepos2.Z < p2.edgepos2.Z && p1.edgepos2.Z > p2.edgepos1.Z); result = rx && rz; } else if (vec.Z < 0) { var rx = (p2.edgepos1.X > p1.edgepos1.X && p2.edgepos1.X < p1.edgepos2.X) || (p2.edgepos2.X < p1.edgepos2.X && p2.edgepos2.X > p1.edgepos1.X) || (p1.edgepos1.X > p2.edgepos1.X && p1.edgepos1.X < p2.edgepos2.X) || (p1.edgepos2.X < p2.edgepos2.X && p1.edgepos2.X > p2.edgepos1.X); var ry = (p2.edgepos1.Y > p1.edgepos1.Y && p2.edgepos1.Y < p1.edgepos2.Y) || (p2.edgepos2.Y < p1.edgepos2.Y && p2.edgepos2.Y > p1.edgepos1.Y) || (p1.edgepos1.Y > p2.edgepos1.Y && p1.edgepos1.Y < p2.edgepos2.Y) || (p1.edgepos2.Y < p2.edgepos2.Y && p1.edgepos2.Y > p2.edgepos1.Y); result = rx && ry; } return result; }
/// <summary> /// Gibt den Abstand zweier Flächen zurück(Mittelpunkt zu Mittelpunkt) /// </summary> /// <param name="p1">Fläche 1</param> /// <param name="p2">Fläche 2</param> /// <returns>Abstand der Flächen zueinander</returns> public static Vector3 GetDistance(CollisionPlane p1, CollisionPlane p2) { var alpha = p1.normal * p2.normal; var dvector = new Vector3(); dvector.X = alpha.X != 0 ? 1 : 0; dvector.Y = alpha.Y != 0 ? 1 : 0; dvector.Z = alpha.Z != 0 ? 1 : 0; var distance = (p1.pos - p2.pos) * dvector; return distance; }