Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

techtreedev

Frischling

  • »techtreedev« ist der Autor dieses Themas

Beiträge: 49

Wohnort: 127.0.0.1 | localhost

Beruf: Webentwickler

  • Private Nachricht senden

1

28.12.2016, 21:33

Unity - Krater im Terrain

Grüße,


Bitte Verschieben, falsches Subforum :c

Es gab ja mal eine Zeit, in der Artillerieprojektile nicht zwangläufig explodieren mussten, womit es im bereich des 16.-19. Jh. oft zu (teils beabsichtigten) Abprallschüssen kam. Optisch sieht das dann eher aus wie eine Langgezogene Bremspur aus Erde. Daneben gab es auch die Klassichen Explosiongeschosse, die einen Krater hinterlassen habe.

Diesen Effekt würde ich gern in Unity für mein Projekt rekreieren.

Im Moment wäre mein Gedanke einfach Prefabs für die Kraterformen zu haben, welche dann abhängig von Projektilgeschwindigkeit, - Winkel, -Typ auf das Terrain am Ab-/Aufprallort instanziiert werden. Dazu noch ein nettes Paar Partikel und fertig.

Nun meinte jemand, dass das auch über das Unity Terrain gergelt werden kann und dass das auch sinnvoller wäre.

Der API nach wäre das über TerrainData möglich, ich würde instinktiv auf eine Funktion tippen, die di Höhe rediziert und dann nex Textur drüberklatschen. Ist das der Korrekte ansatz?
Game-Designer und Entwickler bei Coffee Peak Games.

Thread zu unserem Projekt: Pro Gloria et Patria - das rollenspielbasierte RTS

-- Wir würden uns über Support in den Sozialen Netzen freuen.

Facebook: https://www.facebook.com/coffeepeakgames
Twitter: https://twitter.com/coffeepeakgames

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »techtreedev« (28.12.2016, 22:59)


KeksX

Community-Fossil

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

2

29.12.2016, 00:54

Ja, das Terrain ist schließlich nur eine heightmap. Du kannst auch die Texturen direkt ändern.

Gibt es denn konkrete Probleme, die du dabei hast?
WIP Website: kevinheese.de

techtreedev

Frischling

  • »techtreedev« ist der Autor dieses Themas

Beiträge: 49

Wohnort: 127.0.0.1 | localhost

Beruf: Webentwickler

  • Private Nachricht senden

3

29.12.2016, 01:14

Da ich noch recht neu in Unity bin wäre die konkrete Umsetzung das Problem. Mit einem modell würd ich einfach am Colliderpunkt eine Instanz spawnen und das wars. WIe kann ich dem Fall die Heightmap anhand von Winkel und Geschwindigkeit ändern? Das ist für mich nur schwer nachvollziehbar. Die API ist mit den einen oder zwei Sätzen pro Funktion auch nicht gerade hifreich. Lade ich eine Vorgefertigte Map/Brush drüber oder wie funktioniert das?

Angenommen, ich habe jetzt einen Vector3 als Hitpoint, wie fahre ich da fort? Zusätzliche habe ich eine Heightmap eines potentiellen Kraters.
Game-Designer und Entwickler bei Coffee Peak Games.

Thread zu unserem Projekt: Pro Gloria et Patria - das rollenspielbasierte RTS

-- Wir würden uns über Support in den Sozialen Netzen freuen.

Facebook: https://www.facebook.com/coffeepeakgames
Twitter: https://twitter.com/coffeepeakgames

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »techtreedev« (29.12.2016, 01:23)


Renegade

Alter Hase

Beiträge: 494

Wohnort: Berlin

Beruf: Certified Unity Developer

  • Private Nachricht senden

4

29.12.2016, 21:31

Da ich noch recht neu in Unity bin wäre die konkrete Umsetzung das Problem. Mit einem modell würd ich einfach am Colliderpunkt eine Instanz spawnen und das wars. WIe kann ich dem Fall die Heightmap anhand von Winkel und Geschwindigkeit ändern? Das ist für mich nur schwer nachvollziehbar. Die API ist mit den einen oder zwei Sätzen pro Funktion auch nicht gerade hifreich. Lade ich eine Vorgefertigte Map/Brush drüber oder wie funktioniert das?

Angenommen, ich habe jetzt einen Vector3 als Hitpoint, wie fahre ich da fort? Zusätzliche habe ich eine Heightmap eines potentiellen Kraters.


