Beiträge von Timer

    Sleepy

    Das ist schon alles ziemlich genau mit ihm definiert. Ich hab es oben vlt etwas ungenau beschrieben:

    Der Artist hat einen Charakter (der hatte bereits ein Rig, Weight Painting usw.) von mir bekommen und er soll die Rüstung dazu erstellen. Er erstellt das Mesh, er verwendet das Skelett von meinem Charakter und wendet es auf die Rüstung an (inkl Weight Painting), er erstellt die Texturen usw.

    Die Animationen habe ich bereits (das Skelett ist ähnlich dem Mannequin Skelett, sodass ich die UE4 Asset Store Animationen verwenden kann) und ich habe ihm auch mehrere Animationen zum Testen geschickt.

    Angeblich klappt es bei ihm immer und bei mir beim Testen dann plötzlich nicht mehr. Sobald ich ihm dann schön viele Screenshots schicke, fallen ihm die Fehler auch auf...


    Nun hat er geschrieben, dass er die ganzen dreieckigen Polygons vom Charakter in viereckige umwandeln muss, damit die Animationen funktionieren. Denn laut ihm ist es unmöglich, ein Objekt mit dreieckigen Polygonen fehlerfrei zu riggen und zu animieren. Es hat doch jedoch bei meinem Charakter geklappt. Warum soll es nun bei der Rüstung Probleme damit geben? Außerdem sollte die doch eigentlich nichts mit dem Charakter zu tun haben (bis auf das Skelett und der Passform) oder?

    Hi,

    ich habe vor einiger Zeit einem Artisten ein Base Model (ein männlicher, nackter Charakter) geschickt und er sollte dazu eine Rüstung erstellen. Die Rüstung hat er nach einiger Zeit auch endlich hinbekommen, jedoch gibt es nun einige Fehler beim Riggen und Animieren.

    Der Charakter funktioniert ohne Probleme und kann alle Animationen, die ich besitze, ohne Probleme wiedergeben.

    Die Rüstung hat jedoch viele Rigging-/Animationsfehler. Was in den verschiedenen Versionen (der Artist hat die Rüstung schon oft überarbeitet) oftmals beim Bewegen passiert (selbst bei sehr einfachen Animationen wie laufen): es bildet sich ein Riss in der Schulter, Teile des Rückens und des Bauchs stehen 10 cm weg, einzelne Punkte des Gürtels bewegen sich teilweise nicht mit usw.


    Der Artist behauptet nun, dass es daran liegt, dass der Charakter/das Base Model a) Riggingfehler besitzt und b) seine Polygone dreieckig sind.


    Kann es wirklich am Base Model liegen bzw. ist das wahrscheinlich (da das Base Model keine Fehler hat)? Oder bekommt es der Artist einfach nicht hin?

    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).

    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)

    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...

    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.

    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...

    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?

    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.

    Dj EKI

    Danke für die Hilfe. Ich habe es aber inzwischen anders lösen können.


    Ich wollte die Rotation des Players nur auf 0,0,0 setzen, um mir ein paar Sachen zum Programmieren zu erleichtern. Da sind mir jetzt jedoch bessere Ideen gekommen, sodass die Rotation nicht mehr 0,0,0 sein muss, und deswegen mache ich es nun einfach so:

    Player Location ist immer 0,0,0 und die Rotation ist die richtige Rotation des Spielers. Somit muss ich nur noch Objekt Loc - Player Loc und die Rotation vom Array nehmen und schon habe ich das Transform von dem Objekt.

    Dj EKI

    Ich hatte jetzt erst Zeit, deswegen kommt die Antwort etwas verzögert:

    Ich bin mir nicht sicher, ob ich alles richtig verstanden habe (z.B. ob du mit Array und Objekt den neu erstellten Array (den du in deinem 2. Absatz erwähnst) oder den Array mit den normalen Koordinaten (den ich erwähnt hab) meinst).

    So wie ich es jetzt habe, funktioniert es leider nicht.

    Mein Blueprint ist angehängt (die Sequence soll den Start darstellen; als Hinweis: ich benutze meine selbst erstellte Variabel Int64Vector für die Koordinaten des Objektes und habe dafür auch ein paar eigene Funktionen (die sicher richtig sind); der Rest (hoffe ich) sollte selbsterklärend sein).

    Bei Rotation in AngleDeg bin ich mir nicht sicher. Ich habe jetzt einfach mal alle 3 Achsen des Rotators addiert, jedoch bin ich mir nicht sicher, ob ich das anders zu einem Float hätte machen sollen

    Hey,

    mein Vorhaben:

    ich will, dass alle Objekte in einem Array gespeichert werden (mit Koordinaten, Rotation usw.). Beim Anzeigen der Objekte, soll der Spieler immer bei 0,0,0 mit der Rotation 0,0,0 sein und die Objekte sollen dann so gedreht und bewegt werden, dass es für den Spieler ganz normal aussieht (auf den beigefügten Fotos ist das im 2d Raum dargestellt; World COS ist sozusagen der Array und Local COS wie es beim Spieler angezeigt wird). Um die Objekte richtig anzuzeigen muss ich deswegen erst einmal die neuen Koordinaten und die neuen Rotationen ausrechnen lassen.

    Um die Koordinaten auszurechnen, rechne ich einfach Objekt Koordinaten - Player Koordinaten --> RotateVector um die negative Player Rotation. Das funktioniert ohne Probleme.


    Leider bekomme ich es jedoch nicht hin, die korrekte Rotation des Objektes ausrechnen zu lassen.

    Dafür habe ich schon viel rumprobiert. Die vielversprechendsten Lösungen (haben leider nicht ganz richtig funktioniert):

    1.:

    FindLookAtRotation(0|0|0, NeueObjektKoordinaten)

    Delta(AlteObjektRotation - FindLookAtRotation)


    2.:

    Delta(AlteObjektRotation - AltePlayerRotation)



    Hat jemand ne Idee, wie ich die neue Objekt Rotation ausrechnen kann?

    Nach langem rumprobieren, habe ich eine sehr einfache und eigentlich naheliegende Lösung gefunden. Diese zwei C++ Zeilen machen aus einen World Rotator und einem Local Rotator einen World Rotator (genau das, was ich oben gefragt hab):

    Code
    FQuat NewRot=(FQuat)WRot* (FQuat)LRot;
    return (FRotator)NewRot;

    Hey,

    ich will das was hinter dem Node "AddActorLocalRotation" steckt, manuell berechnen lassen.

    Den Grund dafür versuch ich jetzt einfach mal sehr knapp und einfach zusammenzufassen:

    Sobald man in meinem PlayerController die Maus bewegt, soll sich der ganze Charakter und die Kamera bewegen. Normalerweise würde ich das über die oben genannte Funktion machen. In meinem Fall will ich jedoch zuerst noch mit der Rotation, die bei der Funktion rauskommt, rechnen (d.h. die Rotation soll noch nicht direkt auf den Actor angewandt werden, was bei der AddActorLocalRotation Funktion jedoch passiert).

    Ich habe mich jetzt schon in die Source Codes von der Funktion eingelesen, jedoch muss ich zugeben, dass ich da nicht ganz durchblicke (die Funktion teilt sich nach der Zeit in 5 verschiedene Teile auf, denen ich zwar allen kurz gefolgt bin, jedoch finde ich da kein wirkliches Ende ^^).

    Kann mir jemand eine Möglichkeit beschreiben, wie ich die Lokale Rotation selber ausrechnen kann?


    Edit:

    Mir ist egal, ob Blueprint oder C++

    Bob

    Danke. Hab nur oben ein schlechtes Beispiel gebracht. In der Rechnung kann einer der Zahlen auch eine Nachkommastelle beinhalten. Hättest du da auch ne Idee?

    Ich könnte zwar theoretisch alles mal zehn rechnen und in int64 umwandeln lassen (vor der Rechnung) und am Schluss (da ist die Zahl wieder einigermaßen klein) durch zehn teilen und in ein Float umwandeln. Dann müsste ich jedoch meine ganzen Rechnungen umstellen, daher wäre eine andere Methode besser.

    Hey,

    ich habe gerade folgendes Problem:

    ich muss in UE4 sehr große Zahlen ausrechnen lassen (z.B. 2.500.000 * 2.000.000.000). Leider verfälscht Unreal Engine diese großen Ergebnisse, sodass dann als Ergebnis z.B. nicht 5.000.000.000.000.000, sondern 5.000.000.136.282.112 angezeigt wird.

    Ich benutze für die Berechnungen Floats

    Wie kann ich verhindern, dass Unreal Engine die Zahlen verändert?

    Die Zahlen müssen auf mindestens eine Nachkommastelle genau sein.

    Da oben leider (noch) nicht verfügbar: ich benutze UE 4.23

    kyodai

    Danke. Sowas in der Art habe ich gerade auch gefunden. Jetzt weiß ich auch, weswegen ich fast gar nichts für das Thema gefunden habe: das Unreal Wiki wird gerade anscheinend neu gemacht und da sind ein paar Inhalte kurzfristig nicht verfügbar.


    Warum die 2 km:

    Es werden wahrscheinlich viele Objekte (wahrscheinlich auch ein paar mit der neuen Chaos Physic) werden und dann will ich damit nicht das Netzwerk bzw. den Client RAM überlasten

    Und gleichzeitig ist es ne gute Übung ^^

    Ich habe das Problem schon vor einer Woche gelöst, jedoch noch gewartet, bis ich den Thread als erledigt markiere, da ich noch ein paar andere Probleme hatte und nicht wusste, ob ich das allein hin bekomme.

    Ich habe es nun geschafft, das Objekt zu importieren. Zwei Sachen musste ich beim Importieren ändern:

    Normal Import Method: Import Normals and Tangents

    Convert Scene Unit: