Hellhound Geschrieben 10. Juli 2017 Melden Share Geschrieben 10. Juli 2017 Hallo zusammen, ich versuche seit einiger Zeit dynamisch im Skript auf Basis meiner Meshes die Boundingbox für ein Objekt zu bestimmen, das aus mehreren Meshes besteht. Normalerweise hätte ich über alle Vertices iteriert um das Min, Max zu bestimmen und auf der Basis die AABB erstellt mit dem Zentrum (max - min). Nun habe ich in diversen Threads gelesen, das ich die Boundaries auch über den Renderer bestimmen kann da dieser die Werte im World-Space vorhält, während die Mesh selbst die Bounds im Local-Space aufweist. Ich bestimme die Bounds aktuell wie folgt: MeshFilter[] filters = this.gameObject.GetComponentsInChildren<MeshFilter>(); Renderer[] renderers = this.GetComponentsInChildren<Renderer>(); Bounds bounds1 = new Bounds(Vector3.zero, Vector3.zero); Bounds bounds2 = new Bounds(Vector3.zero, Vector3.zero); int count = 1; foreach (Renderer renderer in renderers) { if (count == 1) { bounds1 = new Bounds(renderer.bounds.center, renderer.bounds.size); var col1 = renderer.gameObject.AddComponent<BoxCollider>(); col1.size = bounds1.size; col1.center = bounds1.center - renderer.gameObject.transform.position; } else { bounds2.Encapsulate(renderer.bounds); var col2 = renderer.gameObject.AddComponent<BoxCollider>(); col2.size = bounds2.size; col2.center = bounds2.center - renderer.gameObject.transform.position; } count++; } } Ich hätte jetzt erwartet, das die BoxCollider die ich hier erstelle auf Basis der Bounds, das Objekt abdecken. Dies ist aber nicht der Fall, die Boxen sind erheblich kleiner als das eigentliche Objekt. Ich finde irgendwie keinen Fehler ... Ich bin dankbar für jeden Tip. Gruß Hellhound BoundsTest.unitypackage Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Zer0Cool Geschrieben 10. Juli 2017 Melden Share Geschrieben 10. Juli 2017 Kannst du nicht einfach über die Boundings deiner Meshes iterieren:https://docs.unity3d.com/ScriptReference/Mesh-bounds.html und über die Funktion (untere Variante):https://docs.unity3d.com/ScriptReference/Bounds.Encapsulate.html Eine kombinierte Boundingbox erzeugen? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Zer0Cool Geschrieben 10. Juli 2017 Melden Share Geschrieben 10. Juli 2017 Ok, mit den Meshboundings geht es wohl nicht, da sie lokal angegeben sind. ich hätte mal deinen Thread genauer durchlesen sollen. Aber ich habe es dann aber mit den Renderern zum Laufen bekommen, der Kniff war bei der Initialisierung die Position des Parents anzugeben: void Start() { Bounds bounds = new Bounds(this.transform.position, Vector3.zero); Renderer[] renderers = this.GetComponentsInChildren<Renderer>(); int count = 0; foreach (Renderer renderer in renderers) { bounds.Encapsulate(renderer.bounds); Debug.Log(bounds.size); count++; } BoxCollider box = this.gameObject.AddComponent<BoxCollider>(); box.center = bounds.center - this.gameObject.transform.position; box.size = bounds.size; } } Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Hellhound Geschrieben 11. Juli 2017 Autor Melden Share Geschrieben 11. Juli 2017 Danke für den entscheidenen Hinweis. Ich war mir sicher, dass ich das bereits ausprobiert hatte. Ich glaube inzwischen, dass ich nen Cachingfehler hatte. Nachdem ich das Skript einmal entfernt und neu gebunden habe klappte es dann mit Deiner Ergänzung (vorher hatte sich der Zustand nicht verändert). Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.