Einheitenbewegung - Objekten ausweichen
-
Hi!
Umgebung: Weltall.
Ich plane beim Setzen eines Zielpunktes für einheiten, direkt zu berechnen, welche Statischen Hindernisse in direkter Luftlinie sind, um ausfallpunkte zu setzen. sprich eine abfolge von einigen Wegpunkten zu generieren die dann nach und nach abgeflogen werden.
dazu müsste ich aber den weg abtasten... und das ist bei einer großen entfernung ziemlich aufwendig denke ich... z.b. Distanz 100.000 sind wenn ich jeden 2ten Klick (10pix) immernoch 10.000 schleifen für den ersten durchgang...
gibt es andere bessere ansätze?
-
Wieso genau meinst du was abtasten zu müssen?
-
naja der plan war jetzt die richtung der einheit zu nehmen. und 10er schritte zu geben und zu prüfen ob an den punkten die mindestentfernung zu einem objekt unterschritten wird.
ich hab leider sonst keine andere idee wie man das machen könnte..
-
Wie wärs mit Ausrechnen wo genau die Mindestentfernung zum Objekt unterschritten wird? Z.B. indem du einen Strahl durch die Szene schikst
-
ja aber das ist doch das was ich mein oder?
ich taste nur nicht jeden pixel auf diesem strich ab, sondern jeden 10. um wenigstens einigermaßen leistung zu spaaren.oder gibts eine magic funktion die anfangs und endkoodrinaten bekommt und mir sagt wo die erste kollision ist?^^
-
Ich mein ja eben nicht abtasten sondern ausrechnen. So eine "magic funktion" musst du eben selbst schreiben.
-
ja aber wie überprüfst du ob irgendwas die linie berührt? außer jeden punkt der linie zu nehmen um von da aus distanzen zu statischen objekten abzufragen?^^
auf dem papier ist die lösung ganz leicht^^ aber wie mach ich daraus eine rechenfreundliche funktion?^^
-
Na was für Körper sind denn die Hindernisse? Kugeln? Dreiecksnetze? Würfel?
-
naja ich denke das punkte mit einem radius von X schon reichen.
ist nicht so wichtig was für formen das sind.
planeten, stationen,.. gasfelder etc.. wobei die gasfelder irgendwie anders geregelt werden.
-
Na dann suchst du also einfach nur den Schnittpunkt zwischen einer Linie und einer Kugel: http://en.wikipedia.org/wiki/Line–sphere_intersection
-
ich merk schon^^
analysis lässt mich auch hier nicht verschontdanke das bringt mir einen ganz neuen ansatz!^^
-
das prinzip ist ja zwei funktionen gleich zu setzen und lösen zu lassen. wie genau man das programmiert krieg ich sicher irgendwie raus.
aber wie stellst du die funktion schwieriger formen auf?einen kreis kann man ja halbieren, f(x) für die obere hälfte des kreises und g(x) für die untere hälfte. (funktionen können ja max 1 x wert haben).
aber wie machst du das mit einer random form? z.b. ein stern? einfach N funktionen generieren?und würdest du die gerade zum testen mit allen statischen Objekten gleich setzen und lösen lassen? oder wie würdest du das eingrenzen, dass er nur objekte prüft die in etwa auf dem weg liegen könnten.
-
Statt alles selbst zu berechnen, könntest du auch auf bestehende Implementierungen zurückgreifen. Boost.Geometry sieht sehr vielversprechend aus, wenn auch die API aufgrund der Generizität etwas komplex ist. Ich muss mir diese Bibliothek unbedingt mal im Detail anschauen...
-
cl90 schrieb:
das prinzip ist ja zwei funktionen gleich zu setzen und lösen zu lassen.
Nicht lösen lassen sondern selbst auflösen um eine Formel für den Schnittpunkt zu bekommen.
Und die kannst du dann in dein Programm klopfencl90 schrieb:
aber wie stellst du die funktion schwieriger formen auf?
Das hängt von den Formen ab.
cl90 schrieb:
aber wie machst du das mit einer random form? z.b. ein stern? einfach N funktionen generieren?
Du könntest deinen Stern z.B. mal ganz einfach als einen Haufen Linien betrachten.
cl90 schrieb:
oder wie würdest du das eingrenzen, dass er nur objekte prüft die in etwa auf dem weg liegen könnten.
Das wäre ab einer gewissen Anzahl an Objekten vermutlich sinnvoll.
Nexus schrieb:
Statt alles selbst zu berechnen, könntest du auch auf bestehende Implementierungen zurückgreifen.
Prinzipiell hast du recht, aber einen Strahl/Kreis Schnittpunkttest kann man ruhig mal selbst machen. Ich denk dass das sehr sehr lehrreich für ihn wäre
-
cl90 schrieb:
analysis lässt mich auch hier nicht verschont
Keine Panik, das ist nur Geometrie :). Du kannst schon sehr gut durch eine Skizze heraus kriegen, wie das funktioniert.
aber wie machst du das mit einer random form? z.b. ein stern? einfach N funktionen generieren?
Du kannst keine echt zufälligen Formen analytisch exakt berechnen. Am PC hast du eh nur Dreiecke, um Objekte aufzubauen . Hmm...Schnitt Dreieck-Strahl klingt doch schonmal vielversprechend, oder? Bleib aber erst mal bei der Kugel, Dreiecke sind ekelhaft :).
und würdest du die gerade zum testen mit allen statischen Objekten gleich setzen und lösen lassen? oder wie würdest du das eingrenzen, dass er nur objekte prüft die in etwa auf dem weg liegen könnten.
Du könntest dein Spielgebiet in kleine Unterabschnitte aufteilen und dann zuerst testen, durch welche Unterabschnitte der Strahl geht. Wenn du ein richtig großes Spielfeld hast dann fasst du die Unterabschnitte wieder in größere Einheiten zusammen und testest die, bevor du die kleineren Testest.
Wie man das macht ist eine kleine Kunst. Belaste dich damit erst mal nicht, solange du nicht mal weißt, wie das mit der Kugel funktioniert. Und belaste dich damit generell erst, sobald du merkst, dass die Anzahl der Objekte zu groß wird.
-
danke.
es waren eine menge gute tips hier.
ich hab jetzt eine andere lösung gefunden. in der ich pro objekt nur 10 berechnungen brauche.
ich projeziere den vektor zum objekt auf den vektor zum ziel, und prüfe ob die gegenkathete des dreiecks die mindestreichweite unterschreitet^^sehr rechenspaarsam.