Noise - Höhlen generieren

  • C#
  • .NET (FX) 4.0

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von jvbsl.

    Noise - Höhlen generieren

    Hi, ich versuche ein Terrain mit einen Noise-Generator zu realisieren. Leider gelingt mir das bei Höhlen nicht ordentlich. (Das Bild hab ich angehangen)

    Habt ihr irgendwelche Ratschläge oder mache ich was falsch?

    Noise Generator:

    pastebin.com/W56fjgry

    Cave Code:

    C#-Quellcode

    1. noise.ChangeSeed((int)(_seed*0.33f));
    2. noise.Frequency = 0.01f;
    3. noise.Octaves = 8;
    4. noise.Persistence = 0.5f;
    5. noise.Amplitude = 8;
    6. for (var y = Normal0 + Altitude*16; y < bitmap.Height; y+=16)
    7. {
    8. for (var x = 0; x < bitmap.Width; x+=16)
    9. {
    10. var noiseValue = noise.Noise((int) (_seed * 0.63f * y + x) + x + ix, (int) (_seed*0.33f * y - x));
    11. if (noiseValue > 0.99f)
    12. {
    13. graphics.FillRectangle(delBrush, x, y, 16, 16);
    14. }
    15. }
    16. }


    Es werden keine richtigen Wolken generiert, sondern nur so "Fitzel".
    Bilder
    • Test.png

      140,19 kB, 4.096×2.048, 129 mal angesehen
    if (total < -2.4) total = -2.4;
    else if (total > 2.4) total = 2.4;

    return (total / 2.4);

    solltest du den Wertebereich nicht eher abhängig von der Persistence und Oktaven anzahl abhängig machen? So hab ichs immer gemacht, hat immer gut funktioniert - jedoch finde ich SimplexNoise wesentlich besser(für höhere Dimensionen vorallem) ;)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Ich habe leider keine Ahnung von Simplex Noise, und auch diesen Algo habe ich glücklicherweiße in einen Pastebin gefunden. Wie würde das ganze dann aussehen - So?:

    C#-Quellcode

    1. ​if (total < -Persistence) total = -Persistence;
    2. else if (total > Persistence) total = Persistence;
    3. return (total / Octaves);
    Nun das scheint PerlinNoise zu sein, das ergebnis ist bei beiden ungefähr dasselbe(beides von Ken Perlin). SimplexNoise ist nur schneller und hat weniger Artefakte(ist natürlich neuer).

    Nun bei jeder Octave addierst du Werte im Bereich -1/+1 multipliziert mit amp, d.h der Wertebereich ist anschließend die Summe aus den jeweiligen Amplituden * (+/- 1).

    Also mach dir eine maxValue welche diese Summe darstellt und dividiere dein total durch diese maxValue, ohne diese Ifs mit dem harten abschneiden.
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---