Displacement und collision

  • Ich schon wieder :)


    Ich beschäftige mich gerade mit Displacement Texturen für mein Landscape.

    Den Schleier bin ich ja, dank euch, jetzt losgeworden.


    Die Displacement Texturen haben natürlich keine collision und der Charakter versenkt seinen Fuß selbst in der härtesten Steinplatte. (s. Bild , rechte Dame , rechter Fuß)


    Gibt es für das Landscape da eine Lösung ? Sowas wie "use complex as simple" bei den Meshes ?


    Nur nebenbei:

    Bin auf die Idee gekommen ein zweites Landscape mit einer Displacement Textur (Hier die kleineren Steine) zu versehen und es langsam unter das erste zu verschieben (Große Felsplatten).

    Gibt eine schöne Überblendung.

    Ich weiß: Gibt auch sowas wie hieght layer blend. So passt es aber auch für mich.


    Gruß

    Ingo

    • Offizieller Beitrag

    Eine Warnung vorab: Die Idee hinter Displacement ist genau das Gegenteil – also nicht für Kollisionen genutzt zu werden. Wenn man eine Displacement-Map in ein 3D-Mesh umwandeln würde, entstünde ein extrem komplexes Modell, bei dem die Kollisionsberechnungen sehr aufwendig wären.

    Aus Performance-Gründen ist das keine gute Idee. Das nur mal als Disclaimer.

    Möglichkeiten zur Lösung:

    1. Simple Collision funktioniert nicht mit Displacement.
    2. Tessellation-Kollision aktivieren
      Falls du Tessellation nutzt (was vermutlich der Fall ist), kannst du in den Landscape Settings die Option "Use Tessellation Collision" aktivieren. Das funktioniert jedoch noch nicht mit Nanite – daran wird derzeit gearbeitet.

      Diese Methode ist aber aus Performance-Sicht die schlechteste, da sie extrem rechenintensiv ist. Technisch gesehen wäre es genau das, was du suchst, aber nicht die beste Lösung.

    3. Bessere Lösung: Physik-Proxy verwenden
      Wie bereits erwähnt, ist die Kollision bei Displacement sehr komplex.

      Ein Collider ist im Grunde eine zweite Hülle, die über das eigentliche Objekt gelegt wird – vergleichbar mit einer Jacke oder Hose, die perfekt am Körper sitzt.

      Ein Mesh Collider ist eine 1:1-Kopie des ursprünglichen Meshes und wird als Kollisionsform genutzt. Doch genau das ist nicht gut für die Performance.

      Stell dir einen Türrahmen mit sehr feinen Details vor – mit sichtbaren Nägeln und ausgearbeiteten Holzmaserungen. Würde man für so ein detailliertes Objekt eine exakte Kollision berechnen, wäre das extrem aufwendig. Deshalb nutzt man in solchen Fällen ein Proxy Mesh – also ein vereinfachtes Modell mit weniger Details (ohne Nägel etc.).

      Wenn du also dein Terrain als 3D-Mesh exportierst und dieses stark reduzierst (als grobe Form des Terrains), kannst du es als vereinfachtes Collision Mesh nutzen.

      Dieses Kollisions-Mesh wäre für den Spieler unsichtbar, aber deutlich performanter, da es eine einfache Geometrie hat.

    In der Spieleentwicklung wird viel getrickst – und zwar so, dass der Spieler es nicht merkt. Terrains bestehen oft aus einer Kombination von Heightmaps, Displacement, Vertex Paint und verschiedenen Meshes, z. B. Straßen, Häusern oder Felsen.

    Auf diese Weise lassen sich bestimmte Details oder Übergänge im Terrain geschickt verbergen. Mehrere Terrains können ebenfalls eine Lösung sein, und es gibt verschiedene Blend-Methoden, um sie nahtlos miteinander zu verbinden.


    Das schöne bei einer Terrain Mesh Kombination ist auch, dass das Culling Meshes ausblenden kann die nicht im Sichtbereich des Players liegen.

    Oder anderst gesagt:

    Hast du ein Komplexes Terrain hat dein Rechner viel zu berechnen. Hast du Meshes in deiner Szene die gerade nicht gesehen werden, müssen diese gar nicht berechnet werden.

    Daher kann es manchmal sinnvoll sein das Terrain nicht zu sehr mit Details vollzustopfen und mehr auf das Culling zu vertrauen.


    Zum Thema Performance kannst du dir auch mal das Levelstreaming anschauen.


    Ein Gedanke:

    Du befindest dich auf einem Terrain. In der Mitte dieses Terrains gibt es eine Triggerbox, die etwa 60 % kleiner ist als das Terrain selbst. Das bedeutet, dass es außerhalb der Triggerbox einen Bereich gibt, der nicht abgedeckt ist – eine Art Todeszone, in der das Levelende droht.

    Solange du dich innerhalb der Triggerbox befindest, ist alles in Ordnung. Doch sobald du sie verlässt und Gefahr läufst, in die Endlosigkeit zu stürzen, wird das nächste Terrain eingeblendet. Befindest du dich dort in der Triggerbox, wird das vorherige Terrain ausgeblendet.

    Der Spieler merkt davon nichts, aber du kannst mehrere kleine Terrains statt eines großen verwenden. Dadurch wird die Kollisionsberechnung weniger komplex und die Performance verbessert sich.


    Wenn man von Performance spricht meint man meistens die Frame Darstellung pro Sekunde. zb keine Ruckler und ein flüssiger Spielverlauf.


    Es gibt aber noch einen weiteren Nachteil, insbesondere bei großen Meshes – nicht nur ihre Größe an sich, sondern auch die Dateigröße in Kilobytes oder Megabytes kann sehr hoch sein. Für einen Rechner macht es einen großen Unterschied, ob er ein 4-GB-Mesh einblenden soll oder ein Mesh, das nur wenige Kilobytes groß ist.

    Das gilt besonders dann, wenn die Daten an die Grafikkarte übertragen werden und der Videospeicher (VRAM) nicht ausreicht.

    Bei Android und iOS gibt es daher sogar Beschränkungen, wie groß ein einzelnes Mesh maximal sein darf.

  • Danke für die ausführliche Antwort.

    Ich denke mittlerweile das es ohne collision eh besser ist.

    Die Spielfigur kommt dann sicher auch ins stolpern (Ansicht wackelt).

    Im Moment bin ich doch so ganz zufrieden.


    Trotzdem Danke