es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Necesito ayuda para reducir el ruido de perlin en Ursina y crear una llanura.

Entiendo que estás utilizando ruido de Perlin para crear un patrón con cubos, pero lo que quieres es un terreno aleatorio llano como en este juego llamado Muck (que ha sido desarrollado por Unity). Aquí está la imagen: imagen

He intentado hacer lo siguiente:

noise = PerlinNoise(octaves=3, seed=2007)
amp = 3
freq = 24
width = 30

for po in range(width*width):
    s = randint(200, 255)
    q = Entity(model="cube", collider="box", texture="white_cube",
               color=color.rgb(s, s, s))
    q.x = floor(po/width)
    q.z = floor(po % width)
    q.y = floor(noise([q.x/freq, q.z/freq]) * amp)

Esto debería generar un terreno aleatorio -casi- perfecto, pero quiero que mi terreno se vea más realista que cubico. ¡Gracias de antemano!

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para hacer que tu terreno se vea más realista y menos cúbico, puedes utilizar una técnica llamada “deformación de malla” en Unity.

    Primero, crea un plano plano utilizando la herramienta de terreno de Unity. Luego, agrega un script al objeto del terreno que deformará la malla basándose en el ruido de Perlin.

    Aquí tienes un código de ejemplo para que empieces:

    “`C#
    public int terrainWidth = 200;
    public int terrainLength = 200;
    public float terrainHeight = 50f;
    public float scale = 20f;
    public float speed = 2f;

    private Terrain terrain;
    private float[] heights;

    void Start()
    {
    terrain = GetComponent();

    // Genera alturas aleatorias para el terreno utilizando ruido de Perlin
    heights = new float[terrainWidth * terrainLength];
    for (int x = 0; x < terrainWidth; x++)
    {
        for (int z = 0; z < terrainLength; z++)
        {
            float y = Mathf.PerlinNoise((x + transform.position.x) / scale, (z + transform.position.z) / scale);
            heights[x + z * terrainWidth] = y * terrainHeight;
        }
    }
    
    // Aplica las alturas al terreno
    terrain.terrainData.SetHeights(0, 0, GenerateHeights());
    

    }

    void Update()
    {
    // Anima el terreno con el tiempo
    for (int x = 0; x < terrainWidth; x++)
    {
    for (int z = 0; z < terrainLength; z++)
    {
    float y = Mathf.PerlinNoise((x + transform.position.x + Time.time * speed) / scale, (z + transform.position.z + Time.time * speed) / scale);
    heights[x + z * terrainWidth] = y * terrainHeight;
    }
    }
    terrain.terrainData.SetHeights(0, 0, GenerateHeights());
    }

    float[,] GenerateHeights()
    {
    float[,] heights2d = new float[terrainWidth, terrainLength];
    for (int x = 0; x < terrainWidth; x++)
    {
    for (int z = 0; z < terrainLength; z++)
    {
    heights2d[x, z] = heights[x + z * terrainWidth];
    }
    }
    return heights2d;
    }
    “`

    Este script genera un plano de terreno plano y utiliza ruido de Perlin para generar alturas aleatorias para cada punto del plano. El script actualiza las alturas del terreno con el tiempo para crear un terreno animado y fluido.

    Para hacer que el terreno se vea aún más realista, puedes agregar texturas y otros detalles como árboles, rocas y agua.

Comments are closed.