Estoy tratando de generar un mapa estelar.
Mi intento sería:
- Tener un ancho y alto para el mapa.
- Coloque puntos (estrellas) al azar en el área de ancho y alto.
Un enfoque simple, pero tiene el problema de colocar al azar estrellas extremadamente cercanas entre sí.
Para resolver este problema, un enfoque sería tener una distancia mínima y al generar una estrella, se compara la distancia desde la nueva estrella a cada estrella generada y si está por debajo de la distancia mínima, se genera una nueva, pero no sé si Eso es eficiente. ¿Algun consejo?
procedural-generation
zebleckDAMM
fuente
fuente
Respuestas:
Una distribución de muestreo de Poisson-Disk le permitirá seleccionar puntos aleatorios a una distancia mínima y el algoritmo de Bridson puede resolver el problema de manera eficiente en O (n), lo suficientemente rápido en tiempo real siempre que su recuento de estrellas no sea demasiado grande.
El algoritmo de Bridson divide la región de salida en una cuadrícula de celdas con un tamaño relativo a la distancia mínima permitida, de modo que solo puede aparecer un punto en cada celda. Luego, cuando considere agregar un nuevo punto, solo necesita verificar una colección en forma de disco de celdas vecinas en lugar de toda la lista de puntos. Por ejemplo, considere la siguiente imagen:
Al verificar para ver si el punto azul candidato está demasiado cerca de los puntos existentes, no necesita verificarlo con cada punto existente. En cambio, puede restringir la búsqueda a los puntos en las celdas vecinas (que puede encontrar rápidamente usando una tabla de búsqueda). Mike Bostock tiene una bonita animación que muestra el algoritmo en progreso.
La implementación estándar solo se refiere a una distancia mínima fija entre puntos. El artículo de muestreo Poisson Disk de Herman Tulleken (incluye código fuente) cubre una adaptación para variar la distancia mínima en diferentes partes de la imagen; básicamente como un algoritmo de tramado . El uso del ruido perlin / ruido simplex como se muestra en el artículo nubes podría dar un mapa estelar más natural. Por ejemplo, usé la imagen de la izquierda para generar la derecha:
Para hacer esto, cuando considero un punto candidato, primero verifico el valor de la imagen de entrada, que produce un valor de 0 a 1. Luego escalo esto a mi distancia mínima y máxima deseada entre puntos; en este caso seleccioné 5 y 20 píxeles. Entonces, cuando coloco un punto en las regiones oscuras, mis estrellas pueden estar tan cerca como 5 píxeles entre sí y cuando coloco estrellas en las regiones claras, pueden tener una separación de hasta 20 píxeles.
Vale la pena señalar que la aceleración de Bridson no funciona exactamente con muestreo de distancia variable porque los puntos de salida no están utilizando una distancia mínima uniforme. Sin embargo, aún puede utilizar una cuadrícula de salida para reducir la búsqueda. Una cuadrícula más pequeña resulta en una búsqueda más rápida de vecinos más cercanos a expensas de una mayor memoria para una tabla de búsqueda más grande.
fuente
Una solución muy ingenua pero simple sería simplemente saltar siempre la distancia "mínima", y luego agregar una cantidad aleatoria encima de eso. Esto significa que las estrellas nunca serán demasiado amigas, y al menos tendrás un poco de desviación.
p.ej
(Insertar su función favorita de generación de números aleatorios)
fuente
Si conoce el tamaño XYZ de su espacio de juego, puede elegir un lugar aleatorio en ese espacio
y luego haga un SphereCast para verificar si ya hay algo demasiado cerca.
El problema con esto es que probablemente no será muy bueno en tiempo real, sin embargo, para pregenerado, está bien y es bastante rápido.
fuente