/// <summary></summary> public static bool Collide(MeshCollider m1, MeshCollider m2) { Sphere s1 = new Sphere(m1.transform.position, 0); Sphere s2 = new Sphere(m2.transform.position, 0); foreach (Point pt in m1.GetVertices()) { float d = DistanceUtil.Dist(pt, s1.position); if (d > s1.radius) { s1.radius = d; } } foreach (Point pt in m2.GetVertices()) { float d = DistanceUtil.Dist(pt, s2.position); if (d > s2.radius) { s2.radius = d; } } if (!Collide(s1, s2)) { return(false); } return(DistanceUtil.Dist(m1, m2) <= 0); }
public static Plane[] GetPlanes(this MeshCollider m) { Point[] vertices = m.GetVertices(); List <Plane> planes = new List <Plane>(); for (int i = 0; i < m.sharedMesh.triangles.Length; i += 3) { int i0 = m.sharedMesh.triangles[i], i1 = m.sharedMesh.triangles[i + 1], i2 = m.sharedMesh.triangles[i + 2]; Point v0 = vertices[i0], v1 = vertices[i1], v2 = vertices[i2]; planes.Add(new Plane(v0, v1, v2)); } return(planes.ToArray()); }
/// <summary>Calcule approximativement la distance minimum entre les deux meshes. <b>Elle est basée sur la distance de chaque point par rapport à l'autre mesh.</b></summary> public static float Dist(MeshCollider m1, MeshCollider m2) { Point[] pts = m1.GetVertices(); float closestDist = Dist(m2, pts[0]); for (int i = 1; i < pts.Length; i++) { float d = Dist(m2, pts[i]); if (d < closestDist) { closestDist = d; } } foreach (Point pt in m2.GetVertices()) { float d = Dist(m1, pt); if (d < closestDist) { closestDist = d; } } return(closestDist); }
/// <summary></summary> public static bool Collide(MeshCollider m, Plane p) { return(Collide(m.GetVertices(), p)); }
/// <summary>Calcule la distance minimum entre un plan et un mesh. Si c'est nagatif, indique la hauteur du plus petit morceaux du mesh coupé par le plan.</summary> public static float Dist(MeshCollider m, Plane p) { return(Dist(m.GetVertices(), p)); }