2014-06-25 13 views
8

voglio generare qualcosa di simile: cliffs
Io uso Perlin Noise con curva stretta, il mio codice produce quelle scogliere: my cliffs .Cliffs generazione del terreno in Minecraft-come il gioco

for (int x = 0; x < sizeX; x++) 
    { 
     for (int z = 0; z < sizeZ; z++) 
     { 
      int floorY = map.GetMaxYNotWater(x, z); 
      float n = hillsNoise.Noise(x, z); 
      int hillY = (int)(curveHills.Evaluate(n) * 80f); 
      if (hillY > floorY + 5) 
      { 
       for (int y = hillY; y > floorY; y--) 
       { 
        map.SetBlock(GetBlock(y), new Vector3i(x, y, z)); 
       } 
      } 
     } 
    } 

Come posso "tagliarli" per appendere oggetti?

ho cercato di fare in questo modo con la curva aggiuntiva:

for (int x = 0; x < sizeX; x++) 
    { 
     for (int z = 0; z < sizeZ; z++) 
     { 
      int floorY = map.GetMaxYNotWater(x, z); 
      float n = hillsNoise.Noise(x, z); 
      int hillY = (int)(curveHills.Evaluate(n) * 80f); 
      if (hillY > floorY + 5) 
      { 
       int c = 0; 
       int max = hillY - floorY; 
       max = (int)(max * curveHillsFull.Evaluate(n)) + 1; 
       for (int y = hillY; y > floorY && c < max; y--, c++) 
       { 
        map.SetBlock(GetBlock(y), new Vector3i(x, y, z)); 
       } 
      } 
     } 
    } 

ma produce isole volanti. Flying islands Quindi, cosa posso fare per ottenere i primi risultati di screenshot?

+0

cosa succede se si "sottrae" il risultato del secondo algoritmo per il risultato del primo ? Questo farebbe dei buchi, immagino che – BlackBear

+0

@BlackBear no, che taglierà dal centro ma ho bisogno di tagliarlo da fuori – Vlad

risposta

0

Non so dire come fa Minecraft, ma dalla mia esperienza con voxel terrain, il modo migliore per avvicinarsi è pensare alla griglia del voxel come a qualcosa di simile a una nuvola: ogni voxel ha una densità, e quando quella densità è abbastanza alta, diventa una parte "visibile" della nuvola e si riempie il voxel.

Quindi, piuttosto che il calcolo del minimo e livelli di massimo Y, il lavoro sul calcolo del valore di densità, qualcosa di simile:

for (int x = 0; x < sizeX; x++) 
    { 
     for (int y = 0; y > sizeY; y--) 
     { 
      for (int z = 0; z < sizeZ; z++) 
      { 
       //This means less density at higher elevations, great for turning 
       //a uniform cloud into a terrain. Multiply this for flatter worlds 
       float flatWorldDensity = y; 

       //This calculates 3d Noise: you will probably have to tweak this 
       //heavily. Multiplying input co-ordinates will allow you to scale 
       //terrain features, while multiplying the noise itself will make the 
       //features stronger and more or less apparent 
       float xNoise = hillsNoise.Noise(x, y); 
       float yNoise = hillsNoise.Noise(x, z); 
       float zNoise = hillsNoise.Noise(y, z); 
       float 3dNoiseDensity = (xNoise + yNoise + zNoise)/3; 

       //And this adds them together. Change the constant "1" to get more or 
       //less land material. Simple! 
       float ActualDensity = flatWorldDensity + 3dNoiseDensity; 
       if (ActualDensity > 1) 
       { 
        map.SetBlock(GetBlock(y), new Vector3i(x, y, z)); 
       } 
      } 
     } 
    }