import bpy from mathutils.bvhtree import BVHTree O = bpy.data.objects bpy.context.view_layer.update() def tri(o): me = o.data; me.calc_loop_triangles(); M = o.matrix_world vs = [M @ v.co for v in me.vertices]; ts = [tuple(t.vertices) for t in me.loop_triangles] return BVHTree.FromPolygons(vs, ts), vs, ts, [me.materials[t.material_index].name for t in me.loop_triangles] H = tri(O["SM_Remora_Hull"]) for n in ("SM_Remora_HatchLid", "SM_Remora_Rotor.Port", "SM_Remora_Drill"): m = tri(O[n]) ov = m[0].overlap(H[0]) seen = set() print("==", n, len(ov)) for a, b in ov[:400]: ca = sum((m[1][i] for i in m[2][a]), m[1][0] * 0) / 3 cb = sum((H[1][i] for i in H[2][b]), H[1][0] * 0) / 3 key = (m[3][a], H[3][b], tuple(round(c, 2) for c in cb)) if key in seen: continue seen.add(key) if len(seen) <= 6: print(" mover", m[3][a], tuple(round(c, 3) for c in ca), "| static", H[3][b], tuple(round(c, 3) for c in cb))