Ei, pessoal, estou tentando descobrir como gerar fractais inclináveis no código (para mapas de jogos, mas isso é irrelevante ). Estou tentando modificar o plug-in Solid Noise, fornecido com o GIMP (com meu entendimento extremamente limitado de como o código funciona) mas não consigo fazer o meu funcionar corretamente.
Meu código modificado até agora (Java)
Módulo de ruído sólido do GIMP do qual estou baseando meu código (C)
Aqui está o que estou tentando alcançar, mas é isso que estou recebendo
Portanto, se alguém puder ver o que eu fiz de errado, ou tiver uma sugestão de como eu poderia fazê-lo de maneira diferente, eu apreciaria muito. Desde já, obrigado. E se estou pedindo muito ou apenas um enorme fracasso na vida, peço desculpas.
java
procedural-generation
maps
Nick Badal
fonte
fonte
Respostas:
Não sigo exatamente o seu código, mas aqui está uma descrição simplificada do algoritmo que atingirá aproximadamente o efeito (com base na imagem que você postou).
A explicação a seguir não é a versão super otimizada, mas é conceitualmente clara (espero). Depois de executá-lo, você pode otimizá-lo (drasticamente, de fato).
O passo difícil é o passo de amostragem e interpolação. Suponha que estamos na camada pulando a amostragem de cada m-ésimo pixel. Aqui está a idéia básica para m> 1 (se m for 1, usamos a imagem como está):
Algumas dicas:
fonte
Parece que minha pastabin original expirou de alguma forma, então não tenho como comparar meu código não útil, mas no meu jogo atual eu passei e traduzi o código GIMP em java novamente e parece funcionar bem agora.
Se alguém planeja usar esse código, eu recomendo modificar o construtor para modificar os parâmetros de configuração (detalhes e tamanho) para que você possa fazer o que quiser. EDIT: Percebi que minha pergunta original era sobre torná-lo inclinável, então lembre-se de defini-lo como verdadeiro!
Código: http://pastebin.com/KsfZ99Xa
Exemplo:
fonte
Apenas percorri as versões Java e C e percebi uma pequena diferença na maneira como você usa a função de ruído. Aqui está o seu:
Código C:
Por que você optou por não subtrair o deslocamento? (col - xoffset) e (linha - yoffset)
Apenas me perguntando. Não tenho tempo para fazer uma análise completa do código.
Espero que isto ajude.
fonte
Não sei se poderia ajudar, mas o seguinte truque funcionou para mim:
http://www.gamedev.net/blog/33/entry-2138456-seamless-noise/
Esse sujeito está usando uma função de ruído 4d e simplesmente fornece valores xy de dois círculos como valores xyzw para o ruído 4d. O resultado é um loop perfeito.
Aqui está a idéia (simplificada) para uma imagem de 1000 * 1000:
fonte
Eu recomendo que você use o algoritmo diamante-quadrado , também conhecido como fractal de plasma ou fractal de deslocamento aleatório no ponto médio. Usando esse algoritmo, é muito fácil restringir as arestas para que tenham os mesmos valores. Ao gerar um valor para uma aresta, copie-o para a aresta correspondente do outro lado. Isso produz um mapa perfeitamente lado a lado.
fonte
Há um ótimo artigo sobre geração de ruído aqui . Não é ruído Perlin, como afirma o artigo (na verdade é ruído rosa), mas ainda é incrivelmente útil entender como as imagens de ruído são geradas.
Portanto, para realmente responder à sua pergunta: para criar uma imagem de ruído inclinável, você só precisa manter a "tileabilidade" durante toda a geração. Ou seja, quando o ruído é suavizado, você o suaviza como se fosse repetido infinitamente em todas as direções - lado a lado.
fonte
A partir da captura de tela, meu palpite é que apenas as camadas "grandes" estão sendo geradas, razão pela qual o ruído parece muito regular e carece de detalhes.
Isso pode parecer estúpido, mas você tentou aumentar a variável "detalhe" (linha 16)? No seu código, ele é definido como 1, o que significa que o algoritmo gera apenas duas camadas de detalhes antes de parar. Tente aumentá-lo para algo como 8.
fonte
Você também deve dar uma olhada no Simplex Noise , desenvolvido por Ken Perlin para corrigir algumas das deficiências do ruído da Perlin.
Eu tenho trabalhado em uma implementação do Simplex Noise para um jogo em C ++. Ele suporta ruído 1D / 2D / 3D / 4D de várias oitavas. No momento, a única textura interna é o mármore, mas você pode adicionar mais facilmente:
(http://code.google.com/p/battlestar-tux/source/browse/trunk/src/lib/procedural/)
fonte