Pregunta

¿Cuál sería la mejor manera de implementar, almacenar y renderizar mundos esféricos, como los que están en esporas o infinitos pero sin las etapas intermedias de esporas, y mundos múltiples en un universo infinito? No haga suposiciones sobre cómo se genera el planeta o su tamaño / escala.

¿Fue útil?

Solución

Para renderizar, necesitarás usar algún tipo de algoritmo de nivel de detalle para moverte sin problemas desde cerca de la superficie del planeta hasta lejos. Hay muchos algoritmos dinámicos de LOD ( ver aquí ). Un algoritmo más antiguo, llamado ROAM, se puede adaptar para manejar objetos esféricos o planetas ( ROAM esférico ). Geometry clipmaps es un algoritmo más nuevo y popular que también se puede adaptar a superficies esféricas también .

En cuanto al almacenamiento de los datos, es posible que desee considerar la generación de procedimientos (según sus necesidades) para texturizar, mapas de altura, etc. Esto es similar a cómo Infinity y Spore hacen las cosas. Puede leer un poco sobre texturas de procedimiento aquí . Los mapas de altura de procedimiento son más simples, dependiendo de cuán complejo / realista desee su terreno. En el nivel más simple, simplemente puede desplazar la altura de su vértice mediante una función de ruido perlin.

Otros consejos

Si está buscando algo para almacenar datos sobre la superficie, puede mirar HEALpix . Es un software desarrollado por la comunidad astronómica específicamente para mapear el cielo (otra superficie esférica).

HEALpix crea una malla que describe la posición y el tamaño de las caras de la superficie y asigna a cada una una ID. Luego, puede usar esa ID como clave o índice para acceder a todos los detalles que desee sobre ese nivel en particular.

HEASpix proporciona métodos para encontrar áreas de superficie vecinas y puede proporcionar posiciones de centro y vértice para cada punto de malla.

Es una malla jerárquica que le permite subdividir cada cara tanto como desee para que, en teoría, pueda tener partes de la malla a baja resolución y otras partes a niveles de detalle más altos si lo desea. Tiene la buena propiedad de que es infinitamente divisible (hasta los límites de su memoria) y cada píxel de la cuadrícula en una resolución dada tiene la misma área que todos los demás en ese nivel de resolución.

El paquete de distribución proporciona muchas cosas que probablemente no necesitará, pero las bibliotecas principales deberían ser útiles.

Esto probablemente NO sea lo que estás buscando ... Pero qué diablos. Es una buena historia.

Hace eones, cuando los dinosaurios aún deambulaban por la tierra y la memoria aún se medía en kilobytes, jugué con algún software para generar planetas de manera fractal.

La idea era crear un rectángulo de 2NxN que representara el planeta. Corte el planeta en la mitad de un montón de veces cambiando las dos mitades ligeramente cada vez. (Onda sinusoidal para el corte con desplazamiento de fase aleatorio y amplitud. Otra onda sinusoidal aleatoria para el cambio). Después, inunda las áreas de los niveles inferiores con agua y codifica por colores el resto por altitud.

Luego coloque una esfera de Diámetro N en la parte superior y proyecte, envolviendo una región NxN del mapa alrededor de la mitad de la esfera. Mueva la esfera alrededor del mapa y parecía que estaba girando.

Sugeriría usar algún tipo de modelo de polígono en la memoria para implementarlos en los mundos, usar un archivo para almacenarlos y renderizarlos usando algún tipo de motor 3D. O eso, o simplemente un centro de puntero y un radio, junto con una superposición para describir la geografía del mundo.

Editar: Gracias por un poco más de detalle. Dependiendo de la cantidad de detalles que necesite, necesitará usar algún tipo de método para dividir la textura en partes más pequeñas: puede generar la textura para 20 caras y construir un Icosahedron alrededor del punto central. Eche un vistazo a proyecciones de mapas para obtener algunas ideas sobre cómo se maneja esto en la vida real.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top