Hola chicos, estoy tratando de descubrir cómo generar fractales enlosables en el código (para mapas de juego, pero eso es irrelevante ) He estado tratando de modificar el complemento Solid Noise incluido con GIMP (con mi comprensión extremadamente limitada de cómo el código funciona) pero no puedo hacer que el mío funcione correctamente.
Mi código modificado hasta ahora (Java)
Módulo de ruido sólido de GIMP en el que baso mi código (C)
Esto es lo que estoy tratando de lograr pero esto es lo que estoy obteniendo
Entonces, si alguien puede ver lo que he hecho mal, o tiene una sugerencia de cómo podría hacerlo de manera diferente, lo agradecería enormemente. Gracias por adelantado. Y si estoy pidiendo mucho o si es un gran fracaso en la vida, me disculpo.
fuente
Respuestas:
No sigo su código exactamente, pero aquí hay una descripción simplificada del algoritmo que logrará aproximadamente el efecto (según la imagen que publicó).
La siguiente explicación no es la versión súper optimizada, pero es una que es conceptualmente clara (espero). Una vez que lo tienes funcionando, puedes optimizarlo (de hecho, bastante drástico).
El paso difícil es el paso de muestreo e interpolación. Supongamos que estamos en el salto de capa de muestreo cada m-ésimo píxel. Aquí está la idea básica para m> 1 (si m es 1, usamos la imagen como está):
Algunos consejos:
fuente
Parece que mi pastebin original expiró de alguna manera, así que no tengo forma de comparar mi código que no funciona, pero en mi juego actual revisé y traduje el código GIMP a Java nuevamente y parece que funciona bien ahora.
Si alguien planea usar este código, recomendaría modificar el constructor para modificar los parámetros de configuración (detalle y tamaño) para que pueda hacerlo funcionar como desee. EDITAR: Me di cuenta de que mi pregunta original era sobre hacerla enlosable, ¡así que recuerde establecer tilable en verdadero!
Código: http://pastebin.com/KsfZ99Xa
Ejemplo:
fuente
Simplemente hojeé las versiones de Java y C y noté una ligera diferencia en la forma en que usas la función de ruido. Aquí está el tuyo:
Código C:
¿Por qué has elegido no restar el desplazamiento? (col - xoffset) y (fila - yoffset)
Sólo me preguntaba. No tengo tiempo para hacer un análisis completo del código.
Espero que esto ayude.
fuente
No sé si podría ayudar, pero el siguiente truco me funcionó:
http://www.gamedev.net/blog/33/entry-2138456-seamless-noise/
Este compañero está utilizando una función de ruido 4d y simplemente proporciona valores xy de dos círculos como valores xyzw para el ruido 4d. El resultado es perfecto.
Aquí está la idea (simplificada) para una imagen 1000 * 1000:
fuente
Le recomiendo que use el algoritmo de diamante cuadrado , también conocido como fractal de plasma o fractal de desplazamiento aleatorio de punto medio. Con este algoritmo es muy fácil restringir los bordes para que tengan los mismos valores. Cuando genere un valor para un borde, cópielo en el borde correspondiente en el otro lado. Esto produce un mapa perfectamente en mosaico.
fuente
Hay un gran artículo sobre la generación de ruido aquí . No es el ruido de Perlin como dice el artículo (en realidad es ruido rosa), pero sigue siendo increíblemente útil para entender cómo se generan las imágenes de ruido.
Entonces, para responder realmente a su pregunta: para hacer una imagen de ruido enlosable, solo necesita mantener la "capacidad de mosaico" durante toda la generación. Es decir, cuando el ruido se suaviza, lo suaviza como si se repitiera infinitamente en todas las direcciones: mosaico.
fuente
De la captura de pantalla, supongo que solo se están generando las capas "grandes", por lo que el ruido parece demasiado regular y carece de detalles.
Esto puede sonar estúpido, pero ¿trataste de aumentar la variable "detalle" (línea 16)? En su código, se establece en 1, lo que significa que el algoritmo solo generará dos capas de detalles antes de detenerse. Intenta aumentarlo a algo así como 8.
fuente
También debe echar un vistazo a Simplex Noise , que fue desarrollado por Ken Perlin para corregir algunas de las deficiencias del ruido de Perlin.
He estado trabajando en una implementación de Simplex Noise para un juego de C ++. Admite ruido de 1D / 2D / 3D / 4D de varias octavas. En este momento, la única textura incorporada es el mármol, pero podría agregar fácilmente más:
(http://code.google.com/p/battlestar-tux/source/browse/trunk/src/lib/procedural/)
fuente