Um die Höhe eines Bereiches zu setzen kannst du TerrainData.SetHeights verwenden. Da das Terrain zwei-dimensional zzgl. einer Höhe ist, erwartet diese Methode von dir den Offset und ein zwei-dimensionales Array zum setzen aller Höhen ab diesem Punkt.

Desweiteren werden die verschiedenen Texturen die du im Inspector einem Terrain zuweist beim Zeichnen in einer SplatMap gespeichert. Diese kannst du aber auch via Code verändern, siehe TerrainData.SetAlphaMaps. Dabei erwartet die Methode von dir wieder einen Offset, aber nun ein drei-dimensionales Array mit den Koordinaten und desweiteren die Anzahl der zu verwendenden Texturen.

Behaupten wir mal, wir möchten ein TerrainData also in einem bestimmtem rechteckigen Bereich in seiner Höhe und dessen SplatMap verändern (Wir haben im Inspektor zwei Texturen dem Terrain zugewiesen: Eine Gras-Textur (Position 0) und eine zweite Verbrannte-Erde-Textur (Position 1). Das könnte in der Praxis dann ungefähr so aussehen:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
   void CrateIntoTerrain(TerrainData terrain, int offsetX, int offsetY, int areaX, int areaY, float height) {

        float[,] area = new float[areaX, areaY];

        for (int x = 0; x < area.GetLength(0); x++) {
            for (int y = 0; y < area.GetLength(1); y++) {
                area[x, y] = height;
            }
        }

        data.SetHeights(offsetX, offsetY, area);

        float[,,] splat = new float[areaX, areaY, 2];

        for (int x = 0; x < splat.GetLength(0); x++) {
            for (int y = 0; y < splat.GetLength(1); y++) {
                splat[x, y, 0] = 0.0f;
                splat[x, y, 1] = 1.0f;
                //du kannst die Intensität der Texturen auch mittels der Höhe setzen:
                //splat[x, y, 0] = height;
                //splat[x, y, 1] = 1 - height;
            }
        }

        data.SetAlphamaps(offsetX, offsetY, splat);
    }


https://docs.unity3d.com/ScriptReference/TerrainData.html

PS: Der tatsächliche Punkt im Raum (Vector3-Position) und die dazugehörige Koordinate im TerrainData ergibt sich aus der TerrainData.size (absoluten Welteinheiten) und dessen (relative) Höhe TerrainData.heightmapHeight und (relative) Breite TerrainData.heightmapWidth.
Liebe Grüße,
René

Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von »Renegade« (29.12.2016, 21:54)


techtreedev

Frischling

  • »techtreedev« ist der Autor dieses Themas

Beiträge: 49

Wohnort: 127.0.0.1 | localhost

Beruf: Webentwickler

  • Private Nachricht senden

5

30.12.2016, 13:28

Hey, danke für die Antwort.

2 Dinge.

1.) ist mir schon mit meinem Prefab Workaround aufgefallen; warum akzeptieren die TerrainData Methoden nur Integer?
2.) float[,,], was bewirkt das? sieht sehr interessant aus. Um ein begrenztes Array zu erzeugen?
Game-Designer und Entwickler bei Coffee Peak Games.

Thread zu unserem Projekt: Pro Gloria et Patria - das rollenspielbasierte RTS

-- Wir würden uns über Support in den Sozialen Netzen freuen.

Facebook: https://www.facebook.com/coffeepeakgames
Twitter: https://twitter.com/coffeepeakgames

KeksX

Community-Fossil

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

6

30.12.2016, 13:54

1) Naja weil nur Integer benutzt werden. ^^ Außer für thickness oder wenn Vektoren benutzt werden.
2) Bei [,,] handelt es sich einfach um ein dreidimensionales Array. [,] sind zweidimensionale
WIP Website: kevinheese.de

Renegade

Alter Hase

Beiträge: 494

Wohnort: Berlin

Beruf: Certified Unity Developer

  • Private Nachricht senden

7

02.01.2017, 18:13

Hey, danke für die Antwort.

2 Dinge.

1.) ist mir schon mit meinem Prefab Workaround aufgefallen; warum akzeptieren die TerrainData Methoden nur Integer?
2.) float[,,], was bewirkt das? sieht sehr interessant aus. Um ein begrenztes Array zu erzeugen?


