Je conçois un jeu partiellement composé d'exploration de planètes. Je veux utiliser une génération pseudo-aléatoire pour eux, régénérer à partir d'une graine définie lorsque je dois les charger plutôt que de stocker chaque détail, ce qui serait trop lourd. Je vais donc simplement stocker dans un fichier la graine aléatoire et les modifications effectuées par le joueur le cas échéant.
Le joueur doit être capable de voir la planète depuis l'orbite (avec un niveau de détails très bas, puis descendre vers le sol, augmenter lentement le niveau de détails de la région où il atterrit et décharger celles des autres côtés de la planète, qui sortent du champ de vision du joueur.
Si je devais le faire sur un sol plan, je le ferais facilement avec un système de morceaux carrés. Mais le problème ici est que les planètes sont - presque - des sphères.
Alors, quelle serait la meilleure façon de charger les détails du sol (relief et objets mis à la terre) autour d'un point précis?
J'ai déjà réfléchi à deux solutions, mais les deux ont un point faible:
1. Couper la sphère en morceaux carrés.
Une fois que le joueur est suffisamment près du sol, je n'ai qu'à améliorer les détails des cases les plus proches de sa position.
Si cela ne suffit pas, je peux toujours couper chaque carré en sous-carrés à charger lorsque les joueurs sont sur ou très près du sol.
Mais comme vous pouvez le voir sur l'image, il y a un problème si le joueur essaie d'atterrir sur un poteau: les carrés deviennent des rectangles très fins, voire des triangles pour la dernière ligne, et en plus du fait qu'ils seraient nombreux à charger, la génération semblerait déformée.
2. À partir d'un icosaèdre.
Ici, je pourrais simplement augmenter la tessellation du triangle autour de la position du joueur quand il / elle se rapproche.
Mais je ne sais pas comment localiser les triangles près de la position du joueur. J'ai entendu dire que les coordonnées cartésiennes pouvaient être utiles dans ce cas, mais je ne sais pas comment les utiliser.
J'utilise C ++ / OpenGL pour cela, donc la principale chose à générer et à charger ici sont les sommets représentant le relief de la surface et la couleur / texture.
Réponses:
D'accord, je l'ai donc écrit ici:
http://www.maths.kisogo.com/index.php?title=Notes:Spherical_coordinates
(J'avais besoin du balisage mathématique et aussi c'est vraiment assez long)
Application du document
Le document commence par introduire la notion de variété, une variété est cette chose dont des morceaux sont "homéomorphes" (fondamentalement: les mêmes que) des morceaux de R ^ n (R ^ 2 est le plan x / y, comme vous le pourriez savoir)
Un graphique couvre certains (éventuellement tous, bien que dans le cas d'une sphère il NE PEUT PAS couvrir tous) d'un collecteur.
Dans l'article, je développe 4 graphiques pour la sphère qui préservent les angles, c'est-à-dire qu'ils gardent une distance régulière.
Comme vous l'avez découvert, donner des coordonnées à des points sur une sphère est en fait assez difficile! Ce que nous faisons à la place (bien que sur un cercle dans l'exemple) est de donner à chaque point une coordonnée de la forme (i, x, y) où i est un nombre compris entre 1 et 6 pour une sphère, 1 et 4 pour un cercle. Ceci est le numéro du graphique.
Les x et y font référence aux angles sur ce graphique (ou simplement x s'il s'agit d'un cercle).
Les 6 graphiques d'une sphère sont les hémisphères supérieur / inférieur, les hémisphères gauche / droit et avant / arrière.
Coordonnées
Vous pouvez maintenant donner à chaque point une "belle" coordonnée qui se comporte bien. En termes mathématiques, les domaines des cartes sont des cartes "ouvertes", cela signifie qu'il existe un nombre positif tel qu'une boule autour de chaque point se trouve également dans l'ensemble. Par exemple, la plage (0,1) (l'ensemble qui contient x si 0 <x <1) est ouvert, prenez n'importe quel p dans (0,1) (par exemple 0,001) puis il y a un nombre (par exemple 0,0005) tel que tout point compris entre 0,0005 et 0,001 est également en (0,1).
Cela signifie que vous pouvez transmettre des instructions à travers des graphiques.
Il y a maintenant 45 degrés de chevauchement dans les graphiques que nous développons. Cela signifie que si vous avez une fonction aux coordonnées (i, x, y) , vous pouvez spécifier des points de façon SÛRE la forme (i, x + a, y + b) aussi longtemps que
a
etb
sont entre -45 et +45 (en degrés)Tout point de la forme (i, x + a, y + b) peut être facilement transformé sans problème en un point dans l'espace tridimensionnel "normal".
la mise en oeuvre
Vous avez maintenant un moyen de stocker des coordonnées pour quelque chose sur une sphère, et dénotez des régions de vastes étendues d'espace avec ces coordonnées, elles se comportent également comme des coordonnées, elles sont ouvertes par exemple (ce qui est un problème si vous utilisez 2 angles à la place)
Vous pouvez également ignorer totalement les réponses "comment créer une sphère régulière" maintenant parce que tout ce que vous avez à faire est de faire 6 plans, et assurez-vous que leurs bords sont alignés (ce qui est trivial) et le résultat est:
Vous aurez une jolie sphère avec des coordonnées faciles à utiliser
Pour toute question, veuillez commenter, j'ai essayé de supposer peu de connaissances préalables. Je suis également novice dans l'enseignement aux gens
la source
Comme vous l'avez déjà montré, il existe un certain nombre de solutions à ce problème, mais aucune n'est idéale à 100%. Les sphères sont délicates.
Basé sur un cube
Une route courante, utilisée par Spore et probablement d'autres jeux (bien qu'il soit difficile de dire avec certitude sans jeter un œil sous le capot), consiste à projeter la sphère sur un cube et à utiliser une grille carrée sur chaque face du cube.
(C'est ce que décrivent Alec Teal et dnk drone.vs.drones dans les commentaires ci-dessus)
( Image de cet article qui décrit l'utilisation d'une représentation cubique pour LoD )
Cela présente de nombreux avantages de la méthode latitude-longitude, avec beaucoup moins de distorsion de crête. Il est facile de convertir en va-et-vient entre les positions sur la grille de face et les positions sur la sphère, en normalisant un vecteur ou en divisant par sa plus grande composante en valeur absolue. Il s'aligne également parfaitement avec les techniques de texturation de la cartographie des cubes , qui peuvent être utiles lorsque vous regardez la planète entière à distance.
L'approche de cartographie typique est appelée projection gnomonique , et elle a toujours un problème de non-concordance de densité comme vous pouvez le voir dans l'image ci-dessus. La grille est beaucoup plus dense près des coins du cube qu'au centre des faces. Si l'uniformité est importante, vous pouvez réduire cela avec les bonnes formules de mappage, mais cela rend généralement le mappage plus difficile à inverser.
Dans tous les cas, vous aurez toujours une distorsion angulaire dans les coins, où une intersection de grille ordinaire de quatre carrés avec des angles de 90 degrés devient une réunion de 3 losanges avec des angles de 120 degrés.
À base d'icosaèdre
Mon approche préférée serait la version icosaédrique que vous avez décrite, car elle rend la distorsion angulaire maximale aussi petite que possible. Là où la grille triangulaire aurait normalement six triangles se rencontrant à des angles de 60 degrés, les sommets de l'icosaèdre ont 5 triangles se rencontrant à des angles de 72 degrés. Ainsi, chacun a moins de distorsion que les carrés dans l'exemple de cube.
Ce n'est pas un territoire aussi familier que les carrés de la version cube, c'est probablement pourquoi il n'est pas aussi populaire. Il faut un peu plus de mathématiques pour travailler.
L'identification des points à proximité n'est pas aussi compliquée que cela puisse paraître. Toute sphère géodésique à base d'icosaèdre peut être aplatie sur une grille triangulaire régulière:
Et une grille triangulaire régulière peut être traitée comme une grille carrée, comme discuté ici .
Donc, une fois que vous avez déterminé la face de l'icosaèdre sur laquelle vous vous trouvez (ce qui peut être fait avec un lancer de rayons contre un maillage icosaédrique - je ne connais pas de méthode mathématique intelligente pour simplifier cette partie), l'environnement peut être rempli à l'aide de traversée de la grille. :)
Éditer:
Si vous utilisez une géodésique de classe I, vous pouvez dérouler vos planètes en cinq graphiques rectangulaires pour stocker efficacement les blocs de niveau / textures / cartes de hauteur, similaires aux six graphiques carrés que vous utiliseriez pour stocker une version basée sur un cube:
(Cela peut aider à répondre à la préoccupation soulevée par Fuzzy Logic dans une autre réponse. Ceci est également possible mais un peu plus compliqué pour les géodésiques de classe II. Je n'ai pas étudié la classe III)
L'astuce est que les axes de ces graphiques ne sont pas vraiment perpendiculaires, donc les outils / technologies de création et de streaming existants ne le prendront pas en charge. Si vous envisagez d'écrire votre propre morceau en streaming de toute façon ou d'utiliser la génération procédurale à la volée, cela pourrait ne pas être un problème. Vous pouvez également contourner le problème de création en générant vos cartes source avec une résolution plus élevée que celle dont vous avez besoin en utilisant des outils plus conventionnels, puis en les exécutant via un processus de cuisson qui échantillonne le long de la grille du graphique pour créer une représentation dense et efficace qui se branche directement dans la structure icosaédrique.
la source
La quadruple sphère avec un LOD fragmenté est la méthode préférée si vous voulez pouvoir aller de l'espace au sol avec n'importe quel niveau de terrain détaillé, soit une cartographie de hauteur procédurale ou prédéfinie et des textures.
Icosasphere fournit un maillage plus uniforme et est facile à tesseller mais pose des problèmes pour essayer de mapper des textures et des cartes de hauteur que vous devrez mettre en cache et ne sera pas très compact ou simple de cette façon.
La quadruple sphère a des points de pincement mais avec une tessellation suffisante, vous ne les verrez pas de toute façon. Ensuite, vous pouvez mapper des textures et implémenter DLOD efficacement comme si chaque région (morceau) était une grille carrée avec peu de problèmes. Ceci est plus simple à implémenter par rapport à une icosasphere et sera plus efficace, à la fois en calcul et en ressources.
Voir les articles de Sean O'Neil sur la génération d'un univers procédural sur Gamasutra:
- Part 1 Perlin Noise and Fractal Brownian Motion pour les cartes de hauteur et les textures.
- Partie 2 Algorithme ROAM pour le maillage procédural avec DLOD pour la génération de planètes. Souffre de problèmes de performances. Non recommandé mais bon pour la valeur éducative.
- Partie 3 Résout les problèmes d'échelle massive, d'optimisation et de virgule flottante. Principalement lié à l'échelle de l'univers, mais également applicable aux planètes lors de la transition d'échelles d'années-lumière en centimètres si vous le souhaitez.
- Partie 4 Discute de la mise en œuvre de Quad-sphère avec DLOD fragmenté (quad-tree) pour la génération de planète <- voir cet article en particulier
la source
Je ne suis pas un expert en programmation, mais vous pourriez avoir une sorte de point de contrôle. Pendant que vous êtes autorisé à passer un point de contrôle de sécurité, avec une animation bien sûr, la surface de la planète peut se charger, et vice versa.
la source