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.
infinite universe
podrí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.Respuestas:
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
fuente
Hay varias piezas en este rompecabezas, cada una de las cuales proporcionará un hoyo de exploración profundo e interesante. Algunos de ellos son:
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.
fuente
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!
fuente