c++ data-structures 3d 3d-rendering

Esfera Mundial Implementación C++



data-structures 3d (4)

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


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

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

La idea era crear un rectángulo de 2NxN que representara el planeta. Corta el planeta por la mitad un montón de veces cambiando las dos mitades ligeramente cada vez. (Onda sinusoidal para el corte con cambio de fase aleatorio y amplitud. Otra onda sinusoidal aleatoria para el cambio.) Después, inunde las áreas de nivel inferior con agua y coloree 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 solo 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 icosaedro alrededor del punto central. Eche un vistazo a las proyecciones de mapas para algunas reflexiones sobre cómo se maneja esto en la vida real.


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 muy lejos. Hay muchos algoritmos LOD dinámicos ( 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.

En cuanto al almacenamiento de los datos, es posible que desee considerar la generación de procedimientos (dependiendo de 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 procedimientos aquí . Los mapas de altura de procedimiento son más simples, dependiendo de cuán complejo / realista quieras tu terreno. En el nivel más simple, puede simplemente desplazar su altura de vértice mediante una función de ruido perlin.


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 superficiales y le asigna a cada una una ID. A continuación, 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 cercanas y puede dar posiciones de centro y vértice para cada punto de malla.

Es una malla jerárquica que te permite subdividir cada cara tanto como quieras, así que en teoría podrías tener partes de la malla a baja resolución y otras partes con niveles de detalle más altos si así lo deseas. Tiene la agradable propiedad de que es infinitamente divisible (hasta los límites de tu memoria) y cada píxel de la cuadrícula con una resolución dada tiene el mismo á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 centrales deberían ser útiles.