Comment sont fabriqués les moteurs de terrain voxel?

53

Il y a quelques jours, j'ai trouvé un terrain appelé voxel et je pense qu'il est plutôt cool. Mais je ne sais rien qui les génère. Le modélisez-vous dans votre logiciel de modélisation ou utilisez-vous quelque chose comme un heightmap? J'ai lu sur Wikipédia que les voxels sont comme des pixels 3D ou des pixels volumétriques.

Après avoir fait le voxel, comment puis-je prendre ces voxels et les rendre destructibles / diggables ?


Je choisirai la meilleure réponse en fonction de:

  1. code et algorithmes. de préférence à base de C #
  2. explications. Je suis un débutant avec des algorithmes mais je suis très familier avec la programmation orientée objet
  3. démonstrations pas à pas. Pas seulement le concept mais la direction.
  4. diagrammes / illustrations. Non, pas de captures d'écran d'autres moteurs.


Je sais que c'est un sujet compliquant. Mais merci pour toute aide!

Non, je n'essaye pas de faire un clone de minecraft.


Modifier

Merci à tous pour votre aide précieuse (en particulier Nick Wiggill)! C'est ce que j'ai réussi à faire (travail en cours).

Daniel Pendergast
la source
[unité] et C ? Cela ... n'a pas beaucoup de sens.
Martin Sojka
Je comprends C.
Daniel Pendergast Le
8
Vous avez beaucoup de confiance dans la communauté avec une requête si audacieuse. Je veux dire, un document complet sur un terrain voxel entièrement dynamique pour le matériel actuel avec de bons FPS, cela devrait être facile, non? Eh bien, le sujet est si vaste et difficile, je doute que vous voyiez une solution générique et même dans ce cas, elle pourrait être totalement inutile pour votre cas. Mais qui sait, cela peut être faisable en fonction de votre modèle. Voulez-vous un terrain Crysis 2 voxel ou un Delta Force ? Peut-être faites-vous un clone de Minecraft ou avez-vous simplement besoin d'une simulation de sable pour un jeu de creusage? Définir une portée, s'il vous plaît.
EnoughTea
2
Découvrez ce middleware: forum.unity3d.com/threads/… . En particulier la démo
Tetrad
1
GPU Gems 3 contient un chapitre sur le terrain voxel: http.developer.nvidia.com/GPUGems3/gpugems3_ch01.html
Tamschi Le

Réponses:

58

Générer un terrain voxel

(a) Une méthode courante consiste à générer un heightmap en utilisant le bruit Perlin. Une heightmap est essentiellement une image monochrome représentant différentes hauteurs en fonction de l'obscurité ou de la clarté de ses pixels.

entrez la description de l'image ici

Dans cette carte, vous examinerez des pixels individuels pour créer des "piles" de voxels allant jusqu'à différentes hauteurs (axe des z) dans différents emplacements (x, y), en fonction de la luminosité de ce pixel dans l'image heightmap. Etant donné qu'une image de bruit Perlin est lisse (pas de bords nets et clairs à contre-jour), vous obtiendrez un terrain qui roule en douceur.

(b) Vous pouvez le construire progressivement en créant le paysage à partir de différents polyèdres. Créez une forme vectorielle polyédrique qui se rapproche de la forme de voxel souhaitée. En utilisant n’importe quelle méthode point-en-polyèdre 3D (le plus souvent, pointe-en-convexe-coque), vérifiez quels points de la grille de votre monde se trouvent dans ce volume polyédrique. Par exemple, définissez une pyramide dans l'espace. Après avoir vérifié chaque point de la région locale de votre espace mondial par rapport à ce volume pyramidal, vous saurez quels points en font partie et vous pouvez définir ces cellules comme "présentes", ce qui signifie qu'elles deviennent des voxels plutôt que des espaces vides. Vous avez maintenant une pyramide de voxel dans votre espace. Vous pouvez continuer à ajouter des formes de toutes sortes, de cette manière, jusqu'à ce que vous ayez formé un terrain.

