Laden...

Intersect liefert auch bei weit entfernten Objekten true

Erstellt von Alphawolf1988 vor 14 Jahren Letzter Beitrag vor 14 Jahren 856 Views
A
Alphawolf1988 Themenstarter:in
68 Beiträge seit 2008
vor 14 Jahren
Intersect liefert auch bei weit entfernten Objekten true

Liebe Community!

Ich bin am Ende mit meinem Latein! Ich programmiere ein Billiard Spiel und implementiere gerade eine KI. Diese soll eine beliebige Kugel aussuchen, welche vor einem Loch liegt und diese dann mit dem passenden Vektor einlochen. Vorher prüfe ich ob andere Kugeln im Weg liegen indem ich alle anderen Kugeln durchgehe und den Ray zwischen der Zielkugel und der Weißen mit deren Spheren vergleiche. Jedoch sagt er mir ständig das Kugeln im Weg liegen, obwohl diese total davon entfernt sind. Ich verzweifle noch.

Hier ein Bild:
Billiard Bild

Hier der Code, welcher prüft, ob eine Kugel sich mit
dem Ray schneidet:


private static bool RayIntersectsPhysic(Ray ray, Physic obj, bool draw)
        {
            // Sphere anlegen
            BoundingSphere sphere = new BoundingSphere(obj.Position, obj.Radius);

            // Wenn Gerade das Objekt schneidet, dann 
            // true zurückgeben
            if (sphere.Intersects(ray).HasValue)
            {
                if (draw)
                {
                    Console.WriteLine("Schnitt mit Ball: " + obj.Name + " mit Center: " + sphere.Center + " und Radius " + sphere.Radius + " und Gerade: " + ray.Position + " + r*" + ray.Direction);

                    _PushDirections.Add(new Object[] { ray.Position, ray.Direction });
                }
                return true;
            }

            // Rückgabe
            return false;

        } // RayIntersectsPhysic

Die Consolenausgaben:

Ball: 4_Purple_Full ins Loch: Loch_Mitte_Links mit Entfernungen Weiß: 98,36668 und Ball: 19,36374

Schnitt mit Ball: 13_Orange_Half mit Center: {X:80,99844 Y:0 Z:-143,9167} und Radius 5,14 und Gerade: {X:58,20702 Y:0 Z:-37,07901} + r*{X:-47,04186 Y:0 Z:-88,55208}
Schnitt mit Ball: 15_DarkRed_Half mit Center: {X:15,53928 Y:0 Z:-142,4213} und Radius 5,14 und Gerade: {X:58,20702 Y:0 Z:-37,07901} + r*{X:-47,04186 Y:0 Z:-88,55208}
Schnitt mit Ball: 9_Yellow_Half mit Center: {X:40,7805 Y:0 Z:-197,908} und Radius 5,14 und Gerade: {X:58,20702 Y:0 Z:-37,07901} + r*{X:-47,04186 Y:0 Z:-88,55208}
Schnitt mit Ball: 8_Black_Full mit Center: {X:30,82612 Y:0 Z:-182,8718} und Radius 5,14 und Gerade: {X:58,20702 Y:0 Z:-37,07901} + r*{X:-47,04186 Y:0 Z:-88,55208}
Schnitt mit Ball: 3_Red_Full mit Center: {X:51,00122 Y:0 Z:-197,7601} und Radius 5,14 und Gerade: {X:58,20702 Y:0 Z:-37,07901} + r*{X:-47,04186 Y:0 Z:-88,55208}
Schnitt mit Ball: 12_Purple_Half mit Center: {X:85,63876 Y:0 Z:-191,9071} und Radius 5,14 und Gerade: {X:58,20702 Y:0 Z:-37,07901} + r*{X:-47,04186 Y:0 Z:-88,55208}
Schnitt mit Ball: 6_Green_Full mit Center: {X:44,64568 Y:0 Z:-204,4518} und Radius 5,14 und Gerade: {X:58,20702 Y:0 Z:-37,07901} + r*{X:-47,04186 Y:0 Z:-88,55208}
Schnitt mit Ball: 7_DarkRed_Full mit Center: {X:53,85535 Y:0 Z:-103,0089} und Radius 5,14 und Gerade: {X:58,20702 Y:0 Z:-37,07901} + r*{X:-47,04186 Y:0 Z:-88,55208}
Schnitt mit Ball: 4_Purple_Full mit Center: {X:15,0396 Y:0 Z:-128,9321} und Radius 5,14 und Gerade: {X:58,20702 Y:0 Z:-37,07901} + r*{X:-47,04186 Y:0 Z:-88,55208}
Schnitt mit Ball: 11_Red_Half mit Center: {X:10,10056 Y:0 Z:-155,8602} und Radius 5,14 und Gerade: {X:58,20702 Y:0 Z:-37,07901} + r*{X:-47,04186 Y:0 Z:-88,55208}

Wer zuerst kommt malt zuerst, wer danach kommt malt drüber! 😁

5.658 Beiträge seit 2006
vor 14 Jahren

Aus deinem Bild kann ich mir leider nichts nehmen. Aber wenn ich den Code so sehe, denke ich mir, daß du zwar den Radius der einen Kugel beachtest, aber nicht den der zweiten Kugel. Dein Ray hat ja quasi keine Ausdehnung, aber deine Kugel. Als erstes würde ich aber überprüfen, ob die BoundingSphere.Intersects-Methode das richtige macht.
Christian

Weeks of programming can save you hours of planning

A
Alphawolf1988 Themenstarter:in
68 Beiträge seit 2008
vor 14 Jahren

Also, nach 18h intensiven suchen und verzweifeln, bin ich auf den Fehler gestoßen.
Ein Ray benötigt einen normalisierten Richtungsvektor!

Wenn man dem nicht nachgeht, macht XNA wie man auch sieht die tollsten sachen.
Hoffe das hilft auch zukünftigen Leuten mit Problemen. 😉

MFG Chris

Wer zuerst kommt malt zuerst, wer danach kommt malt drüber! 😁

5.658 Beiträge seit 2006
vor 14 Jahren

Oops... Tja, sowas sollte eigentlich in der Doku stehen.

Weeks of programming can save you hours of planning