¿Cómo renderizar universo infinito?

15

Tengo curiosidad por saber cuáles son las mejores prácticas en la industria del desarrollo de juegos para renderizar el universo 3D.

Para ser más especifico:

  • Los puntos de datos son dados y estáticos. Cada punto tiene posición, color y tamaño;
  • El conjunto de datos completo es mucho más grande que la memoria disponible;
  • El usuario debería poder "alejarse" para ver una imagen más grande a la vez;

El enfoque más ingenuo sería dividir el universo en cubos y renderizar solo lo que es visible. No estoy seguro de cómo en este escenario debo implementar el "alejar". ¿Debo calcular previamente los cubos para cada nivel de zoom posible? ¿O tal vez hay mejores enfoques?

Estoy buscando una solución agnóstica tecnológica.

Anvaka
fuente
2
¿Planea tener algún tipo de distancia de vista máxima, o tiene alguna forma de fusionar puntos distantes para que no tenga que representarlos individualmente, o los "puntos" son opacos y organizados de modo que la mayoría de ellos estar oculto desde cualquier punto de vista? Porque si ninguno de los anteriores se mantiene, no veo ninguna manera de evitar que el usuario encuentre ángulos de cámara desde los cuales la mayoría de los puntos (o al menos una fracción significativa de ellos) serán visibles al mismo tiempo.
Ilmari Karonen
44
Por cierto, un poco exótico, pero ¿ha considerado datos generados por procedimientos? No tiene el beneficio de las áreas de elaboración personalizadas, pero el resultado es que el contenido se basa en ecuaciones, no en grandes cantidades de datos. Con algo de creatividad, eso podría simplificar muchas cosas (:
Alan Wolfe,
1
Alejar / acercar para un infinite universepodría ser similar a las relaciones de seguimiento entre dos puntos en alguna curva de Mandelbrot después de hacer zoom a diferentes niveles. En algún nivel, puede perder precisión y no ser capaz de distinguirlos o incluso localizarlos nuevamente.
user2338816
1
@AlanWolfe La fabricación personalizada aún es posible: el ejemplo principal son los viejos juegos Frontier, que tenían posiciones reales de estrellas para unas 1000 estrellas más o menos más cercanas a Sol (incluido Sol y sus planetas y lunas reales). Solo asegúrate de que estén en lugares que no se generan de forma procesal y agrégalos como otra "capa".
Luaan
@IlmariKaronen sí, tienes razón. Tengo una distancia máxima de visión, y pensé que fusionaría puntos de distancia siguiendo la respuesta de Ming-Tang
Anvaka,

Respuestas:

8

Esto se basa en mi especulación y hojeando el código fuente de Celestia.

Celestia te permite volar alrededor de un planeta y alejarte para ver toda la galaxia. Navegué por su código fuente y descubrí que usaba un octree, una estructura para dividir recursivamente el espacio en 8 octantes.

El renderizador representaría el entorno atravesando el octree, y no atravesaría objetos lejanos profundamente.

Celestia también realiza un seguimiento de la magnitud absoluta de un octante, donde la magnitud absoluta de un octante se basa en la magnitud absoluta de las estrellas dentro del octante. Si el octante está muy cerca, Celestia representa las estrellas individualmente, y si el octante está lejos, Celestia representa el octante como una estrella de la magnitud del octante.

Además, puede haber una jerarquía significativa asociada a los objetos. Por ejemplo, si está cerca (radio declarado en la base de datos) a una estrella, se representan sus planetas. Si un planeta está lo suficientemente cerca (un corte de píxeles en la pantalla), se dibuja su modelo 3D.

Otros juegos espaciales que puedo nombrar son Orbiter y Kerbal Space Program, que son de código cerrado. También busqué en Frontier Galaxy, que generó un mapa estelar procesal. Hay un sitio web que analiza cómo funciona el juego mediante su desmontaje: http://www.jongware.com/galaxy1.html

Ming-Tang
fuente
12

Hay varias piezas en este rompecabezas, cada una de las cuales proporcionará un hoyo de exploración profundo e interesante. Algunos de ellos son:

  • Nivel de detalle: automáticamente (o "manualmente") eligiendo modelos detallados o simplificados, o incluso sprites o solo puntos, o para objetos a medida que están más lejos.
  • Selección: elegir dibujar solo lo que se necesita. Esto podría ser lo que está en el campo de visión (eliminación del frustum), lo que no está oculto detrás de otras cosas (eliminación de oclusión) u otros métodos ad hoc. (La respuesta de @Alan Wolfe describe algunas de las formas de organizar sus datos que ayudan a facilitar el sacrificio).
  • Streaming: extraer datos del mundo del almacenamiento a la memoria según sea necesario, si no todo encaja en la memoria a la vez
  • Caja de cielo: los objetos muy distantes se pueden representar previamente en una esfera que se encuentra a una "distancia infinita" de la cámara.

Y su propia salsa secreta será la combinación de estas y otras técnicas que utilice y cuándo, según sus necesidades particulares de aplicación.

David Van Brink
fuente
2

Cualquier cosa que sea jerárquica y / o escasa debería ayudarte aquí.

Hay mucho espacio vacío, por lo que no es necesario usar el almacenamiento para representar el espacio vacío. Un enfoque jerárquico típico sería algo así como un árbol Oct que subdivide recursivamente el espacio en 8 cubos más pequeños, y puede almacenar objetos en el cubo más pequeño que pueden ocupar por completo.

Un octree también es bastante bueno para que pueda consultarlo para obtener una lista de todos los objetos en un entorno de vista que le permitirá obtener una lista solo de los objetos que están dentro de su ángulo de visión y que no están demasiado lejos. Una solución dispersa podría ser algo así como una cuadrícula dispersa donde puede solicitar información sobre cualquier ubicación x, y, z, pero solo tiene que almacenar información para las celdas que no son espacios vacíos.

Otros enfoques jerárquicos comunes utilizados incluyen árboles bsp (dividen el espacio en 2 medios espacios de forma recursiva), así como árboles kd que hacen algo similar.

Personalmente, creo que un octree podría ser un buen comienzo para usted, asegurándose de subdividirlo tan profundamente como sea necesario para que no pierda la memoria en el espacio vacío. Además, es posible que desee una solución diferente para sus objetos estáticos en comparación con sus objetos dinámicos.

Algunas soluciones (como bsp) pueden ser muy eficientes, pero su construcción lleva mucho tiempo, por lo que no suelen ser una buena opción para mover / cambiar objetos.

Espero que ayude, ¡avíseme si tiene alguna pregunta sobre los detalles!

Alan Wolfe
fuente