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:
- code et algorithmes. de préférence à base de C #
- explications. Je suis un débutant avec des algorithmes mais je suis très familier avec la programmation orientée objet
- démonstrations pas à pas. Pas seulement le concept mais la direction.
- 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).
procedural-generation
terrain-rendering
voxels
csg
Daniel Pendergast
la source
la source
Réponses:
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:
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.
la source
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:
À partir de là, vous pouvez tester des îles flottantes ou ajouter des systèmes de grottes en utilisant un bruit fractal:
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 .
la source
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.
la source