Comment rendre un univers infini?


15

Je suis curieux de savoir quelles sont les meilleures pratiques dans l'industrie du développement de jeux pour rendre l'univers 3D?

Pour être plus précis:

  • Les points de données sont donnés et statiques. Chaque point a sa position, sa couleur et sa taille;
  • L'ensemble de données est beaucoup plus volumineux que la mémoire disponible;
  • L'utilisateur devrait être en mesure de «faire un zoom arrière» pour voir une image plus grande à la fois;

L'approche la plus naïve serait de diviser l'univers en cubes et de ne rendre que ce qui est visible. Je ne sais pas comment dans ce scénario dois-je implémenter le "zoom arrière". Dois-je précalculer des cubes pour chaque niveau de zoom possible? Ou peut-être existe-t-il de meilleures approches?

Je recherche une solution agnostique technologique.


2
Prévoyez-vous d'avoir une sorte de distance de vue maximale, ou avez-vous un moyen de fusionner des points distants pour ne pas avoir à les rendre individuellement, ou les "points" sont-ils opaques et disposés de sorte que la plupart d'entre eux être caché d'un point de vue donné? Parce que si rien de ce qui précède ne tient, je ne vois aucun moyen d'empêcher l'utilisateur de trouver des angles de caméra à partir desquels la plupart des points (ou au moins une fraction significative d'entre eux) seront visibles en même temps.
Ilmari Karonen

4
Soit dit en passant, un peu exotique, mais avez-vous envisagé des données générées par la procédure? Vous n'avez pas l'avantage de créer des zones de création personnalisées, mais le résultat est que le contenu est basé sur des équations, pas sur de grandes quantités de données. Avec un peu de créativité, cela pourrait simplifier beaucoup de choses (:
Alan Wolfe

1
Le zoom arrière / zoom avant pour un infinite universepourrait être similaire au suivi des relations entre deux points sur une courbe de Mandelbrot après un zoom à différents niveaux. À un certain niveau, vous pouvez perdre de la précision et être incapable de les distinguer ou même de les retrouver.
user2338816

1
@AlanWolfe La création personnalisée est toujours possible - le premier exemple étant les anciens jeux Frontier, qui avaient de vraies positions d'étoiles pour environ 1000 étoiles ou plus près de Sol (y compris Sol et ses planètes et lunes réelles). Assurez-vous simplement qu'ils se trouvent dans des endroits qui ne sont pas générés de manière procédurale et ajoutez-les en tant que "couche".
Luaan

@IlmariKaronen oui, vous avez raison. J'ai la distance de vue maximale et je pensais que je fusionnerais les points de distance en suivant la réponse de Ming-Tang
Anvaka

Réponses:


8

Ceci est basé sur mes spéculations et en parcourant le code source de Celestia.

Celestia vous permet de voler autour d'une planète et de faire un zoom arrière pour voir toute la galaxie. J'ai parcouru son code source et j'ai trouvé qu'il utilisait un octree, une structure pour diviser récursivement l'espace en 8 octants.

Le moteur de rendu rendrait l'environnement en traversant l'octree, et ne traverserait pas profondément les objets éloignés.

Celestia garde également une trace de la magnitude absolue d'un octant, où la magnitude absolue d'un octant est basée sur la magnitude absolue des étoiles à l'intérieur de l'octant. Si l'octant est rapproché, Celestia rend les étoiles individuellement, et si l'octant est loin, Celestia rend l'octant comme une étoile de la grandeur de l'octant.

En outre, il peut y avoir une hiérarchie significative attachée aux objets. Par exemple, si vous êtes proche (rayon déclaré dans la base de données) d'une étoile, ses planètes sont rendues. Si une planète est suffisamment proche (coupure de pixels à l'écran), son modèle 3D est dessiné.

Les autres jeux spatiaux que je peux nommer sont Orbiter et Kerbal Space Program, qui sont de source fermée. J'ai également examiné Frontier Galaxy, qui a généré une carte stellaire procédurale. Il existe un site Web analysant le fonctionnement du jeu par son démontage: http://www.jongware.com/galaxy1.html


12

Il y a un certain nombre de pièces dans ce puzzle, chacune offrant un trou d'exploration de lapin profond et intéressant. Certains d'entre eux sont:

  • Niveau de détail - choisir automatiquement (ou "manuellement") des modèles détaillés ou simplifiés, ou même des sprites ou simplement des points, ou pour des objets lorsqu'ils sont plus éloignés.
  • Élimination - choisir de ne dessiner que ce qui est nécessaire. Il peut s'agir de ce qui est dans le champ de vision (élimination des troncs), de ce qui n'est pas caché derrière d'autres choses (élimination des occlusions) ou d'autres méthodes ad hoc. (La réponse de @Alan Wolfe décrit certaines des façons d'organiser vos données qui facilitent l'élimination.)
  • Streaming - extraire les données mondiales du stockage dans la mémoire si nécessaire, si elles ne tiennent pas toutes en mémoire à la fois
  • Sky box - des objets très éloignés peuvent être pré-rendus sur une sphère qui est à "une distance infinie" de la caméra.

Et votre propre sauce secrète sera la combinaison de ces techniques et d'autres que vous utiliserez et quand, en fonction des besoins de votre application.


2

Tout ce qui est hiérarchique et / ou clairsemé devrait vous aider ici.

Il y a beaucoup d'espace vide, donc ne pas avoir à utiliser de stockage pour représenter l'espace vide est un must. Une approche hiérarchique typique serait quelque chose comme un arbre Oct qui subdivise récursivement l'espace en 8 cubes plus petits, et vous pouvez stocker des objets dans le plus petit cube qu'ils peuvent occuper complètement.

Un octree est également assez bon pour que vous puissiez l'interroger pour une liste de tous les objets dans une vue tronconique qui vous permettra d'obtenir une liste des seuls objets qui se trouvent dans votre angle de vue et ne sont pas trop éloignés. Une solution clairsemée pourrait être quelque chose comme une grille clairsemée où vous pouvez demander des informations sur n'importe quel emplacement x, y, z, mais vous n'avez qu'à stocker des informations pour les cellules qui ne sont pas de l'espace vide.

D'autres approches hiérarchiques courantes utilisées incluent les arbres bsp (ils divisent l'espace en 2 demi-espaces de manière récursive) ainsi que les arbres kd qui font de même.

Personnellement, je pense qu'un octree pourrait être un bon début pour vous, en vous assurant de subdiviser aussi profondément que nécessaire afin de ne pas perdre de mémoire sur un espace vide. vous pourriez aussi finir par vouloir une solution différente pour vos objets statiques par rapport à vos objets dynamiques.

Certaines solutions (comme bsp) peuvent être très efficaces, mais leur construction est longue, elles ne sont donc généralement pas un bon choix pour déplacer / changer des objets.

J'espère que cela aide, faites-moi savoir si vous avez des questions sur les détails!

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.