Relacionado:
Me gustaría generar ruido de Perlin enlosable. Estoy trabajando desde las PerlinNoise*()
funciones de Paul Bourke , que son así:
// alpha is the "division factor" (how much to damp subsequent octaves with (usually 2))
// beta is the factor that multiplies your "jump" into the noise (usually 2)
// n is the number of "octaves" to add in
double PerlinNoise2D(double x,double y,double alpha,double beta,int n)
{
int i;
double val,sum = 0;
double p[2],scale = 1;
p[0] = x;
p[1] = y;
for (i=0;i<n;i++) {
val = noise2(p);
sum += val / scale;
scale *= alpha;
p[0] *= beta;
p[1] *= beta;
}
return(sum);
}
Usando código como:
real val = PerlinNoise2D( x,y, 2, 2, 12 ) ; // test
return val*val*skyColor + 2*val*(1-val)*gray + (1-val)*(1-val)*cloudColor ;
Da cielo como
Lo cual no es enlosables.
Los valores de píxel son 0-> 256 (ancho y alto), y el píxel (0,0) usa (x, y) = (0,0) y el píxel (256,256) usa (x, y) = (1,1)
¿Cómo puedo hacerlo enlosable?
tiles
perlin-noise
bobobobo
fuente
fuente
Respuestas:
Hay dos partes para hacer un ruido fBm perfectamente enlosable como este. Primero, debe hacer que la función de ruido Perlin sea enlosable. Aquí hay un código de Python para una función de ruido Perlin simple que funciona con cualquier período de hasta 256 (puede ampliarlo trivialmente tanto como desee modificando la primera sección):
El ruido de Perlin se genera a partir de una suma de pequeñas "surflets" que son el producto de un gradiente orientado aleatoriamente y una función de caída polinómica separable. Esto da una región positiva (amarillo) y una región negativa (azul)
Las surflets tienen una extensión de 2x2 y se centran en los puntos de la red entera, por lo que el valor del ruido de Perlin en cada punto del espacio se produce sumando las surflets en las esquinas de la celda que ocupa.
Si hace que las direcciones de degradado se envuelvan con un período, el ruido en sí se envolverá sin problemas con el mismo período. Esta es la razón por la cual el código anterior toma el módulo de coordenadas de red el período antes de pasarlo a través de la tabla de permutación.
El otro paso es que al sumar las octavas querrás escalar el período con la frecuencia de la octava. Esencialmente, querrás que cada octava encuadre toda la imagen justa una vez, en lugar de varias veces:
Júntalo y obtendrás algo como esto:
Como puede ver, esto realmente se combina perfectamente:
Con algunos pequeños ajustes y mapeo de colores, aquí hay una imagen de nube en mosaico 2x2:
¡Espero que esto ayude!
fuente
x*2**o
convierte a C? es:x*pow(2,o)
opow(x*2,o)
?x*pow(2, o)
, ya que la exponenciación tiene mayor precedencia que la multiplicación.a
valor? y no estoy seguro de cómo las funciones se convierten a C ... obtengo líneas rectas solo en la salida.im.putdata(data, 128, 128)
. (Para aquellos que no están familiarizados con Python o PIL: significan escala y desplazamiento, no tamaño de imagen.)Aquí hay una forma bastante inteligente que utiliza el ruido 4D Perlin.
Básicamente, asigne la coordenada X de su píxel a un círculo 2D, y la coordenada Y de su píxel a un segundo círculo 2D, y coloque esos dos círculos ortogonales entre sí en el espacio 4D. La textura resultante es enlosable, no tiene una distorsión obvia y no se repite como lo haría una textura reflejada.
Copiar y pegar código del artículo:
fuente
Ok, lo tengo La respuesta es caminar en un toro en ruido 3D, generando una textura 2D a partir de él.
Código:
Resultados:
Una vez:
Y azulejos:
fuente
Una forma simple en la que puedo pensar sería tomar la salida de la función de ruido y reflejarla / voltearla en una imagen que sea dos veces el tamaño. Es difícil de explicar, así que aquí hay una imagen:
Ahora, en este caso, es bastante obvio lo que hiciste al mirar esto. Se me ocurren dos formas de (posiblemente :-)) resolver esto:
Podrías tomar esa imagen más grande y luego generar algo más de ruido encima, pero (y no estoy seguro de si esto es posible) enfocado hacia el medio (para que los bordes permanezcan igual). Podría agregar la diferencia adicional que haría que su cerebro piense que no se trata solo de imágenes especulares.
(Tampoco estoy seguro de si esto es posible) Podría intentar jugar con las entradas a la función de ruido para generar la imagen inicial de manera diferente. Tendría que hacer esto por prueba y error, pero busque características que le llamen la atención cuando lo coloque en mosaico / espejo y luego intente que no se generen.
Espero que esto ayude.
fuente
tex2d(abs(abs(uv.x)%2.0-1.0), abs(abs(uv.y)%2.0-1.0))
La primera versión de esta respuesta fue realmente incorrecta, la actualicé
Un método que utilicé con éxito es hacer mosaico del dominio de ruido . En otras palabras, haga que su base
noise2()
funcione periódicamente. Sinoise2()
es periódico ybeta
es entero, el ruido resultante tendrá el mismo período quenoise2()
.¿Cómo podemos hacer
noise2()
periódicos? En la mayoría de las implementaciones, esta función utiliza algún tipo de ruido de red. Es decir, obtiene números aleatorios en coordenadas enteras y las interpola. Por ejemplo:Esta función se puede modificar trivialmente para que sea periódica con un período entero. Simplemente agregue una línea:
antes de calcular
v1
yv2
. De esta manera, los valores en coordenadas enteras se repetirán en todas las unidades del período, y la interpolación asegurará que la función resultante sea fluida.Sin embargo, tenga en cuenta que esto solo funciona cuando el Período es mayor que 1. Por lo tanto, para usar esto realmente en la creación de texturas perfectas, tendría que muestrear un cuadrado Período x Período, no 1x1.
fuente
noise2
periódico (con un período corto como 1 unidad)? Creo que eso es lo que finalmente se hace la pregunta. El ruido estándar de Perlin es periódico con un período de 256 en cada eje, pero desea un ruido modificado con un período más pequeño.noise2
como se sugiere, que va a obtener resultados periódicos, ya sea la propia función es periódica o no. Porque los argumentos se envuelven alrededor de cada 1 unidad.Otra alternativa es generar ruido utilizando las bibliotecas libnoise. Puede generar ruido sobre una cantidad teórica infinita de espacio, sin problemas.
Eche un vistazo a lo siguiente: http://libnoise.sourceforge.net/tutorials/tutorial3.html#tile
También hay un puerto XNA de lo anterior en: http://bigblackblock.com/tools/libnoisexna
Si termina usando el puerto XNA, puede hacer algo como esto:
GeneratePlanar es la función a la que se llama para obtener las secciones en cada dirección que se conectarán sin problemas con el resto de las texturas.
Por supuesto, este método es más costoso que simplemente tener una sola textura que se puede usar en múltiples superficies. Si está buscando crear algunas texturas en mosaico al azar, esto puede ser algo que le interese.
fuente
Aunque hay algunas respuestas aquí que funcionarían, la mayoría de ellas son complicadas, lentas y problemáticas.
Todo lo que realmente necesita hacer es usar una función periódica de generación de ruido. ¡Eso es!
Aquí se puede encontrar una excelente implementación de dominio público basada en el algoritmo de ruido "avanzado" de Perlin . La función que necesita es pnoise2. El código fue escrito por Stefan Gustavson, quien ha hecho un comentario puntual aquí sobre exactamente este problema y cómo otros han tomado el enfoque equivocado. Escucha a Gustavson, él sabe de lo que está hablando.
Con respecto a las diversas proyecciones esféricas, algunos aquí han sugerido: bueno, en esencia funcionan (lentamente), pero también producen una textura 2D que es una esfera aplanada, de modo que los bordes se condensarían más, probablemente produciendo un efecto no deseado. Por supuesto, si tiene la intención de que su textura 2D se proyecte en una esfera, ese es el camino a seguir, pero eso no es lo que se le pidió.
fuente
Aquí hay una forma mucho más simple de hacer ruido en mosaico:
Utiliza una envoltura modular para cada escala del ruido. Estos se ajustan a los bordes del área sin importar la escala de frecuencia que use. Por lo tanto, solo tiene que usar ruido 2D normal, que es mucho más rápido. Aquí está el código WebGL en vivo que se puede encontrar en ShaderToy: https://www.shadertoy.com/view/4dlGW2
Las tres funciones principales hacen todo el trabajo, y fBM pasa un vector x / y en un rango de 0.0 a 1.0.
fuente
Tuve algunos resultados no malos que se interpolaron cerca de los bordes del mosaico (envuelto en el borde), pero depende del efecto que intente lograr y los parámetros de ruido exactos. Funciona muy bien para el ruido algo borroso, no tan bueno con los puntiagudos / de grano fino.
fuente
Estaba revisando este hilo en busca de una respuesta a un problema similar, luego obtuve una solución limpia y compacta del desarrollador de este código python para generar ruido fractal a partir del ruido perlin / simplex. El código actualizado se proporciona en este tema (cerrado) y se puede reanudar al configurar los gradientes para el lado derecho del "generador" iguales a los del lado izquierdo (e igual para arriba y abajo), como en
Parece una solución elegante y limpia, evito copiar todo el código aquí (ya que no es mi propia solución), pero está disponible en el enlace anterior. Espero que esto pueda ser útil para alguien que busque producir una imagen fractal en mosaico 2D como esta que necesitaba, sin artefactos ni distorsiones.
fuente