Aller au contenu
4rno

Sktructure#3 Génération de structures automatisée

Messages recommandés

Bonjour !

Voici l'épisode 3 de Sktructure, un peu différent des autres étant donné qu'ici nous ne nous occuperons pas de manipulation de structure déjà existante, mais bien de génération de structure - et non, nous ne verrons pas comment générer un arbre :p -.

 

 

-Parallélépipède rectangle-

 

Bon, déjà on va simplifier les choses, on va l'appeler "cuboïde" notre structure et non pas "parallélépipède rectangle", avouons-le, c'est 10x plus simple !

Je sais cependant que le nom "cuboïde" n'existe pas -du moins dans le sens que l'on souhaite ici- ' date=' c'est sensé être un adjectif, mais une appellation aussi longue que "parallélépipède rectangle" pour quelque chose d'aussi simple n'est pas tolérable ! Combattons tous ensemble pour simplifier l'usage de la géométrie dans la langue française ! Ensemble on peut y arriver ![/quote']

 

Donc, comme pour les épisodes précédents de Sktructure, nous allons ici aussi utiliser 3 boucles imbriquées, de façon à couvrir les 3 dimension de l'espace (promis, après on fera quelque chose sans les 3 boucles).

 

Du coup, pour faire un cube simplement, on n'as qu'à utiliser un code comme celui-ci:

Contenu masqué

    Réagissez ou répondez à ce message afin de consulter le contenu masqué.

 

Bon, déjà, pour que la structure apparaisse bien à côté du joueur, on va y ajouter une variable {_ploc} qui contient sa position. On pourrais alors s'arrêter là, rendre le code exécutable en le mettant dans une commande, et aller voir ailleurs... Mais non !

Du coup, on va ajouter 2 options supplémentaires à notre génération de cuboïde: l'une va permettre de le rendre creux, l'autre de casser les bords.

 

 

-Rendre le cuboïde creux-

 

Pour faire cela, il faut se demander, au niveau géométrique, comment savoir si il faut poser un bloc à cet endroit là ou non. Vous me direz alors -après un petit temps de réflexion, pas trop long j’espère- , qu'un cuboïde creux, il n'y a que ses faces qui sont présentes, l'intérieur non. Je vous demanderez alors "Comment savoir si un bloc appartient à une face d'un cuboïde ou non ?"

La réponse est assez simple: tester si le bloc est dans au moins l'un des plans dans lesquels sont compris les faces du cuboïde, c'est à dire tester si le cube est à l'une des "extrémités" du cuboïde.

On va travailler un peu différemment, on va créer notre cuboïde plein, puis le creuser, du coup, on va retirer tout bloc ne se trouvant à aucunes "extrémités" -au niveau des coordonnées, on va tester pour les 3 dimensions si la position n'est pas ni minimum ni au maximum-.

 

Voici alors le code obtenu, avec quelques améliorations:

Contenu masqué

    Réagissez ou répondez à ce message afin de consulter le contenu masqué.

 

[spoiler=Pourquoi on teste si c'est pas égal à 1 ? Faut pas tester pour 0 plutôt ?]Et non ! Lorsque l'on fait "loop x times"; la boucle commence à compter à partir de 1 jusqu'au nombre précisé.

 

 

[spoiler=Le résultat !][ATTACH=full]5565[/ATTACH]

 

 

et c'est vide à l'intérieur !

[ATTACH=full]5566[/ATTACH]

 

 

Voilà, c'est tout pour le creusage de cuboïdes, passons maintenant à la suite !

 

 

-Casser les arêtes-

 

Alors, déjà, je sens certains me demander ça veux dire quoi "casser les arêtes" ! Mettons cela au clair, ça n'a rien avoir avec le poisson, ça veux plutôt dire ceci:

 

[ATTACH=full]5508[/ATTACH]

 

Donc pour faire cela, que peut on constater par rapport à ces arêtes ? Quelles sont leurs spécificités ?

En voici la réponse: une arête, c'est lorsqu'un bloc appartient à 2 faces en même temps.

Il ne faudra donc plus tester si le bloc n'appartient à aucune face, mais bien à au moins 2 faces (et oui, sinon les blocs des coins ne seront pas détruis).

Pour faire cela, j'ai créé une variable {_face} à laquelle j'attribue, pour chaque bloc -la récup c'est bien- , le nombre de face auquel il appartenait.

Voici le bout de code utilisé:

Contenu masqué

    Réagissez ou répondez à ce message afin de consulter le contenu masqué.

 

Maintenant on peut utiliser une jolie petite condition:

Contenu masqué

    Réagissez ou répondez à ce message afin de consulter le contenu masqué.

Et ça fonctionne nickel !

[spoiler=Le résultat]Bah scroll un peu plus haut, il y a déjà un exemple ! :p

 

 

-Petite optimisation-

 

Étant donné que l'on a une variable {_face} qui compte le nombre de face à laquelle appartient un bloc, on peut aussi la réutiliser pour le creusage de cuboïde, il faudra alors tester si la variable est égale à 0.

 

 

-Code complet-

 

J'ai ajouté 2 arguments dans la commande, qui permettent de choisir un cuboïde plein et/ou avec les arêtes cassées.

Contenu masqué

    Réagissez ou répondez à ce message afin de consulter le contenu masqué.

 

 

-Escaliers en colimaçon-

 

Comme je l'ai promis, ici nous n'auront pas affaire à une triple boucle... Mais à une seule.

Déjà, il faut se poser la problématique: comment résumer un escalier (en colimaçon) ?

Voici une façon de voir les choses (en tout cas c'est comme ça que l'on va les voir dans mon code !):

  • Quelque chose qui monte (on avance de 1 bloc, on en monte de 1)
  • C'est comme un escalier normal, sauf qu'il y a toujours quelque chose qui le dévie, de façon régulière. Il change de direction tous les x blocs.

À partir de là, on peut s'imaginer la structure du code: une boucle pour chaque hauteur de bloc, une variable qui indique la direction actuelle de l'escalier, et une valeur qui augmente à chaque tour, jusqu'à un certain seuil -la longueur du côté de l'escalier en fait- et qui à ce moment là va faire changer la direction de l'escalier.

 

On va donc créer une variable {_dir} qui nous donne la direction de notre escalier, et qui va prendre une valeur numérale entre 0 et 3 -pour les 4 directions est, sud, ouest et nord-. À chaque boucle, on modifiera des variables correspondant aux coordonnées du bloc à poser. le Y augmentera en permanence de 1, alors que X et Z dépendront de la valeur de {_dir}. Pour optimiser le code, on utilisera la valeur de Y pour déterminer si il faut changer de direction (en testant si le Y actuel est divisible par la largeur de l'escalier).

 

 

-Code complet-

 

Contenu masqué

    Réagissez ou répondez à ce message afin de consulter le contenu masqué.

 

[spoiler=Résultat]En route !

[ATTACH=full]5567[/ATTACH]

 

Argh ! C'est haut !

[ATTACH=full]5568[/ATTACH]

 

 

 

-Conclusion-

 

Dans cet épisode, nous avons vu comment générer des structures de façon automatisée. Je trouve très intéressant de comprendre qu'est ce qui, au niveau mathématique et géométrique, se cache derrière des structures comme celles là. J'espère que ce tuto vous aura plus, malgré le petit retard par rapport au 2 précédents ^^

N'hésitez pas à proposer d'autres idées de structures à générer, ou bien une autre idée pour un futur tutoriel !

 

4rno

  • J'aime 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant

×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer.