Positionsangabe im Weltraum
-
Geh mal grob von 7 stellen aus. Aber muss es denn tatsächlich genauer, als ein Millimeter sein. Würde es irgendjemand merken, wenn ein Schiff, einen zentel Millimeter weiter rechst steht?
-
Hi,
nein, das merkt niemand, aber wenn der Server z.B. bei 200 FPS läuft und sich das Schiff langsam bewegt, passiert es bei einer zu geringen Koordinatenauflösung, dass es sich halt gar nicht mehr bewegt!
Deswegen würde mich halt doch interessieren, wie ihr das jetzt realisieren würdet...
ChrisM
-
Ein float hat nur 32 bit. Kann also gar nicht genauer sein als ein long.
Nimm am besten ein long für den Sektor und ein longlong für die genaue Koordinate.
-
Hi,
das weiß ich. Aber ich wär trotzdem glücklicher, wenn es mit float oder double ginge, denn für die Darstellung brauch ich die Daten als float/double und wenn ich es als longlong hab, muss ich ja immer umrechnen.
Reicht ein float/double nicht aus, um auf einer Strecke von 0 bis 1000 (100 würden auch reichen), ein Punkt auf z.B. 4 Nachkommastellen genau anzugeben?
ChrisM
-
Wie wäre es wenn Du verschiedene Gitterverfeinerungen benutzt, quasi erst die Qubenbestimmung auf einem Meter genau und anschließend den entsprechenden Zielqubus mit einer Genauigkeit von Mikrometer etc. ?
Quasi
Grob(1,3,10) mit
Mittel(17,4,6)[von Grob(1,3,10)] und
Fein(2,2,7)[von Mittel(17,4,6)[von Grob(1,3,10)]]
-
wie wärs mit 2 Winkel(2 mal long double), und die streke in Lichtjahren/Tagen/minuten/sec...(ein mal long int, der rest short)
-
Hi,
irgendwie alles etwas kompliziert und vor allem groß. Das Ganze wird ja ein Onlinegame und da muss jeder Schuss und alles übertragen werden.
Nochmal: Denkt ihr, ein long für den 100km^3-Meter großen Sektor und dann einen float/double für die Position in diesem Sektor reichen für eine genügend genaue (~1mm) Positionsbestimmung?
ChrisM
-
Was genau hat dich denn jetzt an einem int64 für Alles gestört? Haben wir uns im IRC doch verrechnet?
-
Hi,
naja, mal rechnen...
Ein __long64 für alles ->
Gewünschte Auflösung sagen wir mal: 1mm2 ^ 64 = 18446744073709551616mm
= ~18446744073709551m
= ~61489146912 Lichtsek.
= ~1949 LichtjahreDas hat ich im Chat ja auch schon raus, aber kann das stimmen?
ChrisM
-
Ich denk schon daß das stimmt. Warum denn nicht?
-
Hallo,
ich würde das nicht mit nur einem wert pro dimension machen,
1. Weil man aus einer mehrteiligen positionsangabe viel mehr herauslesen kann (nutzer/spieler) z.B. Quadrant Sektor Position im Sektor, dann weiss man auf den ersten Blick, in welchem Teil der Galaxie man sich aufhält.
2. Hat es bestimmt auch einige Vorteile für das Programm, wenn zum Beispiel eine grafische Ausgabe erfolgen soll, musst du ja herausfinden welche Schiffe alle gezeichnet werden sollen, da wäre doch eine Datenstruktur in mehren Teilen sinnvoller, als wenn du alle schiffspositionen durchgehen und vergleichen musst.
Kollisionsprüfung müsste so auch einfacher sein.Gibt noch ein paar mehr Gründe für eine mehrteilige Struktur, aber ich glaube es ist klar was ich meine.
kibble
-
Ein anderer Vorteil einer Mehrteiligen Struktur ist auch, dass dur eine Datenreduktion herbeiführen kannst, indem du nur wenn nötig (beim Wechsel eines Quadranten) die Angaben der höheren Hierarchie (Quadrant) mitlieferst. Ansonsten kannst du darauf verzichten und lediglich die Position innerhalb des Quadranten versenden, was mit wesentlich weniger Daten auskommen sollte.
-junix
-
Ich stelle mal die Notwendigkeit eines kontinuierlichen Weltraumes in Frage. Geschwindigkeiten, bei denen Interaktion zwischen Spielern oder Spielobjekten stattfindet, sind normalerweise weit unter einer Geschwindigkeit, die im Maßstab von 1000en von Lichtjahren eine Rolle spielt. Dh es gibt eine Unterscheidung zwischen globalen Koordinaten und Koordinaten, die lokal zu einer Interaktion sind.
Dabei unterstelle ich, dass du das übliche Sci-Fi-Klischee bedienst, nachdem die Lichtgeschwindigkeit (nur) im Hyperraum überwunden werden kann. Mit "normalen" Geschwindigkeiten Lichtjahre überwinden zu wollen dauert schließlich auch Jahre
-
tja jetzt hast du leider kein problem... wie schade...
ich kann ja mal eines aufwerfen... fürs rendering auf dem zbuffer bekommst du bei 2^24 unterteilungen zfighting wenn du grosse weiten und nahe objeckte darstellen möchtest
rapso->greets();
-
das wird man ja noch irgendwie lösen können
-
Bashar schrieb:
Ich stelle mal die Notwendigkeit eines kontinuierlichen Weltraumes in Frage. Geschwindigkeiten, bei denen Interaktion zwischen Spielern oder Spielobjekten stattfindet, sind normalerweise weit unter einer Geschwindigkeit, die im Maßstab von 1000en von Lichtjahren eine Rolle spielt. Dh es gibt eine Unterscheidung zwischen globalen Koordinaten und Koordinaten, die lokal zu einer Interaktion sind.
Dabei unterstelle ich, dass du das übliche Sci-Fi-Klischee bedienst, nachdem die Lichtgeschwindigkeit (nur) im Hyperraum überwunden werden kann. Mit "normalen" Geschwindigkeiten Lichtjahre überwinden zu wollen dauert schließlich auch Jahrenaja, ChrisM hat ja geplannt durch die sektoren das spiel auf mehreren rechnern laufen zu lassen, dafür die "jumpgates"...
ich wäre aber auch eher dafür sonst normal rumzudüsen, wenn es einen ionenantrieb gebe mit dem man 0.25 der lichtqeschwindkeit erreicht, dann wäre das schon ziemlich cool
rapso->greets();
-
mwoidt schrieb:
das wird man ja noch irgendwie lösen können
klar, gibt viele wege, fragt sich nur ob er überhaupt darüber nachgedacht hat.. deswegen sprach ich es an
rapso->greetS();
-
rapso schrieb:
naja, ChrisM hat ja geplannt durch die sektoren das spiel auf mehreren rechnern laufen zu lassen, dafür die "jumpgates"...
Also klassisch? Ich dachte es sollte wenigstens die Illusion eines kontinuierlichen Weltraumes geschaffen werden. Naja dann hat sich das Thema ja erledigt, man macht einfach wie bei Tie Fighter Sektoren von einigen 100km Kantenlänge und gut
ich wäre aber auch eher dafür sonst normal rumzudüsen, wenn es einen ionenantrieb gebe mit dem man 0.25 der lichtqeschwindkeit erreicht, dann wäre das schon ziemlich cool
Genau, mal eben 16 Jahre nach Alpha Centauri zum Wochenendurlaub ohne dass das geringste passiert ...
-
Bashar schrieb:
rapso schrieb:
naja, ChrisM hat ja geplannt durch die sektoren das spiel auf mehreren rechnern laufen zu lassen, dafür die "jumpgates"...
Also klassisch? Ich dachte es sollte wenigstens die Illusion eines kontinuierlichen Weltraumes geschaffen werden. Naja dann hat sich das Thema ja erledigt, man macht einfach wie bei Tie Fighter Sektoren von einigen 100km Kantenlänge und gut
na ich weiß nicht ob er vielleicht doch einen flüssigen serverwechsel hinbekommen möchte...
Bashar schrieb:
ich wäre aber auch eher dafür sonst normal rumzudüsen, wenn es einen ionenantrieb gebe mit dem man 0.25 der lichtqeschwindkeit erreicht, dann wäre das schon ziemlich cool
Genau, mal eben 16 Jahre nach Alpha Centauri zum Wochenendurlaub ohne dass das geringste passiert ...
... aber es wird trotzdem so öde sein. sogar beim M$ flysimulator kann man stundenlang fliegen.
wenn du einen weltraum von nur einem lichtjahr hättest, würde es ewig dauern bis man sich trift, selbst wenn du sofort wenn du die koordinaten eintippst schon am ziel wärst und 1000 leute mitspielen würden.
das kann er nur lösen, indem er knotenpunkte des interesses einrichtet... z.b. eine raumbasis, erzfeld...
und da wäre es von vorteil wenn man relativ langsam wäre, denn dan würde niemand versuchen mit seinem normalen 0.25c-antrieb die 0.1 lichtjahre zu überbrücken
aber ist ja dann eher konzeption und kein zahlen-genauigkeits-problem
rapso->greets();
-
Hi,
nein, ein Universum ist auch immer ein Server. Geplant ist allerdings, dass es halt quasi Paralleluniversen oder sowas gibt, durch die man durch Sprungtore kommt (und das Paralleluniversum ist dann logischerweise einfach ein anderer Server). Dass das aber vollkommen flüssig läuft, ist ja nicht so wichtig, ich denke, wenn dann 5 Sekunden "Lade" dasteht, stört das niemand.
Mir ist schon klar, dass ich am Anfang kein Monsteruniversum mit dem Durchmesser einer Galaxie einrichten kann, ich dachte eher so an eine Art Minisonne mit 1-2 Planeten
Jetzt aber noch mal zum Problem zurück: 2 Werte sind mir eigentlich auch sympathischer, aber praktisch bringt es mir z.B. bei der Sichtbarkeitsabfrage nicht viel. Ich muss ja nicht nur curQuad == destQuad oder so prüfen, sondern auch die Nachbarsektoren, schließlich könnte man sich ja auch grade an der Grenze befinden und weiter sehen als 100km sollte auch gehen (sonst taucht plötzlich ein Planet vor einem auf, das wär "leicht" blöd :D). Aber da muss ich mir eh erst noch was einfallen lassen, wegen der Far Clipping Plane, aber das wird schon.
Die Frage ist jetzt eigentlich noch:
- (für jede Dimension) long für Sektor und float/double für genaue Position (falls das, dann auch noch, ob float reicht oder ob ich double brauch und wie groß ein Sektor werden soll)
- (für jede Dimension) longlong für die eindeutige PositionChrisM