Von Gravedigger (Gast)
Erstellt vor 17 Jahren
#27382

Benötige etwas Hilfe bei Vektorrechnung für Browsergame

Ein Hallo an alle mathematisch begabten Menschen...

Ich bin zur Zeit dabei ein Browsergame zu programmieren, in dem der User durch den Weltraum fliegt. Der Raum wird durch ein 3-dimensionales Koordinatensystem definiert und die Position des Spielers durch x, y, und z Koordinaten.

Da ich keinen wirklichen Plan von Vektorrechnung habe und meine mathematischen Kenntnisse kaum über die Grundrechenarten hinaus gehen, würde ich mich freuen, wenn mir jemand die Formeln für folgende Problemstellungen geben könnte:

1.Wie errechne ich die Entfernung zwischen zwei Positionen im Koordinatensystem?
2.Wie ermittele ich, durch welche Positionen der Kurs führt?
3.Wie ermittele ich alle Positionen im Radius r um Position x? (zB. Spieler scannt Umgebung)


Über eine leicht verständliche Lösung wurde ich mich sehr freuen... :-)
Von wichtl (Admin)
Erstellt vor 17 Jahren
#6798

Re: Thread

1)
(Punkt 1) P1: (x1, y1, z1)
(Punkt 2) P2 (x2, y2, z2)
Vektor P1P2: (x2-x1, y2-y1, z2-z1)
Laenge des Vektors: wurzel( (x2-x1)^2 + (y2-y1)^2 + (z2-z1)^2 )

2)
Naja das kommt auch auf deinen Routfinding-Algorithmus an. Wenn du von (x=0, y=0, z=0) nach (x=1, y=100, z=0) willst, dann musst du 100 Schritte auf der y-Achse nach oben und dabei nur einmal nach rechts (x-Achse). Das einmal nach rechts könntest du ans Ende oder an den Anfang setzen. Du könntest auch erst nach rechts und dann nach oben, oder einmal diagonal und 99x nach oben... kommt eben drauf an. Bei der einfachsten Lösung würden vermutlich drei for-Schleifen schon reichen, die zu den Zielkoordinaten hinzählen. Allerdings hast du dann wiederum das Problem, dass auch Objekte im Weg sein könnten und du dafür Ausnahmen bräuchtest.

3)
Drei for-Schleifen sollten es tun. Die Punkte kannst du dann in ein Array packen. Die Datenbank würd sich bestimmt über die vielen gleichzeitig abgefragten Koordinaten freuen :wink:
Ansonsten erinnert das Problem auch etwas an die "Umkreissuche" (wurd glaub ich so bezeichnet). Allerdings werden die Berechnungen zur Umkreissuche gewöhnlich glaub ich im zweidimensionalen Raum (z.B. Karten) angewendet und nicht im dreidimensionalen. Da müssten die Formeln dann evt. erst verändert werden.
Von Gravedigger (Gast)
Erstellt vor 17 Jahren
#6799

Jetzt bin ich schon weiter

Vielen Dank

1.
Also die Entfernungsberechnung klappt wunderbar, ist ja quasi Pythagoras mit drei dimensionen.. :-)

2.
Einen wirklichen Routfinding-Algorithmus benutze ich nicht. Es wird einfach Luftlinie von Pos1 nach Pos2 geflogen, ohne Berücksichtigung von auf dem Weg befindlichen Objekten. Diese sollen ggfs. zwar angezeigt, aber nicht umflogen werden.
In deinem Beispiel müßte das Schiff also nach 50 Schritten auf der Y-Achse einen Schritt nach rechts, damit ein glaubwürdiger Kurs zustande kommt.

3.
Also muß ich dann quasi einen Würfel mit der Kantenlänge r*2 mittels der for-Schleifen durchlaufen und für jede Position mittels der Entfernungsformel prüfen ob die Entfernung zum Spieler kleiner r ist?
Das klingt wirklich nach viel Rechenaufwand, gibt es da nicht eine Formel, die ich vielleicht nicht verstehe, aber schneller zu berechnen ist...? ^^

Die Datenbank muß für die Positionsberechnung nicht konsultiert werden. Ich habe eine Positionsklasse, die mir dann mittels $pos->getUmkreis(5) ein Array der Positionsklassen im Radius 5 zurück geben soll. Die Datenbank wird erst abgefragt, wenn ich mittels $pos->getOjekte() wissen möchte, was sich an der entsprechenden Position befindet.
Von wichtl (Admin)
Erstellt vor 17 Jahren
#6800

Re: Thread

2) (Ergänzung)
Du könntest auch einfach zwischen den Punkten den Vektor bilden.
Z.B. Punkt1 (0,0,0), Punkt2 (0,1,100). Dann wäre der Vektor P1P2 = (0, 1-0, 100-0) = (0, 1, 100). Der Vektor sagt dir dann, dass du das Schiff auf der y-Achse um +1 und auf der z-Achse um +100 verschieben musst (bei (x,y,z) ). Wenn du die Schritte nacheinander ausführst wären das dann 101 Schritte (einmal +1 auf y dann 100 mal +1 auf z-Achse). Mit ein paar if-Abfragen sollten dann auch schräge Bewegungen möglich sein (und nicht nur eckige).

3)
Das kommt natürlich drauf an ob du beim Scannen ein Quadrat als Scan-Umkreis verwenden willst oder eine Kugel. Ein Quadrat wäre technisch wohl einfacher umzusetzen, da du dann einfach direkt aus der Datenbank die Objekte auslesen könntest und nicht erst die Punkte ermitteln musst. Bei sehr großen Scan-Radien (z.B. über 100) hättest du sonst schnell gigantische Arrays (->Speicherbelastung) und entsprechend große DB-Abfragen. Ich denk die Objekte innerhalb einer Kugel sollten mit den entsprechenden Formeln auch aus der DB auszulesen sein. Die sind dann aber sicherlich wesentlich komplexer.. ich denk mal mit Cosinus und Co werden die dann sein.
Wenn die Scan-Radien sehr klein sind (z.B. <6) kannst du natürlich auch erst die Positionen auslesen und dann direkt Abfragen. Die Positionen könnte man wiederum mit for-Schleifen generieren. Bei einer Kugel müssteste dann in einer Startebene in der das Schiff liegt sozusagen einen Kreis aus vielen kleinen Würfeln formen. Dann kommt oben auf diese Ebene eine Ebene mit Würfeln drauf, wobei die äußerste Schicht weggenommen wird. Ungefähr so wie bei einer Pyramide. Wenn man das dann mehrmals durchführt und am Ende spiegelt hätte man sowas ähnliches wie eine Kugel. Allerdings ist das von der Form her glaub ich noch nicht perfekt, da es eben wie eine Pyramide nach oben hin zulaufen würde und dementsprechend eher eine abgerundete Pyramide und keine Kugel wäre :idea:... ehm... ich denk mal wenn du nach Algorithmen zum Thema Kugel bei Google suchst findest du bestimmt irgendwo was passendes was dir aus Würfeln eine echte Kugel baut...
Um unsere Webseite für Sie optimal zu gestalten und fortlaufend verbessern zu können, verwenden wir Cookies. Durch die weitere Nutzung der Webseite stimmen Sie der Verwendung von Cookies zu. Weitere Informationen zu Cookies erhalten Sie in unserer Datenschutzerklärung. OK