Mise en œuvre de la carte des tuiles / du terrain avec différentes hauteurs des tuiles voisines

10

Ahoy!

Je recherche des informations sur les cartes de tuiles, ou plutôt sur le nom d'un type spécifique de carte de tuiles.

Je suis intéressé par le type d'implémentation utilisé dans le magnat des montagnes russes, ou la série de jeux de magnat du transport et j'ai étudié le terrain du champ vectoriel et le terrain de la carte de la hauteur, mais je ne suis pas sûr qu'ils conviennent à ce que je cherche développer.

Il a été difficile de trouver des informations décentes car la plupart des gens s'y réfèrent comme une carte de tuiles isométriques, mais je cherche à créer quelque chose en 3D avec une perspective orthographique fixe. Je comprends que le stockage sous-jacent de la carte de tuiles n'a rien à voir avec la façon dont elle est rendue, mais je ne cherche pas à créer une carte de tuiles 2D comme les jeux pokemon / zelda old school, plus dans la lignée de diablo avec la capacité d'inclure falaises en surplomb et terrain en pente.

J'essaie simplement de trouver les bons termes pour rechercher sur Google et stackoverflow des ressources pour m'aider à décider quel chemin suivre.

Jusqu'à présent, j'ai réussi à étoffer une carte de tuiles de base sans utiliser le composant hauteur / y stocké dans un VBO et rendu sous forme de filaire. Cela semble correct jusqu'à présent, mais j'envisage de rencontrer des problèmes lorsque j'essaie de manipuler un seul sommet pour créer des falaises et des pentes sans affecter une tuile voisine.

Existe-t-il un type spécifique de mise en œuvre que je devrais étudier? Je pensais l'avoir craqué quand j'ai trouvé une bonne quantité d'informations sur le terrain de champ vectoriel, mais je ne suis pas sûr que cela donnerait les résultats corrects non plus.

Si quelqu'un peut m'éclairer à ce sujet, l'aide serait grandement appréciée :)

Mettre à jour

J'ai inclus une image pour plus de précisions sur ce que j'aimerais réaliser:

Carte de tuiles 2.5D

Image empruntée à Comment créer des tuiles isométriques inclinées (en hauteur)

Cette image montre le type de terrain que je voudrais générer, mais n'inclut pas les "falaises" ou les types de terrain en surplomb que je souhaite modéliser. Cela soulève cependant quelques autres questions auxquelles je n'avais pas pensé, à savoir;

  • Comment les «couches» telles que l'eau (en haut à gauche de l'image) seraient-elles gérées pour inclure le sol visible sous l'eau?
  • Comment les «bords» de la carte seraient-ils pris en compte afin que la terre / boue soit rendue pour représenter le monde comme une entité non plate?
  • Le stockage sous-jacent de ce type de terrain pourrait-il être utilisé pour modéliser la physique, comme une balle roulant sur une colline ou les vitesses de déplacement d'un joueur traversant une pente?

J'ai eu une idée en ce que chaque tuile du terrain pourrait être modélisée avec 8 sommets où les 4 sommets principaux couvrent la tuile réelle elle-même et les 4 sommets restants sont utilisés pour modéliser les côtés / murs de chaque tuile. Les deux problèmes que je vois avec cette implémentation sont que a) la carte du monde est essentiellement doublée de taille et b) étant donné que toutes les tuiles n'incluront pas de "murs", certaines tuiles se retrouveront avec des sommets redondants qui ne sont pas utilisés.

Je voudrais créer un éditeur de terrain qui permet à chaque tuile d'être déformée ainsi que la possibilité de changer le terrain pendant le jeu. Cela pose en soi des questions supplémentaires telles que; Un VBO peut-il être utilisé pour stocker et rendre le terrain tout en étant modifié à la volée et est-il également possible de modifier les sommets sans affecter les tuiles voisines?

J'ai l'impression que je complique trop les choses ou que je tombe dans la paralysie de l'analyse en ce que je néglige d'écrire du code pour résoudre le problème sans avoir une idée claire de la façon dont j'obtiendrais ce que je veux.

Encore une fois, je suis vraiment à la recherche d'un coup de pouce dans la bonne direction avec cela. Existe-t-il un type spécifique d'implémentation de tilemap / terrain qui permettrait à une carte 3D d'être déformée à la fois par un éditeur de carte et pendant le gameplay ou dois-je rouler le mien, pour ainsi dire? Je n'essaie pas de réinventer la roue ici, mais j'ai du mal à trouver des ressources étant donné que je ne sais pas quoi chercher.

Si quelqu'un peut fournir des informations, des ressources ou des extraits de code, cela serait grandement apprécié car je suis impatient de me salir les mains et de commencer à produire autre chose que le filaire plat que j'ai actuellement.

Merci d'avoir lu!

CaptainRedmuff
la source

Réponses:

2

Si j'étais vous, j'examinerais les voxels, plus précisément le rendu de cube de type Minecraft . Contrairement aux cartes en hauteur, ils peuvent gérer les surplombs, les cavernes, les bâtiments à plusieurs étages, etc.

Vous stockeriez votre terrain dans un tableau 3D d'entiers, où les nombres sont mappés à un certain type de terrain: 0 = air, 1 = terre, 2 = eau, etc. Ensuite, pour créer le maillage à rendre, vous auriez créer les faces d'un cube pour chaque voxel non vide.

Ce tutoriel est une excellente explication de la façon de procéder en C ++ à l'aide d'Ogre3D. Je suppose que vous devrez aller un peu plus bas dans OpenGL.

Après avoir créé les cubes, vous souhaitez lisser les bords pour créer le type de terrain fluide montré dans votre image. Je crois que PolyVox (également en C ++) fait cela; vous pouvez jeter un œil à leur code. Je pense que vous faites essentiellement en 3D ce que l'image montre en 2D: faites la moyenne des positions des cubes environnants pour savoir où placer chaque sommet.

