Jump to content
Unity Insider Forum

Bounding Boxen dynamisch bestimmen


Hellhound

Recommended Posts

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

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;
    }
}

hvuEARx.png

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...