Terrain zur Laufzeit deformieren

  • Gibt es eine Möglichkeit das erstellte Terrain während dem laufenden Spiel zu deformieren? Wie kann man beispielsweise dynamisch Krater in der Landschaft erzeugen?


    Hier ist ein Beispiel:

    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.

  • Ein Terrain wird ja durch die Heightmap gesteuert, ein Krater wäre demnach nichts anderes als ein Decal an der Stelle in die Height mit einzurechnen wo deine Munition auftrifft.


    Dafür brauchst du entweder nen eigenen Shader oder einen fertigen, der die Heightmap manipulieren kann.

    Ich glaube nicht, dass UE4 ohne weiteres die Heightmap generated Terrains in Echtzeit verändern kann - besonders nicht in der im Video gezeigten Qualität.
    Im Video handelt es sich m.M.n um kein Terrain sondern ein (Static) Mesh mit Tesselation ( Wireframe zeigt deutliche Zunahme der Polydichte zum Spieler hin).



    Gruß,
    Bob

  • Kennt ihr das Spiel Astroneer? Die haben das auch mit der UE4 gemacht, dort ist es viel weitgehender, man kann ein ganzen Planeten deformieren.


    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.

    • Offizieller Beitrag

    Ich glaube nicht, dass UE4 ohne weiteres die Heightmap generated Terrains in Echtzeit verändern kann - besonders nicht in der im Video gezeigten Qualität.
    Im Video handelt es sich m.M.n um kein Terrain sondern ein (Static) Mesh mit Tesselation ( Wireframe zeigt deutliche Zunahme der Polydichte zum Spieler hin).

    Das geht auch mit Unity mich würde es schon sehr wundern wenn das in der UE nicht auch gehen würde.


    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.


    Ein Terrain ist nichts anderes als eine Plane die Tesseliert wird die Technik ist genau die selbe wie beim Tessellation shader ! Gerade Terrains mit sehr viel Details sind sehr Poly intentiv deswegen wird auch hier das Terrain Tessellation.


    Ich kann mir nicht vorstellen wie das sonst funktionieren soll als das Terrain in Echtzeit zu verändern genau das passiert ja beim Tessellation Shader auch in Echtzeit. Ich sehe da kein Problem.

  • Meines Wissens nach ist es nicht ohne erheblichen Änderungen an der Engine Source möglich ein Landscape in Echtzeit zu editieren.
    Ein Terrain in UE4 ist durchaus etwas völlig anderes als nur eine Plane mit Tesselation besonders die Erstellung läuft über die UE4 Development Tools und eben nicht in Echtzeit.


    Aufgrund der im Video sichtbaren Tesselation Effekte ging ich von einer einfacheren (reinen Shader?) Lösung aus.

    • Offizieller Beitrag

    Ein Terrain in UE4 ist durchaus etwas völlig anderes als nur eine Plane mit Tesselation besonders die Erstellung läuft über die UE4 Development Tools und eben nicht in Echtzeit.

    Nein da irrst du dich: Mit dem Terrain zeichnest du genau genommen die Heightmap und nicht das 4D Terrain. Wenn du das Spiel Startest ist dein Terrain für ne Nano Sekunde Flach wie nie Flunder (Plane) und Nur was sich im umfeld des Players befindet wird als Terrain dargestellt. Das Terrain ist also nichts anderes als ein Tesselation Shader der die Heightmap tesseliert und zwar solange bis alle Details entsprechend dargestellt werden können.


    Terrains wie du Sie vielleicht mit viel Details mit dem Terrain Tool Sculptest haben eine riesige Polygonanzahl was bedeutet das niemals das komplette Terrain angezeigt werden kann. Auch Culling funktioniert beim Terrain nicht da das Terrain ein Objekt ist und immer das gesamte Terrain oder gar kein Terrain angezeigt wird. Aus dieses Grund wird beim Terrain schon immer der tessellation (Trick) verwendet.


    Besonderheiten vom Terrain sind:
    1.Es wird tesselliert
    2.Texturen werden nicht aufs Terrain gezeichnet sondern es wird eine Maske aufs Terrain gezeichnet wo durch festgelegt wird welche Textur an welcher Stelle im Terrain zu sehen sein soll. (Jede Textur wird einfach nur gekachelt)
    3.Terrains sind Flach und werden erst durch die Heightmap in Player nähe in die Höhe gerechnet = Tessellation. (Es wird niemals das gesamte Terrain im Spiel auf einmal angezeigt ich denke nun ist klar wieso)
    4.Die Auflösung eines Terrains ist immer davon abhängig wie nahe du mit dem Player dran bist.
    5.Terrains sind keine 3DMeshes sondern Planes


    WIe gesagt: Ich sehe die einzigeste Möglichkeit direkt die Heightmap zu manipulieren und decals an den entsprechenden Stellen einzurechnen so das es einen Krater oder einen Hügel gibt falls jemand ne andere Möglichkeit kennt das würde mich auch interessieren. Ich glaube wenn man sich mit dem Heightmap Shader ein bisschen beschäftigt und versteht wie er funktioniert kann man da bestimmt tolle Shader schreiben


    Das Problem ist wie gesagt: Das Terrain ist nur eine Heightmap (Flach) die Geometrie wird durch die Heightmap bestimmt wodruch es nur logisch ist das man die Oberfläche durch die Height ändern kann. Das Wireframe kann man sicherlich nicht ändern da die Engine auch in Echtzeit mit der Heightmap arbeitet.



    Meines Wissens nach ist es nicht ohne erheblichen Änderungen an der Engine Source möglich ein Landscape in Echtzeit zu editieren.

    Kann sein keine Ahnung eventuell reicht aber auch Shader Programmierung ich denke es muss da auch nen einfacheres Weg geben da ran zu kommen.

  • Vom Terminus her sind wir dann bei einer Plane ja.
    Mein Gedanke ging eher im Bereich der Verarbeitung dieser Plane und diese ist definitiv anders als eine normale (static) Mesh Plane + Heightmap.
    Deshalb meine Überlegung weg vom Landscape hin zum (static) Mesh was Deformationen deutlich vereinfachen würde.

    • Offizieller Beitrag

    Es gibt ja schon gründe warum man eine Heightmap verwendet = Wegen der Performance dafür nun eine statisches Mesh zu manipulieren ist denke ich eher unperformant.


    Ein statisches Mesh wäre dann eher ein Rückschritt zumindest was die Performance angeht das merkt man dann wenn man einge Hügel gesetzt hat sehr schnell.


    Die Terrain Farbe basiert ja auch auf Vertex Color ich frag mich die du die dann bei einem Statischen Objekt anpassen willst Du müsstest ja dann theoretisch ne Automatische UV erstellen und die Pixel an der richtige Stelle zeichen.
    Ich glaube er Weg ist deutlich komplizierter als den Quellcode zum zu schreiben.

  • Die Frage wurde aber ohne weitere Hintergründe gestellt.
    Technisch gesehen gibt es eine Vielzahl von Möglichkeiten diesen Effekt zu erreichen.
    Um wirklich über die Performance zu diskutieren bräuchte man mehr Informationen was genau geplant ist.
    Auf Distanz basierende Tesselation sollte kaum einen großen Unterschied zum Landscape machen.

    • Offizieller Beitrag

    Was spricht den dagegen direkt die Heightmap zu manipulieren ?
    Du kannst auf eine Height vielleicht ein Objekt erzeugen und so ein Hügel oder ein Mesh auf dem Terrain plazieren aber du kannst keine Löcher ins Terrain machen oder Krater darstellen.
    Mir würde kein andere Lösung einfallen als direkt die Height zu verändern.


    Ich denke jede andere Variante ist unperformanter die Heightpipes sind ja eine Performante Pipeline die man einfach verwenden kann. Da nen anderen Weg zu finden ist in meinen Augen definitiv umständlicher und unperformanter egal wie die Details aussehen.

  • Dagegen spricht nichts, ich möchte nur Lösungsansätze geben.
    Wenn ausreichend Erfahrung und Können dabei sind ist dieser Weg der logischste und wahrscheinlich performanteste.
    Eine einfachere Möglichkeit ist m.M.n. aber diesen Weg zu umgehen indem ein normales Mesh genutzt wird und dort durch WorldPositionOffset und Tessselation die Deformation erzeugt wird.


    Für eine so komplexe Deformation wie im zweiten Video gezeigt wäre definitiv der erste Weg zu bevorzugen.
    Im ersten Video wird nur ein gleichbleibender Krater erzeugt und deshalb gehe ich davon aus, dass dort mein angesprochener Weg gegangen wurde.

    • Offizieller Beitrag

    Für eine so komplexe Deformation wie im zweiten Video gezeigt wäre definitiv der erste Weg zu bevorzugen.
    Im ersten Video wird nur ein gleichbleibender Krater erzeugt und deshalb gehe ich davon aus, dass dort mein angesprochener Weg gegangen wurde.

    Du kannst keinen Krater in ein Terrain reinmachen ohne die Heightmap zu manipulieren wie soll das gehen ?
    Du kannst auf einem Terrain ein neues Mesh generieren und somit Hügel und Berge als separates Objekt auf das Terrain sehen aber du wirst dann niemals einen Krater ins Terrain machen können oder wie soll das funktionieren ?


    Sorry Bob aber ich glaube nicht das dein Weg funktioniert zumindest nicht so wie in dem ersten gezeigten Video. Es ist einfach nicht möglich Löcher oder Krater in ein Terrain reinzumachen da das Terrain durch die Height bestimmt. Jede Änderung änderung am Terrain müsste in der Height passieren da führt kein Weg außen rum.


    Falls du doch ne Möglichkeit kennst würde mich das echt interessieren aber ich kann man das technisch einfach überhaupt nicht vorstellen.


    wenn ich das richtig verstehe ist die Manipulation des Landscape zur laufzeit nur möglich wenn man den Quellcode ändert.

    Ich bin mir sehr sicher das das im Unity Projekt auch nicht anderst gelöst ist wie sagt das Terrain wir eh in Echtzeit aus der Height ausgelesen ich denke das Problem ist eher wie man etwas in die Heightmap reinschreibt oder zwei Heightmaps in echtzeit kombiniert.



    Du Spawnst den Krater als Heightmap an der Stelle wo die Bombe aufschlägt je nach ob du einen Berg setzen willst und ein Krater an der Stelle haben willst brauchst du entweder einen positive oder eine negative Heightmap.
    Du Kombiniertst die bestehende Heightmap mit der Krater heighmap daraus genieriest du ein neue Heightmap die du durch die alte ersetzt. Bei jeder Änderung wird die Heightmap aktuallisiert.
    Somit kannst du vom Terrain abtragen oder etwas hinzufügen.

  • Die Idee ist nicht einen Krater in ein Terrain "reinzumachen" sondern garkein Terrain/Landscape zu nutzen.
    Ablauf wäre grob der folgende:
    1) Static Mesh Landscape
    2) World Position Offset wird angepasst am Impact Point des Meshes z,B. durch WPO Textur
    3) Impact Point + Decal um Verzerrungen zu kaschieren

    • Offizieller Beitrag

    Die Idee ist nicht einen Krater in ein Terrain "reinzumachen" sondern garkein Terrain/Landscape zu nutzen.
    Ablauf wäre grob der folgende:
    1) Static Mesh Landscape
    2) World Position Offset wird angepasst am Impact Point des Meshes z,B. durch WPO Textur
    3) Impact Point + Decal um Verzerrungen zu kaschieren

    Okay dann hast du ein riesiges Terrain und wie machst du die Textur nur auf dein Mesh ? Du hast zb ein Terrain das 16 * 16km Groß ist, würdest du eine 16k textur verwenden hättest du 1 Pixel pro qm. Du brächstest dann auch Vertex Paint in deinem Mesh und spätestens dann darfst du auch am Quellcode rumschreiben.


    Es gibt einen Grund warum man für Terrains Heightmaps und keine Meshes verwendet.


    Auch hast du dann das Problem das umso mehr Hügel du machst umso instabiler wird ein gesamtes Terrain weil es nicht tesseliert wird oder wie willst du das bei einem Mesh in Echtzeit bewerkstelligen ?
    Umso mehr du am Mesh änderst umso unperformanter wird es.


    Deine Lösung müsste man wenn dann komplett Voxel basierend machen dann würde deine Idee ähnlich wie bei Minecraft oder no man Sky funktionieren. Dann wäre die Oberfläche auch performant genug.

  • wie sagt das Terrain wir eh in Echtzeit aus der Height ausgelesen

    Ich hab keine Ahnung wie es gemacht wird, aber das kann ich mir nicht vorstellen.
    Die Technik dahinter wird wohl etwas komplexer sein als jedes Frame zu schauen welcher Vertex ist gerade im Bild, die passenden Heightmap Pixel raussuchen und LOD berechnen um dann das ganze zu rendern.


    Das Terrain zu deformieren ist auf alle Fälle was für fortgeschrittene Entwickler.

  • Das Problem sehe ich nicht.
    Texturen werden ob Mesh oder Landscape genau gleich durch Layer umgesetzt.
    Du kannst auch gerne eine Heightmap auf eine flache Plane legen, dass macht keinen Unterschied.
    Tesselation basierend auf der Kamera Distanz ist kein Problem in Echtzeit.


    Ich bin gerade auf dieses Video gestossen welches meinen Ansatz weitestgehend umsetzt - sogar mit einem Landscape.


    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.

  • Vorausgesetzt dein Spiel soll nicht unter Linux und wahrscheinlich auch Mac erscheinen. Die Engine scheint unter OpenGL keine Tesselation zu unterstützen.
    Edit also auch auf nicht Microsoft Consolen ein Problem.

    Tesselation ist in diesem Fall auch optional und nicht unbedingt notwendig.
    Wer ein Spiel auf allen Plattformen anbieten möchte und einen solchen Effekt erzielen möchte wird auch das nötige Budget für eine Echtzeit Berechnung des Landscapes haben.