ÉDITER:

  • Générez les faces des cubes adjacents à l'eau comme si la tuile eau était vide et restituez les faces de l'eau de manière transparente.
  • Les visages sur le "bord" peuvent être générés comme des visages normaux, si vous considérez les voxels hors du monde comme vides.
  • Physique: vous pouvez probablement envoyer le maillage rendu à votre moteur physique en tant qu'objet statique.
  • Éditeur de carte: vous souhaitez modifier les données de voxel sous-jacentes, pas le maillage lui-même! (Le maillage doit refléter les données, donc la modification des voxels doit produire des changements dans votre maillage.) Vous pouvez rechercher Modèle, Vue, Contrôleur (MVC) si vous ne le connaissez pas.

Si vous avez d'autres questions, n'hésitez pas à laisser un commentaire. Bienvenue sur gamedev.SE!

Wackidev
la source
Il s'agit d'une solution très compliquée que pour un problème relativement simple. Beaucoup de jeux ont fait ce que l'OP demande sans la complexité des voxels.
Sean Middleditch
Je suis d'accord que les voxels peuvent être compliqués. Souhaitez-vous un lien vers ces jeux? J'aimerais savoir comment ils l'ont fait.
Wackidev
Je jouais avec l'idée d'utiliser des voxels. Cette implémentation impliquerait-elle que tous les cubes ont des dimensions unitaires, ou pourrait-on extruder un seul cube? Je suppose que le monde devrait être stocké en couches pour permettre à l'eau et à d'autres carreaux de se chevaucher le long du plan y.
CaptainRedmuff
Oui, les voxels sont généralement de taille unitaire. Je suppose que l'on pourrait les extruder, mais je pense que cela ne ferait que compliquer les choses. Je ne suis pas sûr de comprendre ce que vous entendez par couches. Vous parlez de tuiles à eau de hauteur variable?
Wackidev
Quelque chose dans ce sens. Je pensais plus à définir simplement un "plancher" qui pourrait être un cube extrudé qui a ensuite un cube d'eau sur le dessus défini par le plan où les deux se croisent. Je vais peut-être encore compliquer les choses. Je ferai un peu plus de lecture sur les voxels et verrai où cela me mène.
CaptainRedmuff
6

Ceci: http://30.media.tumblr.com/tumblr_m06qv6OREt1r2qjpao1_500.png est un exemple de carte que j'ai faite il y a quelque temps.

J'avais un XML représentant la carte et différents types de tuiles. Chaque type aurait quelques attributs:

  • la taille
  • Position
  • Type de fusion: quel type de fusion cette tuile ferait ALL(si elle devait fusionner avec une tuile autour d'elle), EQUAL(fusionner uniquement avec des tuiles du même type), NONE(ne jamais fusionner).
  • Hauteur de fusion: la hauteur maximale pour les pentes (bonne pour les surplombs), disons que vous voulez qu'une tuile fusionne uniquement avec des tuiles de la même hauteur ou avec une différence de 1, la valeur serait un.

Je lisais ensuite toutes les tuiles et les créais dans la scène. Tout d'abord en tenant compte de la position. Chaque tuile devait savoir que c'était son voisin, j'ai donc dû parcourir la carte deux fois, une fois pour tout créer, et encore une fois pour déplacer chaque sommet à la bonne position.

Bien que mes modèles soient des hexagones, le concept est le même, vous auriez besoin d'un cube pour représenter votre tuile, vous déplaceriez ensuite les sommets de base au niveau le plus bas et `` lisseriez '' le haut du cube avec les cubes autour. Vous vérifieriez également si deux côtés des cubes ont été fusionnés afin que vous puissiez simplement supprimer ce côté du cube (s'ils ne sont pas fusionnés, c'est probablement une falaise ou quelque chose).

À propos de la physique, cela dépend de votre objectif. Si vous faites quelque chose comme un magnat des montagnes russes, vous n'en avez pas vraiment besoin. Vous pouvez simplement vérifier la hauteur du joueur entre chaque tuile et décider de la vitesse de marche. Vous pouvez faire de même pour un objet qui se déplace tout seul (comme la balle), vous pouvez vérifier les tuiles autour (ou l'angle actuel des tuiles) et décider d'une direction / vitesse. Si vous avez besoin d'une physique réaliste (comme la gravité, la friction, etc.), vous devrez utiliser un moteur physique et vous pourriez utiliser la représentation 3D du cube dans le moteur.

Les couches sont également possibles, mais vous auriez besoin de quelque chose comme minecraft (avec lissage sur les cubes dans la couche la plus haute). Si vous n'avez besoin que de couches pour l'eau, vous pouvez avoir une "source d'eau" sur une tuile et demander à votre code de remplir tous les espaces autour d'elle qui sont à la même hauteur ou plus bas (une solution récursive conviendrait bien ici).

Un éditeur de terrain serait également simple, si votre code est suffisamment flexible, vous pouvez appliquer les transformations à une seule tuile (celle que vous modifiez), ou à une liste de tuiles (si vous utilisez un 'pinceau' pour sélectionnez-les et déplacez-les). Le même code peut être utilisé pour modifier le terrain du jeu. Et oui, vous pouvez changer les sommets sur le VBO, il est également possible de changer les sommets sans affecter les autres (cela dépend aussi de votre codage comme ça).

Luke B.
la source
+1 Merci pour votre contribution à ce sujet. Vous soulevez un bon point sur la superposition en ce qui concerne la "source d'eau" que je n'avais pas envisagée auparavant. Je vais essayer de modifier le VBO à la volée maintenant que je sais que c'est possible :)
CaptainRedmuff