public static bool TestOBBOBB(OBB obb1, OBB obb2) { var mink1 = Minkowski.Minkowskize_OBB_In_OBB(obb2, obb1); var x1width = obb1.HalfAxisWidth.X + mink1.HalfAxis.X; var y1width = obb1.HalfAxisWidth.Y + mink1.HalfAxis.Y; if (((Math.Abs(mink1.Position_LM.X) > x1width) || (Math.Abs(mink1.Position_LM.Y) > y1width))) { return(false ); } else { var mink2 = Minkowski.Minkowskize_OBB_In_OBB(obb1, obb2); var x2width = obb2.HalfAxisWidth.X + mink2.HalfAxis.X; var y2width = obb2.HalfAxisWidth.Y + mink2.HalfAxis.Y; return(!(((Math.Abs(mink2.Position_LM.X) > x2width) || (Math.Abs(mink2.Position_LM.Y) > y2width)))); } }
//*************************************************** //INTERSECTIONS public static bool IntersectOBBOBB(OBB obb1, OBB obb2, ref Geometry.Geometric_Queries.Distance_Query_Result result) { var mink2 = Minkowski.Minkowskize_OBB_In_OBB(obb2, obb1); var mink1 = Minkowski.Minkowskize_OBB_In_OBB(obb1, obb2); var dist_of_2_from_1 = obb1.What_Faces(mink2); var dist_of_1_from_2 = obb2.What_Faces(mink1); if (Math.Max(dist_of_1_from_2.Signed_Dist, dist_of_2_from_1.Signed_Dist) > 0) { return(false); } Minkowski_Description mink; Facing_Point_Result data; //pernoume os normal owning afto pou exei to allo pio exo bool normal_owning_first = dist_of_2_from_1.Signed_Dist > dist_of_1_from_2.Signed_Dist; var normal_owning_obb = (normal_owning_first) ? obb1 : obb2; var selected_obb = (!normal_owning_first) ? obb1 : obb2; mink = (normal_owning_first) ? mink2 : mink1; data = (normal_owning_first) ? dist_of_2_from_1 : dist_of_1_from_2; Vector3 p0; Vector3 p1; float d_0, d_1; var normal = normal_owning_obb.Normal(data.Normal_Code); OBB.Extraction_of_inner_contact_points2(normal_owning_obb, selected_obb, normal, data.Normal_Code, out p0, out p1, out d_0, out d_1); var test = p0 - p1; result = new Geometry.Geometric_Queries.Distance_Query_Result(); result.first_has_normal = normal_owning_first; result.Normal_W = normal; result.signed_distance = normal_owning_first ? dist_of_2_from_1.Signed_Dist : dist_of_1_from_2.Signed_Dist; result.double_contact = (Math.Abs(d_1 - d_0) < 0.3f); GELib.Debug.Debug_Drawing.double_edge = result.double_contact; result.Point_W_0 = p0; result.Point_W_1 = p1; return(true); }