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! 😁
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
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! 😁
Oops... Tja, sowas sollte eigentlich in der Doku stehen.
Weeks of programming can save you hours of planning