Como jogos como Minecraft geram mundos inteiros a partir de um número inicial?

32

Eu quero gerar um mundo completamente único com biomas (como o que Minecraft e jogos similares fazem). Não entendo como eles geram esses mundos inteiros a partir de um único número "semente". Alguém pode fornecer uma visão geral básica da técnica?

Josh
fonte
13
Notch, na verdade, escreveu um post sobre a geração de terrenos , que agora está completamente obsoleto, pois o novo código tem biomas, FRACTALS e outros tipos de magia. Também nunca houve uma parte 2.
um gato

Respostas:

27
  1. Como você gera um X aleatório a partir de uma semente? um valor inicial é o estado inicial de um gerador de números aleatórios. Na maioria das linguagens de programação, você pode definir essa semente. Por exemplo, C usa srand(). Se você não especificar uma semente específica para começar, geralmente um valor de carimbo de data / hora será usado como semente. Dessa forma, cada vez que você executa, os números aleatórios são diferentes.

    // C example
    srand(1);
    for(i=0; i<3; i++)
        printf("%d\n", rand());
    srand(1);
    for(i=0; i<3; i++)
        printf("%d\n", rand());
    
    1270216262 
    1085377743 
    1481765933
    1270216262 
    1085377743 
    1481765933

    Como você pode ver, sempre que você semeia com um determinado valor (usei 1 como semente), os números aleatórios resultantes são os mesmos.

  2. Como você cria um mundo de vida minecraft baseado em números aleatórios? Notch tem um post sobre isso. Além disso, você pode conferir os tutoriais de outras pessoas sobre "mundos parecidos com minecraft". Gostei deste, por exemplo: renderização semelhante ao Minecraft no OpenGL 4 . A idéia básica é usar o ruído Perlin (ou ruído simplex). Aqui está uma boa pergunta sobre as funções de ruído: Entendendo o ruído Perlin

Jimmy
fonte
1
Na verdade, você não poderá usar o Perlin Noise, receio que o minecraft tenha falésias, cavernas suspensas e assim por diante, e a PN não pode entrar nisso.
jcora
6
O ruído Perlin é apenas um sistema de ruído que você pode usar como parte de um método de geração de terreno maior. por exemplo. Você pode usar o ruído perlin 3D com um valor limite dependente da altitude para gerar falésias, cavernas etc. (Editar - na verdade, vejo no link na resposta que é exatamente o que o Notch estava fazendo em um ponto.)
Kylotan
1
+1 Kylotan. Aqui está a citação do blog do Notch: "Especificamente, não há como o [2D Perlin heightmap] gerar saliências. Então, mudei o sistema para um sistema semelhante baseado no ruído 3D Perlin. Em vez de amostrar a" altura do solo ", tratou o valor do ruído como a “densidade”, onde qualquer coisa menor que 0 seria ar e qualquer coisa maior que ou igual a 0 seria retificada. "
Jimmy