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