- Home /
Question by
O-R-C · Apr 23, 2015 at 05:29 PM ·
proceduralprocedural-generationprocedural-terrain
How to add erosion to terrain on runtime
Hello, I have a script that generates random terrain, but I can not get the terrain to have erosion. Can someone show me how to achieve erosion like looks on a terrain.
Here is the code (It is not mine).
private NoiseModule m_mountainNoise = new PerlinNoise(1);
private NoiseModule m_plainsNoise = new PerlinNoise(1);
private NoiseModule m_mountainNoiseRidged = new RidgedNoise(1);
public TerrainPatch(int globTileX_i, int globTileZ_i, Terrain terrain_i, int h0_i, int h1_i, Vector3 pos_i)
{
globalTileX = globTileX_i;
globalTileZ = globTileZ_i;
terrain = terrain_i;
h0 = h0_i;
h1 = h1_i;
pos = pos_i;
}
private int globalTileX, globalTileZ, h0, h1;
private Vector3 pos;
private Terrain terrain;
public void ExecutePatch()
{
FillTerrainPatch();
if (h1 == InfiniteTerrain.m_heightMapSize)
{
terrain.terrainData.SetHeights(0, 0, InfiniteTerrain.m_terrainHeights); //SetHeights calculates terrain collider
terrain.transform.position = pos;
}
}
private void FillTerrainPatch()
{
int hRes = InfiniteTerrain.m_heightMapSize;
float ratio = (float)InfiniteTerrain.m_landScapeSize / (float)hRes;
float z0 = (InfiniteLandscape.initialGlobalIndex * (InfiniteTerrain.m_heightMapSize - 1)) * ratio;
float z1 = (InfiniteLandscape.initialGlobalIndex * (InfiniteTerrain.m_heightMapSize - 1)) * ratio + hRes * ratio;
float y0 = 0.0f;
float y1 = 1.0f;
for (int z = h0; z < h1; z++)
{
float worldPosZ = (z + globalTileZ * (InfiniteTerrain.m_heightMapSize - 1)) * ratio;
float hx = Mathf.Clamp((y1 - y0) / (z1 - z0) * (worldPosZ - z0) + y1, -4, 8);
for (int x = 0; x < hRes; x++)
{
float worldPosX = (x + globalTileX * (InfiniteTerrain.m_heightMapSize - 1)) * ratio;
float mountainsPerlin = m_mountainNoise.FractalNoise2D(worldPosX, worldPosZ, 4, 3000, 0.4f);
float mountainsRidged = m_mountainNoiseRidged.FractalNoise2D(worldPosX, worldPosZ, 4, 3000, 0.2f);
float height = (mountainsRidged + mountainsPerlin) + 0.03f * hx;
InfiniteTerrain.m_terrainHeights[z, x] = height;
}
}
}
What do I need to change to add in erosion?
Comment
The terrain generated is very smooth. I want it to have water erosion on it, or just even have the surface bumped. Like this.
The terrain here is not rolling hills, but rather it has an eroded surface.
terraintiles.jpg
(244.6 kB)
Your answer
Follow this Question
Related Questions
Procedural terrain bigger than I set it, heightmap slightly off 0 Answers
C# Proceducal Mesh terrain 2 Answers
Procedurally generated (Small)Universe 1 Answer
Proper use of threads with procedural generation 1 Answer
For loop not starting from zero 0 Answers