Containment Test zwischen AABB und Sphere



  • Das letztere wird wohl nicht funktionieren. Man stelle sich (allein zweidimensional) das folgend vor. Ein Punkt (ob Min oder Max ist ja egal) liegt am linken Rand der Kugel, allerdings immer noch innen drin. Der andere Punkt liegt am unteren Rand (ebenfalls noch in der Kugel). Konstruiert man jetzt aus den beiden Punkten (die ja innerhalb des AABB) liegen ein Rechteck dann liegt eine Ecke schonmal nicht in der Kugel. Die Idee mit dem Zwei-Punkte-Test hatte ich nämlich auch, aber das kam mir schon spanisch vor - es war einfach "zu" einfach.

    cya
    liquid



  • Hi,

    nein es ist nicht egal ob Min/Max Punkte oder nicht. Wenn man den minimum und den maximum Punkt verwendet und beide innerhalb der Kugel liegen dann liegt auch die AABB innerhalb der Kugel. Auch wenn es sehr einfach ist, immerhin sind das ja nur eine Kugel und eine AABB die man gerade deshalb verwendet weil alles so einfach ist 😃

    Dein Beispiel mit dem "Punkt am linken Rand" hat den Denkfehler, dass man nur Eckpunkte der Box verwenden darf, keine beliebigen Punkte auf den Kanten der Box.

    Ciao,
    Stefan



  • LiquidAcid schrieb:

    Allerdings gefällt mir daran nicht, dass man zur Berechnung der umschliessenden Kugel die Länge der AABB Diagonale berechnen muss (die Quadratwurzel) - irgendwelche Vorschläge?

    Muss man das denn wirklich? Ich glaube nicht.

    Aber ich glaube dies funktioniert nicht.

    Bye, TGGC \-/



  • Ich hab mal was kleines gemalt (mit meinen bescheidenen PSP Kenntnissen, könnt ruhig lachen :D)

    Link

    Sieht das in 3D dann wieder ganz anders aus? Oder bin ich jetzt ganz auf dem Holzweg??

    cya
    liquid



  • Erstmal: haha! 😎

    Na aber selbstverständlich funktioniert es mit nur 2 Extrempunkten nicht. Da musst du schon alle 8 testen. Wüsste aber nicht, ob es noch eleganter geht.

    Bye, TGGC \-/



  • @Stefan: Wie genau meintest du es denn jetzt? Dass man nur die Extrempunkte (zwei Stück) testen muss, oder anders? Mit den Extrempunkten geht es ja nun (gut ersichtlich) nicht.

    @TGGC: Wie willst du denn sonst den Radius der umschliessenden Kugel berechnen, ohne die Länge der Diagonale zu berechnen?

    Ich hatte mir schon folgendes gedacht:

    Man vergleicht ja den quadrierten Mittelpunktabstand der beiden Kugeln (beim Sphere-Sphere Containment Test) mit dem ebenfalls quadrierten Wert der Radiendifferenz. Dachte dort könnte man irgendwie ansetzen. Aber (a - b)^2 = a^2 - 2ab + b^2 wenn mich meine Mathekenntnisse nicht täuschen. Da hätte man ja die beiden quadrierten Radien aber auch die nicht-quadrierten Werte. Hätte man nur die quadrierten Werte wärs ja einfach, da man sich das Wurzelziehen beim Berechnen der Diagonallänge sparen könnte und einfach auf die quadrierte Länge zurückgreifen könnte. Aber geht ja leider nicht so einfach. *Herrn Binomi eine hauen könnte* *gg*

    Jetzt müsste ich wahrscheinlich benchen was schneller geht. Das Testen ob alle 8 Punkte des AABB in der Kugel liegen, oder konstruiere ich doch lieber die Boundingsphere des AABB. Wobei mir das mit der Boundingsphere doch lieber ist.

    cya
    liquid



  • Wie gesagt, diese Methode liefert ohnehin falsche Ergebnisse. Daher eigentlich unnötig sich damit genauer zu beschäftigen.

    Aber ist es nicht so:

    r1 > r2 + d(r1,r2)
    gilt für positive Zahlen genau dann wenn
    r1^2 > r2^2 + d(M1,M2)^2

    Bye, TGGC \-/



  • Hi,

    stimmt mit zwei Punkten geht es nicht. 😞 Der Sphere-Sphere Test dürfte schneller sein, wenn man die Konstruktion der Sphere schnell erledigt oder deren Radius beispielsweise mit der AABB vorberechnet und speichert 😃

    Ciao,
    Stefan



  • TGGC schrieb:

    Wie gesagt, diese Methode liefert ohnehin falsche Ergebnisse. Daher eigentlich unnötig sich damit genauer zu beschäftigen.

    Welche Method meinst du jetzt? Die mit dem Testen der Min und Max Vektoren? Die habe ich ohnehin schon verworfen. Es geht jetzt nur um die Berechnung der "enclosing sphere" des AABB. Und für diese brauche ich einen Radius der sich aus der Diagonalen des AABB berechnet

    TGGC schrieb:

    Aber ist es nicht so:

    r1 > r2 + d(r1,r2)
    gilt für positive Zahlen genau dann wenn
    r1^2 > r2^2 + d(M1,M2)^2

    Ich sehe jetzt keine Möglichkeit das bei mir anzuwenden. Hilfst du mir auf die Sprünge?

    @Stefan: Diesen (prinzipiell kleinen, aber dennoch vorhandenen) Overhead würde ich gerne vermeiden. Wenn es jetzt wirklich eine Möglichkeit gäbe den Vergleich ohne die Kenntnis des einfachen Radius durchzuführen wäre das wahrscheinlich die beste Möglichkeit. Vielleicht kann TGCC ja noch ein paar Informationen zu seinen Überlegungen rausrücken.

    cya
    liquid

    EDIT:
    x <= (r^2 + b^2 - 2*r*b)
    x : quadrierter Abstand zwischen den Mittelpunkten
    r : Radius der Kugel
    b : Radius der AABB-Kugel

    Wann ist der Ausdruck falsch, wann wahr - möglichst nur mit dem Wissen der quadrierten Werte (x, r^2 und b^2).



  • r^2 >= r falls r >= 1.0 || r <= 0
    b^2 >= b falls b >= 1.0 || b <= 0

    🤡 👍



  • Deine Methode "enclosing sphere des AABB" liefert falsche Ergebnisse.

    Ist denn die Bedingung, das Kugel 2 vollständig in Kugel 1 liegt, nicht die oben genannte: Radius 1 ist größer als Radius 2 plus Abstand der Mittelpunkte? Das kann man wie gezeigt ohne Wurzel machen.

    Und noch das andere:

    x <= r^2 + b^2 - 2*r*b
        x - r^2 - b^2 <= 2*r*b
    (x - r^2 - b^2)^2 <= (2*r*b)^2
    (x - r^2 - b^2)^2 <= 2^2 * r^2 * b^2
    

    Ich glaub ich weiss jetzt, warum unbedingt sqrt optimiert werden soll. 😎

    Bye, TGGC \-/



  • Sgt. Nukem schrieb:

    r^2 >= r falls r >= 1.0 || r <= 0
    b^2 >= b falls b >= 1.0 || b <= 0

    OK, das ist selbstverständlich logisch.

    TGGC schrieb:

    Deine Methode "enclosing sphere des AABB" liefert falsche Ergebnisse.

    Kannst du das bitte genauer begründen? Liegt es daran, dass die Kugel die den AABB umschließt größer ist (von Volumen her) als der AABB selbst? Daran habe ich nämlich auch schon gedacht, aber dann dürfte der Test den ich für Sphere in AABB ausgetüftelt habe ja auch nicht gelten (da der "virtuelle" AABB um die innere Kugel ja auch größer ist als die Kugel selbst). Ich stehe ein wenig auf dem Schlauch, merkste sicherlich 😉
    Oder ist der Algo des Sphere-Sphere Containment Test falsch und ich habe eine völlig falsche Ausgangslage?

    TGGC schrieb:

    Ist denn die Bedingung, das Kugel 2 vollständig in Kugel 1 liegt, nicht die oben genannte: Radius 1 ist größer als Radius 2 plus Abstand der Mittelpunkte? Das kann man wie gezeigt ohne Wurzel machen.

    Ich poste am besten mal meinen Code für den Sphere-Sphere Containment Test. Kannst du dir ja mal angucken und falls der ansich schon falsch ist mir sagen:

    const bool basic_sphere::intersect(const basic_sphere& s) const
    {
    	const basic_vector centerDiff(s.center - this->center);
    
    	return (centerDiff.sqLength() <= _SQ(this->radius + s.radius));
    }
    

    TGGC schrieb:

    Und noch das andere:

    x <= r^2 + b^2 - 2*r*b
        x - r^2 - b^2 <= 2*r*b
    (x - r^2 - b^2)^2 <= (2*r*b)^2
    (x - r^2 - b^2)^2 <= 2^2 * r^2 * b^2
    

    Jo vielen Dank, ist mir ja eigentlich schon peinlich, dass ich diese simple Umstellung nicht selber hinbekommen hab.

    cya
    liquid



  • Na ich hab auch ein Minus veschlampt...

    Bye, TGGC \-/



  • Na, das wird ja sowieso wegquadriert.



  • Wegen dem Fehler:
    Das die Sphere größer ist, als die AABB ist keine hinreichende Bedingung, das ein Fehler entsteht, aber eine notwendige. Ich kann dir den Fehler beweisen (durch ein Beispiel). Aber das es andersrum immer funktioniert ist schwieriger zu beweisen, das lasse ich.

    Wegen dem Test:
    Ist doch genau das gleiche, was ich sagte, nur umgeformt.

    Bye, TGGC \-/



  • TGGC schrieb:

    Wegen dem Fehler:
    Das die Sphere größer ist, als die AABB ist keine hinreichende Bedingung, das ein Fehler entsteht, aber eine notwendige. Ich kann dir den Fehler beweisen (durch ein Beispiel). Aber das es andersrum immer funktioniert ist schwieriger zu beweisen, das lasse ich.

    Ich wäre durchaus an beiden interessiert.

    TGGC schrieb:

    Wegen dem Test:
    Ist doch genau das gleiche, was ich sagte, nur umgeformt.

    OK, gut - dann wär das ja schonmal geklärt.

    cya
    liquid



  • @TGGC: Meine Frage besteht weiterhin. Außerdem warte ich noch auf deinen Beweis (oder auch Beispiel).

    cya
    liquid



  • Ohh sorry, das hab ich echt verzockt. Ich schaue immer nur die Beiträge oben mit neuen Sachen an, und hab das wohl übersehen oder so. *duck*

    Aber kommt jetzt auf jeden Fall (morgen früh oder so...)

    Bye, TGGC \-/



  • Thx schonmal im voraus, wär mir echt wichtig.

    cya
    liquid



  • Also erstmal das Beispiel:
    Wir haben einen Quader mit Mittelpunkt bei (1;0;0), die Kantenlängen seien (2;10;2). Eine Kugel mit Mittelpunkt (0;0;0) und Radius sqrt( 2^2 + 5^2 + 1^2 ) umschliesst diesen Quader. Dies kannst du einfach nachprüfen, indem du alle acht Ecken überprüfst. Die Kugel um diesen Quader hätte den Radius sqrt( 1^2 + 5^2+ 1^2 ). Es ist leicht einzusehen, der Punkt mit der höchsten X-Koordinate der Kugel ist ( 1 + sqrt( 1^2 + 5^2+ 1^2 ), 0, 0 ). Dieser Punkt hat zu (0;0;0) den Abstand 1 + sqrt( 1^2 + 5^2+ 1^2 ) und liegt so außerhalb der ersten Kugel.

    Bei dem anderen, kann ich dir evtl. einen Denkanstoß für den Beweis geben. Wenn deine Kugel gerade noch in der AABB ist und sie berührt, so geschieht dies an einem von 6 Punkten (oben/unten/links/rechts/hinten/vorn), dort ergeben sich 6 Tangentialebenen. Die AABB liegt "innerhalb" dieser Tangentialebenen, fügt also keine Punkte hinzu, die beim Berühren der Kugel schon ausserhalb sind.

    Bye, TGGC \-/


Anmelden zum Antworten