Comment charger une planète sphérique et ses régions?

15

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.

méthode des 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.

méthode 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.

Aracthor
la source
Avant de commencer à écrire, votre monde est-il une sphère? Essayez-vous d'imposer une grille sur une sphère où chaque grille a des propriétés enregistrées dans un fichier?
Alec Teal
@AlecTeal J'essaie de simuler une planète. C'est donc globalement une sphère. Et le principal problème est que le joueur peut essayer de se mettre à la terre sur n'importe quel point, sur un poteau ou le long de l'équateur.
Aracthor
2
Alors .... je dois demander si vous avez recherché "moteur de jeu sphérique" car il y a beaucoup d'implémentations là-bas. Pourquoi ne fonctionnent-ils pas? De plus, c'est pourquoi nous avons des cartes de cubes, ce sont les cartes standard sur toute variété topologique homéomorphe à une sphère pour cette raison!
Alec Teal
1
suggérer d'évaluer également l'option quadruple sphère
dnk drone.vs.drones
maths.kisogo.com/index.php?title=Notes: Avant- projet de coordonnées sphériques . A besoin de photos et d'être terminé.
Alec Teal

Réponses:

5

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 aet bsont 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

Alec Teal
la source
@Alec_Teal Je suis sur votre réponse depuis que vous l'avez postée, complexe et difficile à comprendre (je ne suis pas habitué à beaucoup de formules mathématiques) mais je pense que je dois comprendre ... Votre méthode est-elle vraiment différente d'un cube sphère comme décrit ci-dessus? Je n'ai pas compris si vos "graphiques" sont des projections carrées ou quelque chose de plus ...
Aracthor
@Aracthor c'est plus général. Un graphique est littéralement comme un graphique dans un livre (de cartes), il ne fait qu'imposer une grille sur une zone. Supposons que vous ayez un tore par exemple, ou un tore à 2 trous, vous aurez besoin de ces méthodes. Aucune des réponses ici ne traite autant des coordonnées sur une sphère que des manières habituelles de créer la géométrie, ce qui est une tâche différente. Je peux vous aider avec les formules, j'ai essayé de l'écrire aussi accessible que possible, mais c'est mon pain et mon beurre, donc je ne vois pas la complexité.
Alec Teal du
@Alec_Teal Je l'ai validé, mais je ne pense toujours pas avoir tout obtenu. Mais continuons cette discussion dans une salle de chat .
Aracthor
13

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)

Sphère subdivisée en fonction d'un cube

( 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.

Faire varier la fonction de cartographie pour améliorer l'uniformité

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:

Aplatissement des pavages géodésiques sur une grille triangulaire régulière Net d'un icosaèdre sur une grille triangulaire

Et une grille triangulaire régulière peut être traitée comme une grille carrée, comme discuté ici .

Isomorphisme de la grille triangulaire carrée

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:

Déballage d'une géosphère en cartes rectangulaires

(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.

DMGregory
la source
1
Il y a de bonnes choses ici. Je voudrais +1 mais je prévois d'écrire une réponse plus tard (j'essaie de rester en dehors des premières phases du vote quand je réponds également). Mes seuls commentaires seraient que cette approche est meilleure pour le rendu des sphères que la modélisation de la surface
Alec Teal
Au cas où vous seriez curieux, j'ai maintenant terminé ma réponse.
Alec Teal
4

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

Logique floue
la source
0

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.

Aidan.W
la source
Cela contourne le problème en ouvrant l'option de ne pas concevoir la surface de la planète explorable comme une sphère, mais ne le résout pas.
Philipp