Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Intersect liefert auch bei weit entfernten Objekten true
Alphawolf1988
myCSharp.de - Member



Dabei seit:
Beiträge: 68

Themenstarter:

Intersect liefert auch bei weit entfernten Objekten true

beantworten | zitieren | melden

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!
private Nachricht | Beiträge des Benutzers
MrSparkle
myCSharp.de - Team

Avatar #avatar-2159.gif


Dabei seit:
Beiträge: 5.655
Herkunft: Leipzig

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Alphawolf1988
myCSharp.de - Member



Dabei seit:
Beiträge: 68

Themenstarter:

beantworten | zitieren | melden

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!
private Nachricht | Beiträge des Benutzers
MrSparkle
myCSharp.de - Team

Avatar #avatar-2159.gif


Dabei seit:
Beiträge: 5.655
Herkunft: Leipzig

beantworten | zitieren | melden

Oops... Tja, sowas sollte eigentlich in der Doku stehen.
Weeks of programming can save you hours of planning
private Nachricht | Beiträge des Benutzers