1) Weil ein TerrainData mit seiner Höhe, Breite und Tiefe relativ ist. Nehmen wir mal an, du hast eine tolle Heightmap über ein realistisches Terrain von den Alpen aus dem Netz gezogen. Das Ganze hat eine Auflösung von 1024x1024 px und 256 Graustufen (Heightmaps sind immer Grafiken im Graustufen-Format, da tiefster Punkt == 0 == schwarz und höchster Punkt == weiß == 256). Würde diese Heightmap im TerrainData gleich zu den Unity-Einheiten sein, hättest du eine eine Fläche von 1024x1024 Unity-Einheiten. Bei 256 Graustufen dann eben 256 Unity-Einheiten in der Höhe. Das wäre dann ziemlich blöd, wenn der Maßstab ein völlig anderer ist - Sieh es vielleicht ein bisschen wie Prozente.

Deshalb lässt sich in Unity im Inspektor (und auch via Code) von dir einstellen, was die maximale Höhe des Terrains und dessen Abmaße ist (sogar zur Laufzeit!). Sagen wir, du stellst die maximale Höhe mit 600 Unity-Einheiten ein. Dann wäre auf der Heightmap Grau (der Wert 128 ) exakt auf 300 Unity-Enheiten an dieser Stelle. Eben so verhält es sich auch mit der Fläche. Hinzu kommt, das ein Terrain mittels Polygonen (so wie alle Meshes) dargestellt wird. Das heißt je nach von dir eingestellter Auflösung stellt ein Pixel ein Vertex dar - oder anders: Jeder Indice (Integer des Arrays) ist ein Vertice der Heightmap. (Fun Fact: wenn die Höhen von anliegenden Vertices manchmal abnormal unterschiedlich sind, entstehen dadurch diese tollen lang gezogenen Texturen)

Am besten teste es mal selbst aus und erstelle dir in Gimp/Photoshop/Paint mal eine Graustufen-Grafik und male etwas in den verschiedenen Grautönen darauf. Hier findest du ein schönes Video-Tutorial wie du Heightmaps selbst aus Google-Maps bekommst.

2) Wie KeksX richtig gesagt hast ist das die Schreibweise für eine dreidimensionales Array in C#. Sollte es mit der Splatmap dennoch verwirrend sein, gebe ich gerne nochmal ein Beispiel :)
Liebe Grüße,
René

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Renegade« (02.01.2017, 18:19)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

03.01.2017, 06:44

Dann wäre auf der Heightmap Grau (der Wert 128 ) exakt auf 300 Unity-Enheiten an dieser Stelle.
Nicht ganz exakt, oder? Immerhin ist der Maximalwert ja nur 255 und nicht 256. Folglich ist 128 etwas mehr als die Hälfte.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Tiles

Treue Seele

Beiträge: 168

Wohnort: none

  • Private Nachricht senden

9

03.01.2017, 08:47

Zitat

(Heightmaps sind immer Grafiken im Graustufen-Format, da tiefster Punkt == 0 == schwarz und höchster Punkt == weiß == 256)


Die Unity Heightmap arbeitet mit 16 Bit. Das ist ein Exr File. Das sind dann 65535 Graustufen.
Free Game Graphics, Freeware Games https://www.reinerstilesets.de

Renegade

Alter Hase

Beiträge: 494

Wohnort: Berlin

Beruf: Certified Unity Developer

  • Private Nachricht senden

10

03.01.2017, 19:03

Dann wäre auf der Heightmap Grau (der Wert 128 ) exakt auf 300 Unity-Enheiten an dieser Stelle.
Nicht ganz exakt, oder? Immerhin ist der Maximalwert ja nur 255 und nicht 256. Folglich ist 128 etwas mehr als die Hälfte.


Ohja was für ein Fauxpas - danke. Ein Byte hat zwar 256 mögliche Zustände, aber der Wertebereich ist natürlich von 0 bis 255. Demzufolge ist 127 die Mitte. PS: @tech: darüber musst du dir aber weniger Gedanken machen, da man es in Unity von 0 bis 1 setzt.

Zitat

(Heightmaps sind immer Grafiken im Graustufen-Format, da tiefster Punkt == 0 == schwarz und höchster Punkt == weiß == 256)


Die Unity Heightmap arbeitet mit 16 Bit. Das ist ein Exr File. Das sind dann 65535 Graustufen.


Danke für die Information. Hast du dazu vielleicht einen Link?
Liebe Grüße,
René

Werbeanzeige