Bestimmung Lokaler Position < Topologie+Geometrie < Hochschule < Mathe < Vorhilfe
|
Status: |
(Frage) reagiert/warte auf Reaktion | Datum: | 01:39 Di 26.08.2014 | Autor: | BennIY |
Aufgabe | Bekannt sind:
Eigene Position (0 ,0 ,0) /Lokal
Position eines Referenzpunktes ( x, y, z) /Lokal
Rotation des Referenzpunktes( x, y, z) /Lokal
Referenzpunkt rotiert um Nullpunkt herum/Lokal
Gesucht: Position im globalen Raum |
Guten Abend liebe Mathematiker,
ich bin neu in Eurem Forum Vorstellung am Ende der Frage, nun mein Anliegen:
Ich Programmiere ein kleines Computerspiel und stehe vor einem Mathematischem Problem das ich seit 3 Tagen nicht gelöst bekomme.
Es geht um ein kleines Raumschiffchen. Dem Spieler wird der anschein gegeben, er bewege sein Schiff im Raum dabei ist es der Raum der sich um das Schiff herum bewegen muss.
Bewege ich mein Raumschiff in Richtung +X-Achse so bewegt sich in Wirklichkeit der Raum zu meinem Spieler hin was bedeutet das Schiff ist Lokal immer auf Position( 0, 0, 0) Im KO-System.
Problem ist, sobald ich den Raum 100 Einheiten Richtung X bewege und dann den Raum um das Schiff den 0-Punkt rotieren lasse so hat es für den Spieler den Anschein das Schiff drehe sich. Nun nach der Rotation um den Spieler ist der Raum allerdings nicht mehr 100 Einheiten hinter ihm, durch diese Rotation kommt auch die Y-Achse ins Spiel Während der Spieler sich nur auf der stelle drehte ist in Wirklichkeit der gesamte Raum verschoben, nun bewegt sich der Spieler Richtung +Y-Achse was bedeutet der Raum wird Richtung -Y-Achse bewegt.
Bis hier her hoffe ich die Thematik ist verstanden nun zu meinem Problem.
Während der Spieler ständig auf dem 0 Punkt verharrt muss ich für den weiteren Spielablauf die echte Position des Spielers herausfinden.
Dazu habe ich einen Referenzpunkt der sich im Raum befindet und am Anfang vor allen Bewegungen auf ( 0, 0, 0) steht also selbe Position wie der Spieler.
Nun macht dieser Punkt alle Bewegungen mit, seine Position und Seine Rotation ist bekannt.
Nun wie kann ich anhand dessen herausfinden, wo sich der Spieler im globalen statischen Raum befindet, das Problem ist das sich der Raum um den Spieler dreht also um den 0-Punkt durch dessen Rotation sich x und y Achse verändert während der Spieler selbst sich im globalen Raum auf der Stelle drehen soll.
Ich komme an das Ende meiner Fähigkeiten, habe mir auch schon den Einheitskreis angeschaut und versucht damit etwas anzufangen erfolglos.
Genauso wie ich versuchte die Koordinaten des Referenzpunktes einfach umzudrehen und als Position zu nehmen was natürlich nicht funktionierte da sich diese bei Rotationen verschieben.
Ich entschuldige mich für den Langen Text und hoffe ich werde verstanden.
Da es sich um eine "Selbst gestellte Aufgabe" handelt habe ich kein Abgabedatum wann ich eine Antwort brauche je schneller umso schneller kann ich das hier besprochene Programmieren.
Fragen beantworte ich gerne und hoffe auf Tipps und Lösungen von euch.
Nun noch etwas zu mir:
Mein Name ist Benjamin Stern,
Ich bin 18 Jahre jung,
Ich beendete die Realschule lerne nun Elektriker,
ich programmiere gerne Multiplayer Indiegames stand schon vor vielen schweren aufgaben habe mich Oft gefragt "Hmm wie mache ich das jetzt" doch diesmal such ich erfolglos nach einer Lösung und komme nicht weiter.
Ich freue mich auf ein gutes Miteinander in diesem Forum.
Beste Grüße
Benjamin Stern
Hier noch formelles:
Ich habe diese Frage in keinem Forum auf anderen Internetseiten gestellt
|
|
|
|
Hallo!
Dann erstmal willkomen im Forum!
Was du da machst, klingt interessant, es ist aber nicht so 100% klar, wo nun das Problem liegt.
Erstmal: Du schreibst, daß du von der Realschule kommst und nun eine Lehre machst.
Was weißt du über Vektorrechnung? Im Prinzip geht es da genau ums Rechnen mit Koordinaten, das heißt, du machst das ja schon. Aber falls dir das nichts sagt, wäre es sicher nicht verkehrt, wenn du dich ein wenig damit beschäftigst, denn das ist echt hilfreich, und zumindest in dem Umfang, den du brauchst, auch nicht schwer.
So, nun zu deinem Problem:
Im Prinzip würde ich das Koordinatensystem des Raums so lassen, wie es ist. Nämlich fest! Alles andere ist viel zu kompliziert und fehleranfällig, insbesondere, wenn du nun mehrere Raumschiffe hast.
Dann hat dein Raumschiff im einfachsten Fall drei Parameter: Aufenthaltsort r, Bewegungs-/Blickrichtung b und Geschwindigkeit v.
Den Programm wird ja jetzt eine Schleife beinhalten, in der neben dem restlichen Spielgeschehen auch die Bewegung des Raumschiffs berechnet wird. Das sieht dann so aus:
[mm] r_x=r_x+b_x*v*dt
[/mm]
[mm] r_y=r_y+b_y*v*dt
[/mm]
[mm] r_z=r_z+b_z*v*dt
[/mm]
Das dt ist der Zeitschritt, der in jedem Schleifendurchlauf durchlaufen werden soll. Wichtig ist hier noch was: Es soll gelten [mm] \sqrt{b_x^2+b_y^2+b_z^2}=1 [/mm] .
Sobald du den Steuerknüppel bedienst, änderst du damit die Bewegungsrichtung b , mit dem Gashebel die Geschwindigkeit v.
Das b gibt dir nun auch die Blickrichtung an. Mit ihrer Hilfe (und den Koordinaten z.B. eines Sterns) kannst du nun berechnen, wo auf dem Bildschirm du den Stern zeichnen mußt.
(Ich muß nu aber weg, ggf später mehr)
|
|
|
|
|
Status: |
(Frage) reagiert/warte auf Reaktion | Datum: | 10:57 Di 26.08.2014 | Autor: | BennIY |
Naja da liegt der Hund begraben, das Schiff an sich habe ich schon bewegt während der Raum statisch blieb auch mit Vektoren etc durch das Programmieren weis ich ein wenig mehr als in der Schule gelehrt wurde.
Mein KO-System hat aber nur 10.000 Einheiten was für das Universum winzig ist, ein Planet mit 12km Durchmesser ist neben meinem Schiff mit 100m Länge riesig was ja gewollt ist allerdings dieser Größenunterschied liegt nicht mehr im Zahlenbereich eines 32Bit Rechners.
Nun dachte ich wenn ich schon nicht mit meinem Schiff da hin kann weil, außerhalb des Bereiches so hole ich die Planeten einfach zu mir.
Mein Schiff bleibt bei 0,0,0 und ich Ziehe die Objekte von weit außerhalb zu mir her, auf diese weise kann ich ein großes Universum simulieren ohne Problem mit den Zahlenbereichen zu bekommen da sich das Spielgeschehen selber nur um den 0Punkt herum abspielt.
Wenn ich es nun schaffe aus allen Bewegungen die der Raum um das Schiff macht meine Globale Position herauszuziehen kann ich anhand dessen mein Schiff für andere Sichtbar positionieren, das ist ebenfalls schon erledigt leider mit falschen Positionen, ich brauch nur noch meine globale Position.
Es muss doch irgendwie machbar sein ich lerne gern dazu ;)
Beste Grüße
Benjamin Stern
|
|
|
|
|
> Naja da liegt der Hund begraben, das Schiff an sich habe
> ich schon bewegt während der Raum statisch blieb auch mit
> Vektoren etc durch das Programmieren weis ich ein wenig
> mehr als in der Schule gelehrt wurde.
>
> Mein KO-System hat aber nur 10.000 Einheiten was für das
> Universum winzig ist, ein Planet mit 12km Durchmesser ist
> neben meinem Schiff mit 100m Länge riesig was ja gewollt
> ist allerdings dieser Größenunterschied liegt nicht mehr
> im Zahlenbereich eines 32Bit Rechners.
> Nun dachte ich wenn ich schon nicht mit meinem Schiff da
> hin kann weil, außerhalb des Bereiches so hole ich die
> Planeten einfach zu mir.
> Mein Schiff bleibt bei 0,0,0 und ich Ziehe die Objekte von
> weit außerhalb zu mir her, auf diese weise kann ich ein
> großes Universum simulieren ohne Problem mit den
> Zahlenbereichen zu bekommen da sich das Spielgeschehen
> selber nur um den 0Punkt herum abspielt.
>
> Wenn ich es nun schaffe aus allen Bewegungen die der Raum
> um das Schiff macht meine Globale Position herauszuziehen
> kann ich anhand dessen mein Schiff für andere Sichtbar
> positionieren, das ist ebenfalls schon erledigt leider mit
> falschen Positionen, ich brauch nur noch meine globale
> Position.
>
> Es muss doch irgendwie machbar sein ich lerne gern dazu ;)
>
> Beste Grüße
> Benjamin Stern
Hallo Benny,
zuerst mal Gratulation zu deinem anspruchsvollen Projekt !
Ich verstehe es so, dass du nur die jeweils wichtigsten
(sichtbaren und nicht allzu weit entfernten) Objekte darstellen
willst. Wenn du dabei nicht die Positionskoordinaten des
Raumschiffs verändern willst, müsstest du halt die Koordinaten
aller Objekte ständig verändern. Wie weit du die eigentlichen
Eigenbewegungen der Objekte (also z.B. die Bewegung eines
Planeten rund um seinen Stern) berücksichtigst, weiß ich
nicht. Nur kann ich mir vorstellen, dass es vom Rechenaufwand
her trotzdem einfacher ist, wenn du z.B. die "Fixsterne" an ihren
Positionen im fixen Koordinatensystem belässt und ihre vom
Raumschiff aus gesehene Position nur jeweils für eine aktuelle
Ansicht durch eine Koordinatentransformation auf ihre ent-
sprechenden Punkte im Blickfeld des Piloten umrechnest.
Ich muss mir aber deine Idee auch zuerst noch etwas genauer
vergegenwärtigen, um dann allenfalls mit passenden
Ratschlägen für die notwendigen Koordinatentransformationen
etwas zu helfen.
LG , Al-Chw.
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 21:55 Di 26.08.2014 | Autor: | BennIY |
Es gibt ein einziges Objekt das bewegt wird, mit diesem erhalten alle anderen Objekte ihre Bewegung und Rotation es ist für mich kein Problem Planetenbewegungen um einen Stern zu machen während das Universum weiter vom Spieler bewegt wird, alles schon fertig Lokal bei dem Spieler funktioniert alles und bei alle anderen Spielern auch die Verbindung besteht Daten und Koordinaten aller Objekte werden hin und her versendet ich brauch nur noch die Position meines Spielers, dass ist sozusagen das letzte Puzzleteil
|
|
|
|
|
Hallo!
Was meinst du denn mit 32Bit-Rechner?
Das sind eher technische Details, und man muß oft aufpassen, was damit genau gemeint ist. Bei PCs meint man damit normalerweise, daß man 32 Bit zur Speicheradressierung zur Verfügung hat, und damit maximal 4,2MrdBytes, also 4GB ansprechen kann. In anderem Kontext meint man damit, daß die CPU z.B. immer nur 32 Bit an Daten verarbeiten kann. Dann ist die Addition zweier 32Bit-Zahlen zwar in einem Zug erledigt, aber man kann auch größere Zahlen verarbeiten. Man braucht dafür nur eben ein paar mehr Prozessortakte.
Übrigens, der 8087, ein Mathe-Coprozessor, der in den ersten PCs zwischen 1980 - 1990 eingesetzt wurde, hatte 80 Bit, und kommte damit Fließkommazahlen recht präzise verarbeiten.
Das sind aber alles Dinge, die du als Programmierer aber nicht wirklich berücksichtigen mußt. Du mußt höchstens schauen, wie viele Bits z.B. ein INT auf deinem Rechner hat, welche Präzision ein Float erlaubt, etc.
Ein Double z.B. hat auf einem PC normalerweise eine Präzision von etwa 15 Stellen und kann Zahlen bis [mm] 10^{308} [/mm] aufnehmen. Das heißt, im Prinzip kannst du mit 300-Stelligen Zahlen hantieren, wobei nur die ersten 15 Stellen exakt bekannt sind.
Für dein Spiel tritt hier dann das Problem auf, das du schon beschreibst: Befindet sich dein Raumschiff weit weit weg vom Ursprung, kannst du keinen korrekten Abstand mehr zum Planeten in direkter Nähe berechnen, weil dieser Abstand viel kleiner als die Präzision der großen Abstände ist.
ABER:
Du kannst mit den etwa 15 Stellen Präzision eines Doubles eine Entfernung von etwa 1 Lichtjahr ( [mm] 9*10^{15}m [/mm] ) mit einer Präzision von 1m angeben. Das ist ordentlich.
Zur Not nimmst du ein Long Double mit den o.g. 80 Bit und etwa 19-20 Stellen.
Und wenn auch das nicht reicht, gibt es noch Bibliotheken, die es erlauben, beliebig präzise und große Zahlen zu verwalten.
Aber vermutlich reicht das ganze doch so, oder?
Fixsterne kannst du ja immernoch in einer Entfernung von [mm] 10^{300}m [/mm] anlegen, wenn dein Raumschiff die niemals erreichen wird. Damit wirst du keine Probleme bekommen.
Solltest du doch Probleme bekommen, könntest du darüber nachdenken, den Weltraum in viele Sektoren aufzuteilen, jeder davon so groß, daß er problemlos mit Doubles aus kommt, und wenn dein Raumschiff eine Grenze überschreitet, wechstelst du einfach das Koordinatensystem. Vermutlich ist auch das einfacher, als alles im Koordinatensystem des Raumschiffs zu rechnen.
|
|
|
|
|
Status: |
(Frage) reagiert/warte auf Reaktion | Datum: | 14:21 Di 26.08.2014 | Autor: | BennIY |
Das ist ebenfalls viel zu leicht ich habe schon alles bedacht was die Zahlengröße angeht, der Datentyp Double hat eine Datengröße von 64Bit das Spiel ist allerdings nur für 32Bit Plattformen bedeutet ich habe zur Berechnung nur Floats als Gleitkommazahlen und dabei kann ich nur 7 Nachkommastellen genau berechnen, weit unereichbare Sterne befinden sich sowieso im Hintergrund es geht nur um ein Solarsystem für welches ich 10.000 Einheiten habe normaler weise sogar weniger. Sage ich nun 1Einheit = 1.000.000km hätte ich den Maßstab gesetzt und habe ein Solarsystem von 10AU Größe, reicht geradeso da allein Erde, Mond entfernung schon 3 AU betragen.
Nun ist es aber so ein Schiff der Länge von 100m hat gerademal 0,0000001 Einheiten wenn das soweit richtig ist nun sind 100m Schon ein etwas längeres Schiff ne Rettungskapsel hat 5Meter. Lange rede kurzer sinn ich habe nur floats keine doubles und damit zu wenig Platz.
Wieder zum Problem anhand eines Punktes im Universum die Position des Spielers herausfinden.
Wie gesagt, habe ich diese Spielerposition, ist alles weitere schon erledigt also das umrechnen der Globalen Spielerposition für andere Spieler die sich ebenfalls auf 0,0,0 befinden und ihr Lokales Universum bewegen ist schon getan.
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 14:34 Di 26.08.2014 | Autor: | BennIY |
PS: Wie schon gesagt doubles sind leider nicht, schön währe es.
Ich habe lediglich floats zur Verfügung und
2. Natürlich habe ich mein Weltraum schon in einzelne Sektoren eingeteilt ich habe sogar versucht jeden Planeten als Sektor zu nehmen aber auch das Bereitete Probleme, Planeten zu groß Schiff zu klein.
Mein Kollege kam sogar auf die Idee (Er programmiert etwas ähnliches für Mobilplattformen) er Skarlier die Planeten je näher man ihn kommt und simuliert eine Geschwindigkeit mittels Veränderung von Größen das ist mir aber zu Schwammig man kann nicht mehr genau Entfernungen vorraus sagen und fliegt einfach los und früher oder Später wird man auch da das Problem der Größen bekommen was ihm egal sein kann da er es für Handys macht da nimmt mans nicht so genau.
Die Planeten Bewegung ist kein Problem auch schon erledigt da ich bei Planeten feste Globale Positionen vorraus rechnen kann kann ich diese auf das Universum des Spielers umrechnen nur der Spieler ist ein Dorn im Auge ich muss wissen wo er ist dann kann ich anhand seiner Globalen Position ihn im Ko System jedes einzelnen Spielers Positionieren das wäre schon gemacht soweit habe ich vorraus gearbeitet.
Mensch ich hoffe wir finden eine Lösung ;)
Beste Grüße
|
|
|
|
|
Hi!
Nu interessiert es mich aber: Für was für eine Plattform und in welcher Sprache programmierst du?
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 16:40 Di 26.08.2014 | Autor: | BennIY |
Ich arbeite mit der Unity Engine und schreibe c#.
Um vorurteile aus dem weg zu gehen, Unity ist zwar eine starke Engine trotzdem ist das Programmieren noch die klassische Arbeit.
Unity Engine ist eine 32Bit engine Positionsdaten können also nur mit einer float genauigkeit berechnet werden. Wir warten alle darauf, das diese Entwicklungsumgebung 64Bit unterstützt jedoch ist das noch nicht in sicht.
|
|
|
|
|
Status: |
(Frage) reagiert/warte auf Reaktion | Datum: | 23:03 Mi 27.08.2014 | Autor: | BennIY |
Also jegliche Alternativen sind nun schon ausprobiert um das Spielerschiff zu bewegen:
1. Universum in verschiedene Teile einzuteilen schon versucht selbst wenn ich für jeden Planeten ein eigenen Sektor erstelle ist der Größenunterschied unberechenbar für den PC.
2. Doubles sind aufgrund technischen Bedingungen nicht möglich ich habe lediglich floats mit einer Genauigkeit von maximal 7 Nachkommastellen.
Allein die Grundfläche ist zu klein, max 10.000 Größeneinheiten eigentlich nur 1000.
3. Das Raumschiff selber und deren Positionskoordinaten in Statischen System ist auch schon versucht worden doch durch Rundungsfehler der floats zeigten ein Problem was sich "Jitter" nennt.
Einzige Hoffnung sehe ich darin, den Raum zu bewegen und die Positionskoordinaten des Spielers umzuwanden in eine Globale Position mit Statischen Raum. Habe ich diese Koordinaten ist wie erwähnt auch der rest erledigt, das Universum existiert schon bewegt sich um den Spieler und um sich selbst was ich habe ist ein Objekt was Position und Rotation annimmt woraus ich die Formel machen muss, um den Spieler der sich nicht bewegt in eine Global gültige Position umzuwandeln.
|
|
|
|
|
Hallo!
Es hat ne Weile gedauert, aber ich denke, ich weiß nun, wo das Problem liegt.
Erstmal programmierst du in C#, das heißt, der Code wird hinterher in irgendeiner Weise durch einen Compiler gejagt, und du bekommst ein fertiges Programm, das du laufen lassen kannst.
Ich denke, du kannst garantiert Doubles mit der hohen Genauigkeit in deinem eigenen Code verwenden.
Aber die unity-API erlaubt nur, floats zu übergeben. Das heißt, du hast da sowas wie
set_starship(float x, float y, float z){}
set_planet(float x, float y, float z){}
stehen.
Selbst, wenn du die Positionen in Doubles hast, was ausreichen würde, sobald du sie nach float castest und hier einsetzt, hast du den Jitter, wenn die Koordinaten zu groß werden.
Und dann ist es tatsächlich das beste, nicht das Raumschiff im Raum, sondern den Raum um das Schiff zu bewegen, da die Abstände dann alle klein genug für floats werden.
Nun willst du aber dennoch die Position des Schiffes im Koordinatensystem des Raums wissen.
Ich denke, da wirst du mit floats nicht weiter kommen, weil da genau das gleiche Problem besteht, auch wenn das nicht unmittelbar auf dem Bildschirm steht.
Mein Vorschlag wäre daher, daß du die Position des Schiffs unabhängig von unity selber berechnest, und zwar mit Double-Genauigkeit.
Also:
"Drehe dich um 90° und fliege 100"
wird in unity zu
"Drehe alle Weltraum-Objekte um -90°, und bewege sie um -100 in Flugrichtung." (Alles schön mit Floats)
Gleichzeitig berechnest du die Position des Schiffes selbst:
"Drehe die Flugrichtung um +90° und addiere +100 in diese Richtung" (Das aber mit Doubles)
Problematisch kann sein, daß weit entfernte Objekte, wenn du sie zu dir hin ziehst, auch dem Jitter-Effekt unterliegen. Das siehst du vielleicht nicht, und wenn sie dann in der Nähe sind, verlaufen die Bewegungen auch Jitter-frei, aber durch die vielen iterativen Berechnungen kann sich die Position des Objekts gegenüber der wahren Position verändert haben. Das ist auch nicht schön.
An der Stelle würde ich dann konstante Doubles für die Position von Objekten nehmen, die Position des Schiffes auch in Doubles selbst berechnen, und dann die Position der Objekte relativ zum Schiff zu berechnen. Das ist ja dann nur noch ne einfache Differenz. Und die wird dann zu floats gecastet und an die unity-Funktionen übergeben.
Ich denke übrigens, das ganze kommt daher, daß Grafikkarten, die ja mit den ganzen Koordinaten gefüttert werden, früher nur floats unterstützt haben. Mittlerweile können die zwar auch alle doubles, aber aus Geschwindigkeitsgründen etc. wird man die wohl weiterhin meist mit floats befeuern. Es ist also keine Einschränkung des Prozessors (oder gar der 32bit-Architektur), sondern im Prinzip der Grafikkarte.
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 12:52 Do 28.08.2014 | Autor: | BennIY |
Das ist mir alles bewusst dass ich für mich selber mit doubles rechnen muss sobald die Objekte weit weg vom Referenzpunkt sind ich probiere das heute Abend, habe es schon versucht ein unsichtbares Objekt mit dem Schiff zu bewegen was die Positionen gibt leider war da irgendwo ein Fehler weswegen es nicht funktionierte, ich versuche es nochmal. Und melde mich :)
|
|
|
|
|
Status: |
(Frage) überfällig | Datum: | 23:50 Do 28.08.2014 | Autor: | BennIY |
Habe nun ein Unsichtbares Objekt erstellt welches die Bewegung des Raumschiffes simuliert, es hat die Selbe Rotation wie das Universum und die selbe Vorwärtsbewegung lediglich die Vorzeichen wurden logischerweise umgekehrt nur leider wenn ich versuche mein Raumschiff auf 0,0,0 zu bewegen ergeben sich Ungenauigkeiten die mit der Zeit riesig werden ich kann den Ursprung des Fehlers nicht finden da ich wirklich dieses unsichtbare Objekt genau wie den Raum blöß umgekehrt bewege.
Weit entfernte Objekte die ich heranziehe bekommen eine Art Entfernungsfaktor damit die Entfernung zum Ursprung des Universums im Rahmen des berechnbaren bleibt auch das ist schon gelöst wie gesagt das Universum existiert schon ich muss "nur noch" wissen wo sich die Spieler befinden. Nur noch in "" da es so wies aussieht leichter klingt als es ist.
Findet man wirklich keine Lösung das umzurechnen?
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 00:20 So 31.08.2014 | Autor: | matux |
$MATUXTEXT(ueberfaellige_frage)
|
|
|
|