Как изменить шум Perlin для создания простой формы? - PullRequest
0 голосов
/ 04 мая 2020

Я работаю над проектом в Unity, который должен создать несколько простых 3D гор / холмов. Поскольку мои требования состоят в том, чтобы создать «простую» форму, я, похоже, не могу найти ответ, и я подумал, что, возможно, я смогу получить некоторую помощь отсюда. В любом случае, это является нормальным выходом из перлин-шума, хотя он плавный, выход все еще сложен с большим количеством холмов / гор. Я ищу что-то вроде этого . Мне нужно быть уверенным, что у меня не будет высоты вокруг границ выходного изображения. Я думаю, у тебя есть идея. Удачного дня!

Вот код, который я сейчас использую из онлайн-урока:

using UnityEngine;

public class PerlinNoise : MonoBehaviour
{
    private static int width = 256;
    private static int height = 128;
    public float scale = 20f;

    public float offsetX = 100f;
    public float offsetY = 100f;
    private int xcont = 0, ycont = 0;
    public float[,] array = new float[width,height];

    private void Start()
    {
        offsetX = Random.Range(0f, 99999f);
        offsetY = Random.Range(0f, 99999f);
    }
    void Update()
    {
        Renderer renderer = GetComponent<Renderer>();
        renderer.material.mainTexture = GenerateTexture();
    }



    Texture2D GenerateTexture()
    {
        Texture2D texture = new Texture2D(width, height);

        //GENERATE A PERLIN NOISE MAP FOR THE TEXTURE

        for(int x=0;x<width;x++)
        {
            for(int y=0;y<height;y++)
            {
                Color color = CalculateColor(x,y);
                texture.SetPixel(x, y, color);
            }
        }

        texture.Apply();

        return texture;
    }

    Color CalculateColor(int x, int y)
    {
        float xCoord = (float)x / width * scale + offsetX;
        float yCoord = (float)y / height * scale + offsetY;
        float sample = Mathf.PerlinNoise(xCoord,yCoord);
        if (xcont == width - 1)
        {
            xcont = 0;
            ycont++;
        } 
        else xcont++;

        if (ycont == height - 1 ) ycont = 0;

        array[xcont,ycont] = sample;
        return new Color(sample, sample, sample);
    }
}

1 Ответ

0 голосов
/ 04 мая 2020

Вы можете отфильтровать эту текстуру, используя клеточные автоматы. Этот плейлист может помочь вам понять, как и когда Perlin Noise используется для генерации карты: https://www.youtube.com/playlist?list=PLFt_AvWsXl0eZgMK_DT5_biRkWXftAOf9

...