Weltraum in nahezu realistischer Größe darstellen? Z.B. World Composition

  • Hey,

    ich versuche in letzter Zeit ein Spiel im Weltraum zu entwickeln, in dem man durch das Sonnensystem (ca. bis zum Mars) reisen können soll. Dabei sollen nicht nur die einzelnen Planeten dargestellt werden, sondern man soll sich auch überall sonst bewegen können. Zusätzlich soll das Spiel online sein, sodass man sich auch gegenseitig sehen kann.

    Das Problem (könnt ihr sicher alle erahnen):

    Die Unreal Engine ist nicht dafür vorgesehen, eine Welt mit ca. 50.000.000 - 300.000.000 km darzustellen, sondern nur Welten von ein paar Kilometern. Außerdem werden es sehr viele Objekte, da dort dann allein ein paar Millionen Meteoriten bzw. Asteroiden geladen werden müssten.


    Dafür hatte ich mir eigentlich eine - dachte ich zumindest - gute Lösung überlegt.

    Leider hatte ich da ein paar Sachen nicht bedacht (ist mir leider erst nach ca einem Monat Programmierung aufgefallen), für dessen Behebung ich viel von der UE4 im Source Code umschreiben müsste und das ist mir zu aufwendig.

    Z.B. gibt es ein paar Performance Probleme serverseitig, da manches doppelt berechnet wird (bei 10 mio Asteroiden bzw. anderen Objekten mit 3x64 bit Koordinaten (ist bei der Größe von Koordinatensystem notwendig) wären es 30 mio unnötige Berechnungen 1,92 mrd. Herz (1,92 GHz) und das nur bei Koordinaten-Berechnungen; es kommen noch sehr viele andere Bereiche dazu).


    Deswegen habe ich mich jetzt entschieden, es doch mit World Composition zu versuchen.

    Dafür wollte ich ein leeres Child-Level (Größe 5x5x5 km) erstellen und ein Parent-Level.

    In dem Parent Level sollen dann überall, wo Objekte sind, Child-Level gespawnt werden (sozusagen ein 3d-Chunk-System mit Chunks mit 5x5x5 km, jedoch sollen nur in Chunks, in denen Objekte sind, ein Level gespawnt werden). Da die meisten Chunks leer sind, werden schätzungsweise maximal 1 mio Level geladen.

    D.h. der Server soll beim Starten im Savegame alle Objekte haben, die gespawnt werden sollen. Dann soll abgefragt werden, in welche Chunks Level gespawnt werden sollen (bzw. in welchen Chunks Objekte sind) und dann sollen die Level natürlich noch geladen werden.


    Da ich mich mit World Composition nicht wirklich auskenne (habe bisher ein kleines Spiel als Test mit World Composition gemacht), frage ich diesmal lieber ein paar Sachen:

    1. Wie viel RAM/Speicher und CPU Leistung nutzt ein leeres Level ungefähr (ohne Objekte), das in World Composition geladen wird? Muss der Server da nur den Namen, Position usw. speichern oder wird da aktiv was berechnet, wenn in dem Level nichts verändert wird?
    2. Habe ich irgendwas übersehen, weswegen das nicht funktionieren wird?
    3. Hat vielleicht jemand eine viel bessere Möglichkeit, mein Vorhaben umzusetzen?
    4. Hat jemand sonstige Kritik/Vorschläge?
    5. Gibt es eine Funktion, die per Blueprint oder C++, während des Laufen des Servers, Level ins World Composition lädt/entlädt oder muss ich mir da selber was zusammen schreiben?

    Ich weiß, dass das Vorhaben auf einem/mehreren sehr performanten Servern laufen müsste und sehr viele Ressourcen in Anspruch nehmen würde, jedoch ist mein Vorhaben eigentlich nur eine Herausforderung an mich und wird wahrscheinlich nie wirklich genutzt.

  • World composition kommt hier "bedingt" zum Einsatz. Ich wills mal kurz erklären, hab leider nicht viel Zeit, vielleicht später mehr.


    1. Der Weltraum ist zu etwa 99,99% absolut leer

    2. Daher - warum tausende "leere" levels erstellen - da reicht auch einer.

    3. Ja sicherlich gibts dann Levels wie nen Asteroidengürtel, aber auch hier - hat man einen gesehen hat man alle gesehen...

    4. RAM ist bei leeren Leveln vernachlässigbar. Ich würde hier mit Level streaming arbeiten und ggf Platzhaltern (Streaming macht ja nur bedingt Sinn da man praktisch unendlich weit schauen kann). Beim level streaming lädst du "die nächsten sichtbaren" Level vor und entlädst was nicht mehr gesehen werden kann. Setzt man das clever ein spart man viel RAM.

  • Externer Inhalt www.youtube.com
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklären Sie sich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.

  • kyodai

    Ich bin mir nicht sicher, ob ich dich falsch verstehe oder andersrum. Wegen deinem 2. denke ich, dass du das mit "leerem Level" missverstanden hast. Deswegen nochmals anders erklärt:

    Das komplette Weltall soll in 5x5x5 km große Chunks aufgeteilt werden.

    Ich erstelle ein einziges Level (eine Datei), das keinen Inhalt hat (Leeres Level). Ich erstelle manuell kein weiteres Child-Level.

    In jedem Chunk, in dem ein Objekt ist, soll das leere Level geladen werden (das Level füllt genau den Chunk aus). Das macht der Server.

    Beim Client sollen dann immer nur das Level und die umliegenden Level geladen werden

    Die Objekte werden dann nach dem Laden des leeren Levels vom Server gespawnt.


    Wie würdest du das mit Level Streaming machen? Ich wüsste direkt keinen perfekten Weg, um alle Level auf dem Server zu laden, jedoch nur die umliegenden Level auf dem Client zu laden.

    Ich wüsste jetzt nur den Weg, für jedes Level sozusagen einen eigenen Server zu starten und dann auf dem Client PC mit Level Streaming und verschiedenen Ports die richtigen Level zum Streamen auswählen (jedes Level hätte dann einen eigenen Port). Da gehen jedoch schnell mal die Ports aus.

    Andernfalls könnte man auch einfach für jedes Level den gleichen "Main Server" anpingen, dem das benötigte Level mitteilen und der leitet einen dann an den richtigen Server für das Level weiter. Dann könnte man mit lokalen IPv4 Adressen arbeiten. Ich denke jedoch, dass das recht kompliziert wird...


    pgsein

    Das Video hatte ich schon mal kurz überflogen, jedoch geht es da doch (soweit ich das verstanden hab) nicht um das komplette Weltall, sondern nur um einen Planeten und den Flug zu diesem (ein World Composition aus 2-3 Leveln) oder?

  • OK da hab ich es jetzt missverstanden - das alles gespawnt wird macht das Level design ja wesentlich spannender. Naja wenn sich dein Schiff aber durch den Level bewegen soll erreicht es ja logischerweise auch mal das Ende. Zum streaming brauchst du mehrere Level, wenn wir das ganze wie nen Rubiks Cube betrachten dann ja mindestens 27 gleichzeitig weil im All kann man ja in jede Richtung fliegen. Da ist dann die Frage - macht hier streaming wirklich Sinn? Was meinst du mit "port"? TCP-IP Port? ich verstehe hier gar nicht was du meinst muss ich zugeben...


    In deinem Fall müsste man sich fragen ob man das Raumschiff wirklich innerhalb des Levels bewegt oder nur die Planeten/Asteroiden oder was auch immer da rummschwirrt eher um das Raumschiff herum. Dann kommt man mit einem Level aus. Im Multiplayer könnte das aber spannend werden - wenn nur die Asteoriden an dir vorbei zischen merkst du ja nie daß die sich bewegen statt du... Bei nem anderen Raumschiff eines Spielers müsste sich ja aber zwangsweise in dem Level einer auf den anderen zubewegen. Vielleicht müsste man dafür nen "Dogfight" level machen.

  • kyodai

    Beim Streaming meinte ich, dass jedes Level einen eigenen Port/lokale IPv4 Adresse erhält und man sich so damit verbinden kann. Das ist meiner Meinung nach nicht sinnvoll und war gerade auch nur ne Gedankenspielerei...



    Dein Vorschlag mit Welt um den Spieler/das Raumschiff herum zu bewegen, war meine gescheiterte Idee. Hier kurz eine Erklärung, was ich bisher programmiert habe und weswegen ich damit aufgehört habe (vielleicht hat ja jemand ne Lösung für meine Probleme):

    Spieler/Raumschiff ist dauerhaft bei Position 0,0,0 und Rotation bleibt unverändert (damit man die Welt nicht drehen muss; das erspart sehr viel Arbeit).

    Es gibt einen großen Array (replicated), wo alle Objekte, Spieler, Raumschiffe und Planeten drin gespeichert sind. Die Variable, die für den Array genutzt wird, enthält ungefähr das: Position (mit 3x Int64 als eigen erstellten Vektor; 1 LE 0,01 cm), Rotation, Actor Reference, ...

    Wenn sich nun der Spieler nach vorne bewegen will, übermittelt er es dem Server und der fügt bei dem Array in dem richtigem Eintrag was bei der Position hinzu.

    Damit die Änderungen des Arrays bei dem Client angenommen werden, werden in jedem Frame alle Objektpositionen und -rotationen auf die Objekte übernommen (SetActorTransform bei dem Client).

    So gibt letztlich der Array an, was wirklich gerade passiert und jeder Client rechnet für sich selber die nahen Objekte aus. Die Berechnungen haben jedoch keinerlei Einfluss auf den Array.

    Es sind natürlich noch sehr viele anderen Sachen, die hier gemacht werden müssen, jedoch ist das erstmal das wichtigste.


    Da kommt jedoch schon das erste Problem:

    Die Kollisionen (damit die Objekte nicht durcheinander durch fliegen können) können nur auf zwei Wege berechnet werden (mir sind zumindest nach langem Denken keine anderen eingefallen):

    1. Ich lese mich in die Source Files der Engine ein, um herauszufinden, wie Kollisionen eigentlich berechnet werden. Dann führe ich diese Berechnungen in jedem Tick auf dem Server durch. Ich habe mal kurz in die vielleicht dafür zuständigen Dateien reingeschaut. Das ist extremst kompliziert und sehr viel Code.

    2. Die Kollisionen werden auf den Client PCs berechnet (bei den Objekten in der Nähe) und die geben die dann an den Server weiter. Dann ist jedoch das Problem, dass die Clients natürlich falsche Werte zurückschicken könnten und außerdem gibt es dann Probleme, dass die Kollisionen nicht doppelt ausgeführt werden (wenn 2 Clients beieinander sind und beide die gleiche Kollision an den Server melden) usw.


    Das zweite Problem:

    der Client kann natürlich nicht alle Objekt laden und daher sollen nur Objekte im Umkreis von z.B. 20 km geladen werden. Dafür muss der Client bei jedem Objekt folgendes machen:

    if(maxDistance >= ObjektKoordinaten - Player Koordinaten)

    Das wird bei meinen Int64 Vector "192 bit >= 192 bit - 192 bit" = pro Bit pro Rechenvorgang fällt ein Herz an --> 384 Hz pro Berechnung eines Objektes, ob es überhaupt gespawnt werden soll (danach muss noch was anderes berechnet werden !). Dann nehme ich wieder das Beispiel mit den 10 mio Objekten --> 1,92 GHz.

    Da noch sehr viel mehr als nur das auf der CPU lastet, ist das viel zu viel Last...


    Es kommen noch viele andere Probleme auf, jedoch sind die zwei hier die wichtigsten.


    PS: ich weiß, dass ich die Planeten nicht wie normale Objekte berechnen kann. Das habe ich zur Vereinfachung weggelassen...

    • Offizieller Beitrag

    Wau sorry aber ich glaube du bist auf dem Holzweg.


    Du wirfst ziemlich viel durcheinander dass meiner Meinung nach nichts miteinander zu tun hat und das für mich so auch keinen Sinn ergibt. Ich glaube einfach mal zu wissen was und wie du denkst.


    1. Die Idee der Chunk Erstellung stammt von Minecraft. Minecraft ist aber Voxelbasierend.

    Das wichtigste: VOXEL SIND NICHT EINFACH NUR CUBES sondern da steckt ein sehr komplexer Algorithmus dahinter der Spezielle Culling und Optimierungsverfahren anwendet.

    Das wichtigst dabei, das Flächen (Keine Polygone) dabei nur gezeichnet werden sofern eine Wahrscheinlichkeit besteht dass sie durch den Player gesehen werden können. Im grunde sind Voxel also jedes bekannte Culling verfahren. Occlusion, Backface usw auf die Spitze getrieben.

    Meiner Meinung nach machen Chunks im Weltraum und großer Entfernung keinen Sinn da Culling im Raum keinen Sinn ergibt.



    2.

    PS: ich weiß, dass ich die Planeten nicht wie normale Objekte berechnen kann. Das habe ich zur Vereinfachung weggelassen...

    Was ist ein Normales Objekt und was ist das Gegenteil davon ? Ich verstehe nicht was du als Normal bezeichnest.

    Als Info: Du kannst Heighmaps auch nicht biegen oder ähnliches Heightmaps sind immer flach und niemals rund. Deswegen musst du meiner Meinung nach deine Planeten aus normalen Meshes erstellen. Oder wie sonst ?

    der Client kann natürlich nicht alle Objekt laden und daher sollen nur Objekte im Umkreis von z.B. 20 km geladen werden. Dafür muss der Client bei jedem Objekt folgendes machen:

    20km sind doch im Weltraum nichts. Willst du dann ein Planten aus 1 Mrd * 20km blöcken zusammen laden ?


    4 Warum machst du es dir so schwer ? Erstell doch ein paar Meteoriten als Animation (Animierte Textur) Steck zwei oder 3 Planes ineinander und hau da die Texturen drauf. SInd die Planes alle Orthografisch in den Achsen XYZ angeordnet kannst du die 3 Planes auch Rotieren lassen es entsteht ein Drei dreidimensionales Bild aus nur 3 Planes mit insgesamt 6 Tris. Davon kannst du sicherlich ne Millonen in deine Szene ballern. 1000000 * 6 = 6 Mllionen Tris ohne Optimierung steckt die locker Engine weg.


    Nun kannst du noch LOD mit ins Spiel bringen wo die Asteroiden zu Meshes switchen wenn man nah an sie rankommt. So hast du auch aus der Nähe die 3D Optik.


    Oder du beschäftigst dich wirklich mit Voxel und baust damit deine Asteroiden und Planten.


    5.Grundsätzlich verstehe ich auch nicht was du letztendlich vor hast. Willst du später dass man jeden Planeten bereisen kann und dort aussteigen kann ?


    Für mich hört sich das wie gesagt seht Stark nach Voxeln an.

  • DarkFaces

    Mit ca. 1000 m/s


    Sleepy

    1. Mit Chunks meinte ich keine Chunks wie Minecraft. Da habe ich vielleicht doch den falschen Begriff verwendet.

    Ich meinte eher, dass ich das Sonnensystem in imaginäre Würfel mit 5x5x5 km aufteile und in jedem Würfel, wo ein Objekt drin ist, ein Level mit 5x5x5 km lade.


    2. Mit anders als normale Objekte meinte ich das:

    Normale Objekte spawne ich nur bis z.B. 20 km Entfernung. Die Planeten und die Sonne spawne ich immer (egal wie weit die weg sind)


    Beim dem letzten Lösungsansatz, den ich eingeworfen habe, will ich das Weltall nicht in Würfel aufteilen, sondern in einem Stück belassen. Der Spieler soll sich dann aussuchen, was er lädt und was nicht.

    Bei Planeten mache ich es dann z.B. so:

    Bei > 2.000 km wird lediglich eine Kugel mit Material gespawnt

    Bei < 2.000 km wird die Kugel langsam in eine Fläche umgeformt, um so am Schluss darauf landen zu können und ein glatte Fläche zu haben. Da will ich dann mit Voxel arbeiten können.


    4. Die Asteroiden usw. will ich mit Voxel machen. Jedoch lass ich das jetzt zur Vereinfachung erstmal weg:

    Du meintest jetzt, dass ich immer alle Objekte sowohl beim Client als auch beim Server spawnen soll (ganz normal spawnen ohne besondere Einstellungen) oder?

    Wenn ich das richtig verstanden habe: da gibt es dann das Problem, dass der Float ab ca 430 km (auf bis zu 0,01 cm Genauigkeit) verfälscht wird und ungenau wird.

    • Offizieller Beitrag

    1. Mit Chunks meinte ich keine Chunks wie Minecraft. Da habe ich vielleicht doch den falschen Begriff verwendet.

    Ich meinte eher, dass ich das Sonnensystem in imaginäre Würfel mit 5x5x5 km aufteile und in jedem Würfel, wo ein Objekt drin ist, ein Level mit 5x5x5 km lade.

    Und warum das ganze ? Ich glaube nicht das du so soviel Performance einsparst. Ich hab kützlich erst in VR Szenen mit einigen Millionen Polygonen getest. Denke du machst dir da zu viele Gedanken.


    Schau dir dazu vielleicht auch mal den Marching Cubes algorithmus an. Das ist zumindest dass was ich unter deiner Chunk Geschichte verstehe.

    Externer Inhalt www.youtube.com
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklären Sie sich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.

    Du meintest jetzt, dass ich immer alle Objekte sowohl beim Client als auch beim Server spawnen soll (ganz normal spawnen ohne besondere Einstellungen) oder?

    Wenn ich das richtig verstanden habe: da gibt es dann das Problem, dass der Float ab ca 430 km (auf bis zu 0,01 cm Genauigkeit) verfälscht wird und ungenau wird.

    Ich frag mich warum die Daten so genau übereinstimmen müssen ? Das Problem ist denke ich ganz klar die Synchronisation von Millionen von Asteroiden und das sind nun mal Millionen von Berechnungen du milisekündlich über das Internet abgeglichen werden müssen. Das wird nicht funktionieren zumindest nicht so wie du dir das wünscht.


    1.Warum muss die Berechnung überhaupt so genau sein ? Mach doch nichts wenn die Flugbahnen von Clint zu Clint unterschiedlich ist. Du synchronisiert einfach nur die Raumschiffe und die Positionen der Himmelkörper ist von Clint zu Clint unterschiedlich.


    Oder du entwickelst eine Formal mit der sich alle Asteroiden nach dieser Formel bewegen. Somit wären die Positionen zwar nicht Synchronisiert aber Identisch.


    Ab 430km ungenau ? Keine Ahnung was für eiin Monitor hast aber ein Pixel Objekt das 430 km von dir entfernt ist, wirst du niemals Pixelgenau darstellen können. Genauer gesagt wirst du ab einer gewissen Entfernung gar nicht mehr und höchsten als einzelnes Pixel darstellen können.


    Auch hierzu schau dir die Lookup Tables in Bezug auf Voxel an. http://transvoxel.org/


    Ich sag dir aber jetzt schon, das Thema geht runter wie Öl und macht soviel Spass wie eine Wurzelbehandlung.

  • Sleepy

    Was ich mit 430 km meinte:

    Ein Float hat 32 bit. Somit kann er theoretisch etwas weniger als diese Zahl speichern:

    43.000.000,00

    Wenn die Zahl zu groß wird, rundet die UE4 zu einem nahen Ergebnis, das mit 32 bit dargestellt wird. So wird dann (Werte sind frei erfunden) aus 100.000.000,00 - - > 97.263.843,37 , da bei dieser Zahl weniger Speicher verbraucht wird.

    Der Server muss jedoch alle Koordinaten speichern und dann würde sich ein Spieler, der eine Koordinate über 430 km hat, nur in großen Sprüngen fortbewegen (er kann sich dann z.B. nicht auf den Zentimeter genau bewegen, sondern nur noch auf den Meter...)


    Ich denke, es ist komisch, wenn der eine Spieler einen Asteroid vor der Nase hat, jedoch ist der Asteroid bei einem Spieler, der nebenan ist, 200m entfernt.

    Das war auch ein Grund, weswegen ich Level Streaming oder World Composition nutzen wollte. Dann werden lediglich benötigte Objekte übers Internet an den Client gesendet. Dadurch wird nicht viel Bandbreite in Anspruch genommen


    PS: die Asteroiden sollen sich nicht bewegen, da es dann zu kompliziert wird. Die sollen immer am gleichem Ort sein, es sei denn ein Spieler bewegt ihn...

    • Offizieller Beitrag

    Was ich mit 430 km meinte:

    Ein Float hat 32 bit. Somit kann er theoretisch etwas weniger als diese Zahl speichern:

    43.000.000,00

    Wenn die Zahl zu groß wird, rundet die UE4 zu einem nahen Ergebnis, das mit 32 bit dargestellt wird. So wird dann (Werte sind frei erfunden) aus 100.000.000,00 - - > 97.263.843,37 , da bei dieser Zahl weniger Speicher verbraucht wird.

    Der Server muss jedoch alle Koordinaten speichern und dann würde sich ein Spieler, der eine Koordinate über 430 km hat, nur in großen Sprüngen fortbewegen (er kann sich dann z.B. nicht auf den Zentimeter genau bewegen, sondern nur noch auf den Meter...)

    Das ist mir schon klar aber spielt das wirklich so eine große Rolle ?


    Ich denke, es ist komisch, wenn der eine Spieler einen Asteroid vor der Nase hat, jedoch ist der Asteroid bei einem Spieler, der nebenan ist, 200m entfernt.

    Das war auch ein Grund, weswegen ich Level Streaming oder World Composition nutzen wollte. Dann werden lediglich benötigte Objekte übers Internet an den Client gesendet. Dadurch wird nicht viel Bandbreite in Anspruch genommen


    Letztlich kommt es doch nur darauf an dass der Spieler nichts davon merkt.

    Muss ich als Player Felsbrocken ausweichen ist es mir durch Wurscht ob mein Mitspieler den selben Brocken ausweichen muss. Was doch zählt ist, dass jeder Spieler für sich durch die Felsbrocken hindurch kommt.

    Theoretisch: Bei den Geschwindigkeiten, im Weltraum, bei der Größe der Schiffe, größe der Asteroiden usw spielen doch Rundungsfehler kaum eine Rolle.

    Es muss sich gut anfühlen das ist alles.


    Zentimeter genau bewegen, sondern nur noch auf den Meter...)

    Selbst bei der Mondlandung war die Landung nicht cm genau wohl eher Km genau :)


    Was du vorhast ist auf jeden Fall eine riesen Herrausfoderung. Ob das jemals fllüssig läuft ohne zu tricksen mag ich zu bezweifeln.

  • Ein Problem bei der Schaffung eines "echten" Sonnensystems ist, dass es sehr, sehr leer ist.

    Ein Spiel sollte versuchen, Spaß zu machen, bevor es realistisch ist. Die Leute werden merken, wenn sie sich viel schärfer langweilen als wenn die Planeten zu nahe beieinander sind. Die Verwendung von World Composition ist die Lösung. Es gibt einige Probleme, die bei der Komposition von Welten im Mehrspielermodus auftreten. Wenn sich der Server und der Client auf Kachel 1 befinden und der Server weit genug entfernt ist, um Kachel 1 zu entladen, fällt der Client durch die Kachel und einige andere Probleme. Wenn Sie jedoch den Weltursprung deaktivieren, können Sie beim Verschieben eine gekachelte Welt mit einem dedizierten Server ausführen. Dedizierte Server laden alle entfernungsabhängigen Ebenen und jeder verbundene Client funktioniert wie gewohnt und lädt nur Level, die die Einstellungen für die Streaming-Distanz erfüllen. Ein Server enthält eine Liste der sichtbaren Level für jeden Client und filtert die Actor-Replikation anhand dieser Liste.

  • Warum möchtest du denn alles in realen Größen und Entfernungen darstellen?

    Falls es dir um Realismus geht, dann wird das ein sehr langweiliges Spiel.


    Du sagst der Spieler bewegt sich mit 1000m/s.


    Die kürzeste Entfernung zwischen Erde und Mars beträgt 54.5 Millionen Kilometer.

    Bei 1 km/s sind das 54.5 mio. Sekunden, oder eben rund 631 Tage.

    Nur das man aus verschiedenen Gründen wohl nie auf dem kürzesten Weg dort hinkommen wird.


    Den an sich langweiligsten Aspekt an Weltraum-Spielen, den Flug durch die Leere, zu nehmen und noch auf die Spitze zu treiben halte ich jedenfalls für keine gute Idee.


    Schiffen anderer Spieler wird man bei derartigen Dimensionen wohl auch eher nicht begegnen und wenn doch, dann schießen die mit enormer Geschwindigkeit aneinander vorbei, denn für Dogfights oder Versteckspiel im Asteroidenfeld (k.a. ob sowas geplant ist) ist die Geschwindigkeit dann wieder viel zu hoch.

  • pgsein

    Kennen Sie eine Funktion, mit der ich die World Composition automatisch erstellen kann? Denn mehrere mio Level manuell zu platzieren, finde ich etwas aufwendig ^^


    kraid

    Hatte ich falsch geschrieben:

    Das Raumschiff kann auf bis zu 1000 m/s beschleunigen. Man kann jedoch auch nur z.B. 10 m/s fliegen.

    Außerdem soll es einen Hyperraum geben. Dann kan man in ner Minute von Planet zu Planet.


    Warum ich so viel leeres Weltall machen will:

    Ich will, dass das Spiel realistisch ist. Letztlich wäre man dann eh hauptsächlich nur in der Nähe von Planeten und nicht im leerem Raum.

    Außerdem machts vom Programmieraufwand (denke ich) letztlich keinen Unterschied, ob 500 Mm (500.000 km) oder ob 50 Gm (50.000.000 km)

  • Der Weltraum ist doch eh überall gleich, abgesehen von seinen Objekten (Planeten, Asteroiden etc.). Das heißt, du kannst doch theoretisch die Umgebung simulieren und die Objekte dann dementsprechend spawnen, wenn du sie brauchst.
    Die Entfernung zu einem Planeten simulierst du einfach, in dem du die Größe skalierst und ihn nicht tatsächlich 2000km entfernt zum Raumschiff plazierst. Statt dessen, wenn du dann mit dem Raumschiff auf den Planeten "zufliegst", wird in Wirklichkeit nur der Planet der Geschwindigkeit des Raumschiffs anpassend, dementsprechend größer skaliert. So kommt dein Raumschiff dem Planeten auch Näher.
    Dein ganzer Weltraum könnte somit ohne weiteres auf 5km X 5km Platz finden.

    Statt den Spieler in deinen realistischen Weltraum zu bringen, bring lieber den Weltraum zum Spieler. ;)

  • Der Weltraum ist verflucht groß, den im ganzen auf dem Server zu laden is völlig unnötig. Du solltest mehrere Server zusammenschalten. Ein Server sorgt im "Hyperraum" dafür, dass sich die Spieler sehen und zueinander reisen können. Treffen sich 2 Spieler im Hyperraum und die fallen raus, um sich zu bekämpfen, dann werden diese 2 Spieler auf einen Dedicated Server verfrachtet (oder eben Listen Server) Hier hast du dann deine kleine Map mit ein paar Asteroiden, Raumstationen und Planeten. Ich denke du hast vermutlich schon mal Elite Dangerous gespielt, ansonsten schau dir das mal an, die machen das vermutlich so oder ähnlich.


    My 2 cents zum Thema Space und Asteroids:


    Externer Inhalt youtu.be
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklären Sie sich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.

  • Wen du das realistisch haben möchtest, müsst du dir keine Gedanken über zu viele Asteroiden machen.Astronomen schätzen, dass die durchschnittliche Entfernung zwischen zwei Asteroiden im Asteroidengürtel etwa 966.000 km beträgt. Dies ist ungefähr das 2,5-fache der Entfernung zwischen der Erde und dem Mond.

  • Ich habe inzwischen bemerkt, dass World Composition allein gar nichts bringt, da man da recht schnell das Maximum erreicht (die Position der Level kann man mit "nur" 32 bit festlegen).


    MAXX

    Sowas in der Art habe ich mir auch schon überlegt (eine Mischung aus deinem Vorschlag und meiner eigentlich missglückten Gedankenspielerei aus #4). Das Problem ist, dass ich bisher keine Möglichkeit gefunden habe, einen Hauptserver zu erstellen, der für jedes andere Level einen Nebenserver erstellen kann.

    Hat die UE4 sowas schon integriert oder gibt es dafür ein gutes Plugin?

    Natürlich könnte ich theoretisch ein Programm schreiben (nicht mit UE4, sondern mit Visual Studio), das sich die Daten von allen Servern abgreift und das exe Dateien öffnen kann, um einen neuen Server zu öffnen und zu verwalten. Das hört sich jedoch für mich nicht allzu performant an...


    pgsein

    Ich habe mit Asteroiden hier im Thread Meteoroiden und Asteroiden gemeint. Hatte jedoch keine Lust immer Meteoroiden und Asteroiden zu schreiben. Im Spiel würde ich dann eh durch ein Zufallsprinzip entscheiden lassen, ob es sich um einen Asteroiden oder um einen Meteoroiden handelt (bzw. wie groß der Gesteinsbrocken ist).

  • Du könntest dein Problem auch andersrum betrachten. In einem einzigen Level kannst du ein Universum verstecken. Der Spieler bewegt sich fast garnicht, immer wenn er sich von einem Objekt weg bewegt, dann schrumpfst du das Objekt. Dafür gibt es nun genug Möglichkeiten in der UE4. Bewegst sich der Spieler auf ein Objekt zu, skallierst du es größer.


    Mars und Erde können so bspw. 2km auseinander liegen und trotzdem sind sie ewig weit getrennt. Das was du als Spieler wahrnimmst ist noch nicht das, was tatsächlich programmiert ist. Bestest Beispiel ist NoManSky. Da liegen die Planeten letztlich nebeneinander, die Immersion entsteht ausschließlich durch die Karte und die Entfernungsangaben.