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.
infinite universe
pourrait ê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.Réponses:
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
la source
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:
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.
la source
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!
la source