(c) (vraiment le même que b ) écrire un outil de modélisation. Voxatron montre à quoi cela ressemblerait. Cela consiste simplement à créer les formes voxel dans un monde de remplacement (l'éditeur), puis à les importer dans votre monde d'exécution réel. Je crois que Voxlap avait le premier éditeur open source pour voxels. Vous pouvez placer des voxels individuels ou utiliser un "pinceau" voxel de formes / volumes différents pour attirer les voxels dans votre monde.


Ce dont vous aurez besoin pour construire votre propre jeu à base de voxel

J'inclus cette section parce que la route de voxel n'est pas facile, du moins pas à présent. Ces derniers temps, les grands acteurs ont de nouveau beaucoup investi dans les moteurs de voxel, en vue d'applications de rendu et de physique.

La simplicité peut être un problème, car la construction dynamique d’un monde à partir de voxels bruts est une approche procédurale de la construction d’un monde qui n’est pas simple en soi . Donc, désolé, il y aura quelques termes techniques ici. Écrire un moteur voxel est une entreprise assez sérieuse qui nécessite des connaissances dans de nombreux domaines du développement du moteur de jeu, en particulier en termes de concepts spatiaux, ce qui implique une compréhension raisonnable de la mathématique vectorielle 3D, des matrices et du calcul élémentaire.

Cela dit, votre "génération de voxels" nécessite un contexte dans lequel travailler, car les moteurs voxels ne sont pas très répandus. Passons à une description de base du fonctionnement d’un moteur voxel.

Les voxels sont les éléments de base de votre monde. Leurs positions sont définies par une grille 3D (tableau) à index entier, plutôt que par un espace continu à virgule flottante (utilisé dans les jeux 3D à base de vecteurs). Ce seront les "atomes" de votre monde. Ils peuvent faire 3 pieds de haut, comme dans Minecraft, ou être plus petits que l'œil de votre personnage virtuel ne peut le voir, à moins d'être regroupés en grand nombre, un peu plus comme des molécules. Il y a deux sortes:

  • Voxels à base de mailles cubiques ( exemple ) - il s’agit d’un type plus récent, utilisé pour la simplicité et facilement utilisable avec les technologies graphiques modernes. Utilisé dans des jeux comme MineCrat et Dungeon Keeper.
  • Point voxels ( exemple , exemple ) - le voxel d'origine. Chacun est un point individuel, collidable dans l’espace, bien qu’il puisse être entouré d’un volume sphérique. Ils sont plus simples, vous pouvez donc en avoir beaucoup plus dans votre monde, et vous pouvez donc les réduire, ce qui est généralement favorable. Comanche et le remake des années 1990 de Lords of Midnight ont été utilisés.

Quoi qu'il en soit, votre approche de la manipulation des voxels dans votre monde est sensiblement la même, comme suit.

Pour construire et déplacer des objets dans votre monde, vous aurez besoin des outils mathématiques mentionnés ci-dessus. Par exemple, pour créer un mur: Construisez une boîte des dimensions appropriées dans un espace 3D, en utilisant des vecteurs. Utilisez les mathématiques matricielles pour transformer votre zone en rotation et en position de votre choix dans votre monde 3D (dans un espace vectoriel continu). Pour un moteur de voxels, l'étape supplémentaire consiste à utiliser maintenant un algorithme 3D de point dans un polyèdre pour déterminer lequel de vos voxels se trouve à l'intérieur de cet espace pivoté.

En gros, c'est la façon dont vous construiriez la plupart des objets de votre monde. Au-delà de cela, vous pourriez écrire vos propres outils pour "modéliser" un personnage comme vous le feriez avec Maya ou 3DS Max. Mais puisque vous modélisez votre personnage avec des voxels plutôt que des points, des arêtes et des faces, vos méthodes seront sensiblement différentes. Si vous décidez ensuite de faire pivoter ces objets dans votre monde, vous devrez également utiliser des transformations de matrice pour le faire.

Un terrain destructible est aussi simple que de supprimer un voxel à la fois selon une méthode de votre choix ou d'utiliser des opérations CSG (Constructive Solid Geometry) sur de grands volumes de voxels pour les supprimer en fonction d'un volume prédéfini. Par exemple, si vous effectuez un faisceau laser à travers une roche, vous pouvez utiliser un volume cylindrique pour soustraire les voxels ici, là où le faisceau tire à travers la roche. Le CSG est un processus relativement simple qui utilise les grilles spatiales 3D qui forment votre monde de voxels et vérifie chaque cellule d'une section d'une grille de base (dans ce cas la roche) par rapport à une autre grille (dans ce cas, le faisceau laser).

Pour avoir des "flux" matériels (comme Vigil l'a laissé entendre dans son commentaire sur le sable), vous devrez vous pencher sur la dynamique des fluides et les automates cellulaires. Celles-ci ont été utilisées par l'auteur de la forteresse naine, Tarn Adams, dans ce qui est essentiellement aussi un monde de voxels (bien que les voxels soient beaucoup plus grands dans ce cas, comparable à Donjon Keeper, le principe reste le même). Ce sont des sujets de pointe et non une nécessité pour les moteurs voxels tels que définis, je vais donc laisser cela comme un "bout" pour vos propres recherches.

La CSG et la dynamique des fluides m'amènent, enfin, à l'optimisation. Les moteurs Voxel en cours de développement utilisent presque exclusivement des octrois voxel (SVO), une méthode permettant de diviser l’espace voxel à différentes résolutions, comme le montre cette vidéo illustrant le moteur Atomontage à venir. L'utilisation d'octrees / SVO est plus une nécessité qu'un choix d'optimisation, en raison des frais généraux de traitement impliqués dans le traitement d'une grille massive et uniforme. Un octree est essentiellement un arbre (graphe acyclique dirigé) où chaque nœud a 8 nœuds enfants ou aucun nœud enfant, selon que l'espace qu'il représente contient des volumes physiques. Les diagrammes montrant comment les octmères subdivisent l'espace pour former des voxels sont ici .

La meilleure implémentation de voxel open source que je connaisse est le moteur Voxlap de Ken Silverman , qui a été utilisé pour Voxelstein3D. Il est écrit en C ++ et implémente les opérations CSG pour la déformation du terrain.

Ingénieur
la source
Le changement de wiki de communauté est permanent, il n'y a aucun moyen de l'inverser. Vous devez supprimer et recréer votre réponse (bien sûr, en sacrifiant vos votes existants)
Jesse Dorsey
meta.stackexchange.com/questions/2974/… , les modérateurs peuvent le supprimer. Je ne sais pas si les choses ont changé, cependant. Merci de regarder dans les deux cas.
Ingénieur
1
Allez comprendre, soyez prudent la prochaine fois.
Jesse Dorsey
2
Le premier est un espace discrétisé où les entités ne peuvent se trouver que directement sur une cellule. Comme des pièces parfaitement placées sur un échiquier, elles ne peuvent pas se trouver "entre" les cellules ou se chevaucher. Tandis qu'un espace continu correspond à ce que l'on trouve dans la plupart des moteurs physiques, c'est-à-dire qu'il repose sur des nombres en virgule flottante et qu'il est donc continu plutôt que quantifié. Votre entité peut s'asseoir à n'importe quelle position de votre choix dans l'espace, comme dans la vie réelle.
Ingénieur
1
La texturation est implicite. Les vrais voxels, qu'ils soient à base de maillage ou non, ont chacun une couleur pure. Les approches susmentionnées ne font que créer des détails plus réalistes et permettent une approche en maillage combiné (google Unity VoxelForm). Plus vos voxels sont fins, plus vos détails de texture seront fins. Exemple: modélisez un lit de rivière sous forme de roche (gris). Convertissez chaque pixel à x distance de la surface, en sable, en définissant ces voxels sur matériau = "sable"; ils peuvent ensuite être rendus en couleur sable. En outre, cela peut également affecter leur interactivité physique, de sorte que le sable peut être déplacé par l'eau ou creusé.
Ingénieur
33

La meilleure façon de générer un voxel intéressant consiste à utiliser une carte de densité de bruit Perlin. Plutôt que d'utiliser une carte de bruit 2D Perlin définissant la hauteur d'un monde 3D, utilisez une carte de bruit 3D Perlin. Pondérez la carte de manière à ce que les valeurs proches du bas soient plus sûrement solides et que les valeurs proches du haut soient définitivement aériennes. Cela donne la hauteur de votre monde, mais permet également des surplombs et des grottes, similaires au terrain de Minecraft , comme le montre cette vue latérale d'une tranche de terrain:

Monde avec des surplombs

À partir de là, vous pouvez tester des îles flottantes ou ajouter des systèmes de grottes en utilisant un bruit fractal:

Monde avec système de grotte

Les images ci-dessus et les idées de système de grotte sont tirées de cet excellent article de blog . Vous pouvez tout apprendre sur le bruit Perlin ici , et il y a quelques exemples de code pour vous aider à démarrer ici .

dlras2
la source
4

Les autres réponses ici sont excellentes, mais j’ai adopté une approche légèrement différente.

Je génère un environnement dans un outil de modélisation (3DSMAX) et en crée un octree clairsemé. Chaque nœud feuille cubique, non vide, est un voxel. Au moment du rendu, j'utilise raycasting (implémenté en HLSL) pour trouver quel voxel occupe quel pixel et assigne le pixel à la couleur stockée dans le nœud, ce que j’ai calculé lors de la génération de l’arbre en faisant la moyenne des valeurs de texture du modèle source.

Vous bénéficiez ainsi de nombreux avantages: détection de collision gratuite, niveau de détail variable, culling d'espace de visualisation, etc.

Malheureusement, il est presque impossible de publier un exemple de code à partir d'un téléphone.

3Dave
la source
+1 pour une alternative. Bien que ce ne soit pas impossible à mettre en œuvre avec des performances raisonnables, les inconvénients l'emportent largement sur les inconvénients. Le lancer de rayons Voxel impose un énorme drain sur le GPU. L'arithmétique et les conditions nécessaires à cela sont très coûteuses, lorsque ces mêmes cycles de GPU pourraient appliquer un nombre impressionnant d'effets d'espace d'écran, par exemple. SSAO. Le plus gros problème est que la diffusion de rayons a l’air meilleur avec des rebonds multiples comme dans la radiosité - ce qui n’est viable ni pour la scène qui comprend des millions ou des milliards de voxels et où chaque segment de rayon nécessite un effort considérable pour rebondir et se composite.
Ingénieur
... C’est la raison pour laquelle j’ai mentionné le raycasting scaline uniquement comme un aparté dans ma réponse (VoxLap) - même s’il est difficile à mettre en œuvre correctement. Si vous pouvez utiliser une approche de ligne de balayage verticale, le coût est d'un ordre de grandeur inférieur au lancer de rayons par pixel, car vous avez réduit la dimensionnalité du processus de rendu de la 3D à la 2D. Cette approche me convient toujours, même si elle exclut des solutions d'éclairage complexes possibles avec votre RTRT traditionnel.
Ingénieur