IV - Exemples d'élaboration de macros, pas à pas
Je suppose qu'il y a pas mal de gens qui mettent toutes les macros
dans le même sac, moi je préfère considérer qu'il
y en a deux types : les macros normales et les macros "utilitaires".
Ces dernières servent à produire un effet particulier, mais qui
risque d'être insuffisant pour produire à lui seul un terrain.
C'est plus une macro pratique qu'autre chose. Si vous allez sur ma page
de téléchargement des macros, vous pourrez trouver plusieurs
macros de ce type : "Cut Edges" (qui va servir ici de premier exemple),
"Flippers", "Insert Object", "Move Anything",
"Rotate" etc...
Il faut maîtriser correctement WM pour pouvoir faire des macros de ce
type, car pour pouvoir obtenir l'effet qu'on recherche, il faut savoir à
peu près à l'avance quelles combinaisons de modules il faut faire.
Ou du moins en avoir une petite idée... Personnellement, j'ai toujours
besoin de tâtonner un peu pour que tout fonctionne correctement.
Bon, assez de blabla, on passe à la première macro.
1) Macro "Cut edges"
Pour ma macro "Insert Object", le terrain qui sert d'objet doit avoir absolument des bordures correspondant à la hauteur minimale, sinon il y a un problème. Qu'est-ce que j'appelle des "bordures correspondant à la hauteur minimale" ? Je vais reprendre les couleurs utilisées dans Terragen, c'est à dire le noir pour les hauteurs les plus basses, le blanc pour les plus hautes, et les gris pour les hauteurs intermédiaires :
(La bordure rouge ne fait pas partie du terrain)Le terrain normal, qui n'est pas utilisable pour ma macro "Insert Object" |
Le même terrain, avec des bordures minimales. Là j'ai un peu exagéré pour la largeur des bordures, une largeur d'un seul pixel aurait suffi. |
Comment faire pour abaisser totalement les bords du terrain ? Je suppose qu'il y a plusieurs méthodes, moi j'ai préféré utiliser plusieurs "combiner" avec la méthode "multiplication". Pas de panique, j'explique de quoi il s'agit si vous ne le savez pas encore.
Ce module a deux entrées, une pour le terrain A (en haut à gauche), une seconde pour le terrain B (en bas à gauche)
Comme vous le savez (j'espère :p), le module "combiner" associe deux terrains entre eux. Les méthodes (average, substraction...) permettent d'obtenir différents types d'association.
À chaque point du terrain est associée une hauteur, comprise entre 0 (hauteur minimale) et 1 (hauteur maximale). Le module va, pour chaque même point du terrain de même coordonnée, combiner la valeur de la hauteur du terrain A avec celle de la hauteur du terrain B. Par exemple, la méthode "average" va faire la moyenne des deux hauteurs. La méthode "substract" va soustraire la valeur de la hauteur du terrain B à celle de la hauteur du terrain A. Un petit dessin sera plus clair :
Terrain A |
Terrain B |
Méthode "average". On comprend mieux ce que je voulais dire par "moyenne des hauteurs" |
À quoi sert la méthode "multiplication" ? Elle multiplie les hauteurs entre elles. Et ça c'est pratique... Si la hauteur du terrain B est égale à 0, la hauteur du terrain qui résultera de la combinaison sera elle aussi égale à 0... De même, si la hauteur du terrain B est égale à 1, la hauteur du terrain obtenu sera celle du terrain A. Encore un schéma, peut-être ?
Terrain A |
Terrain B |
En haut à gauche du terrain B, La hauteur est maximale. Résultat,
pour cette partie là, on garde les valeurs du terrain A (Je rappelle
qu'un nombre multiplié par 1 ne change pas lol)
En haut à droite et en bas à gauche, la hauteur du terrain B est
nulle. La hauteur du terrain résultant de la combinaison est elle aussi
nulle (un nombre multiplié par zéro est toujours égal à
zéro).
En bas à droite, la hauteur du terrain B est égale à 0.5.
La hauteur du terrain résultant de la combinaison est alors égale
à la moitié de la hauteur du terrain A !
Je tiens aussi à préciser que l'ordre des terrains n'a pas d'importance.
2 fois 3 est égal à 3 fois 2...
Bon, j'espère que vous avez compris comment fonctionne la méthode
"multiplication" du module combiner.
Et j'espère aussi que vous aurez compris le rapport avec la macro que
l'on cherche à réaliser ! En effet, il suffit de créer un
carré blanc aux bords noir, pour que, une fois combiné avec le
terrain de départ, on obtienne un terrain normal avec des bords correspondant
à une hauteur nulle !
Ça, c'était pour la théorie. Maintenant, passons à la pratique. Comment réaliser ce carré ?
J'utilise souvent le module "Gradient", car il permet de faire pas mal de trucs une fois utilisé correctement.
C'est dans l'explication qui suit que vous comprendrez qu'il faut connaître correctement World Machine, car je suppose que quelqu'un qui débute dans ce logiciel aurait eu du mal à penser à ce que je vais utiliser...
Le module "Gradient" (Heightmap Operators -> Generators) crée un gradient, c'est à dire un dégradé qui passe progressivement de la hauteur minimale à la hauteur maximale. On va s'en servir...
Mais avant, repensez à ce qu'on cherche à créer : un carré.
Centré. Comment créer un carré ? On peut par exemple faire
une combinaison de deux bandes : une bande horizontale, une bande verticale,
le tout combiné avec la fontion multiplication :
Terrain A |
Terrain B |
Les deux terrains combinés, toujours avec la méthode "multiplication" : Seule la partie blanche commune aux deux bandes demeure, le reste est "supprimé" par la partie noire d'un des deux terrains... |
Bon, comment obtenir les terrains A et B ?
On va utiliser un module "Select Height" (Heightmap Operators -> Selectors -> Height Selectors). Ce module permet de ne sélectionner qu'une tranche de hauteur. On y connecte un module, on choisit une hauteur minimale, une hauteur minimale, et grâce au module "Select Height", les hauteurs comprises dans la tranche choisie apparaissent en blanc, les autres en noir. Exemple :
Terrain de départ |
Dans le module "Select Height", je n'ai sélectionné que les hauteurs correspondant à la moitié supérieure du terrain : |
Bon... Comment, faire une bande verticale, comme celle un peu plus haut ?
Il suffit de sélectionner les bonnes hauteurs du terrain généré par le module "Gradient". Si on sélectionne par exemple les hauteurs comprises entre 0.25 et 0.75, on aura un bande bien centrée.
Créez un module "Gradient". Reliez-y un module "Select Height". Double-cliquez sur le module "Select Height"... Choisissez des hauteurs "symétriques". Par exemple, si vous sélectionnez une hauteur minimale de 0.1, sélectionnez alors une hauteur maximale de 0.9.
Le mieux, pour obtenir une des valeurs symétriques, est de réaliser l'ensemble de modules suivant :
L'opérateur scalaire "Scalar Inverter" va inverser la valeur du "Scalar Generator". Si ce dernier a une valeur de 0.2, la valeur portée par "Scalar Inverter" sera de 0.8. Si vous avez compris les pages précédentes, vous comprendrez le schéma ci-dessus...
N'oubliez pas mettre la valeur de "fuzziness" au minimum (toujours dans le module "Select Height").
Votre première bande est maintenant faite.
Maintenant, il faut faire la deuxième bande, celle qui
est horizontale. Pas de problème de ce côté là, il
suffit de copier l'ensemble de modules du schéma ci-dessus, et de changer
la direction du gradient en la mettant à 90. Or, problème, on
ne peut pas mettre la direction pile à 90. À 89 ou à 92
oui, mais pas à 90. Comment faire ? Simplement en connectant un scalar
generator au port correspondant à la direction. Avec le scalar generator,
on peut choisir comme valeur 0.25 pile ! Ce qui corespond à une direction
de 90 pour le gradiant.
Note : une fois que le scalar generator (configuré à 0.25) est
connecté au gradient, vous pouvez le supprimer, le gradient conservera
la valeur qui lui a étée "injectée".
Vous obtenez quelque chose comme ça :
Pas très pratique, car à chaque fois on est obligé de changer la valeur des deux scalar generators pour que les bandes restent de la même largeur. Par contre, si on organise les modules de la façon suivante, c'est plus pratique tout de suite... (Pour changer le nombre de port d'un splitter, double cliquez sur celui-ci).
Je sais, c'est un peu bordélique. Mais au moins c'est pratique, il n'y a plus qu'un seul scalar generator à paramétrer pour déterminer la largeur des deux bandes !
Il suffit ensuite de combiner les deux "select height" entre eux en choisissant la méthode multiplication :
Le terrain obtenu par le combiner est le carré qu'on voulait ! Il reste encore à y combiner le terrain de départ, et à créer la macro... Bon, sélectionnez l'ensemble des modules qui permettent de créer le carré, cliquez dessus avec le bouton droit et choisissez "Create macro". Editez alors la macro (bouton droit, "Edit macro components")... Dans le module "Macro in", créez une sortie (comme expliqué dans la page 2), même chose pour le module "Macro Out". Vous devriez avoir quelque chose comme ça :
Créez un nouveau combiner, proche de l'autre. Double-cliquez dessus, et choisissez la méthode Multiplication. Reliez ce combiner à "Macro Out", puis reliez alors la sortie de Macro In (sortie qui correspondra au terrain dont on veut supprimer les bordures) à une des entrées du combiner. Reliez alors l'autre combiner à l'entrée restante. Votre macro devrait ressembler à ça :
Votre macro est maintenant fonctionnelle.. Mais ça serait
bien de pouvoir choisir la taille des bordures, non ? Rien de plus simple, comme
vous le savez il suffit de modifier la valeur de scalar generator. Mais pas
très pratique vu qu'il faudra retourner à la macro... Supprimez
donc ce scalar generator. Sisi, à mort le scalar generator. Allez hop
on ne discute pas. Bon, maintenant que c'est fait, Double-cliquez sur "Macro
Parameters", et ajoutez deux paramètres : Un nommé "taille"
(ou "size", ça dépend si vous voulez donner des noms
anglais ou pas aux paramètres), et un autre nommé "fuzziness".
Appuyez sur OK.
Reliez alors le port du paramètre "taille" au "Scalar
Splitter". Ce paramètre remplacera le scalar generator que l'on
a supprimé.. Et il a l'avantage de pouvoir être changé sans
avoir à éditer la macro.
Quant au paramètre "Fuzziness", que vous relierez à
chacun des deux "select height" (pas de panique, un schéma
arrive), il vous permettra de choisir la taille de la transition entre le terrain
et les bordures (en mettant fuzziness à zéro, le terrain est "coupé
net"). Là encore vous devrez passer par un "Scalar Splitter"
pour pouvoir utiliser ce paramètre dans les deux "Select Height"
à la fois. Notez que, pour le module "Select Height" le port
correspondant au paramètre fuzziness s'appelle "Falloff", mais
ça correspond à la même chose.
Le résultat, après avoir réorganisé les modules pour que ça fasse un peu moins bordélique (et encore...) :
Oui bon c'est vrai que c'est encore plus bordélique tout
compte fait. Pas grave, les modules sont alignés comme ça. Pour
ceux qui ne sont pas contents, la porte c'est par là
Hum ça ne me réussit pas les tutoriels on dirait.
Bref ! Plus qu'à tester votre macro, pour vérifier que tout fonctionne correctement.
Connectez-y un terrain, double cliquez sur la macro, changez les paramètres pour voir si tout va bien. Déjà, vous vous apercevez que si le paramètre "Size" a une valeur supérieure à 0.5, ça ne change plus.. Normal : dans ce cas, les modules "Select Height" choisissent chacun une hauteur minimale supérieure à la hauteur maximale. Il suffit juste de se débrouiller pour que la valeur de Size reste comprise entre 0 et 0.5.
Comment faire ? En utilisant un module "Scalar Arithmetic".
J'ai déjà expliqué à quoi servait ce module en page
3, et là on va utiliser l'opération "Multiply With Value"
en choisissant une valeur de 0.5 pour "Amount". Résultat, le
paramètre "Size", une fois connecté au "scalar
arithmetic", sera divisé par 2 (ou multiplié par 0.5, c'est
la même chose) et sa valeur n'excèdera pas 0.5.
Note : On aurait pu obtenir la même chose en utilisant un module "Scalar
Clamp", avec un minimum à 0, un maximum à 0.5 et l'option
"Rescale"...
Et là, vous obtenez le résultat final :
Vous pouvez maintenant sortir de votre macro, la sauvegarder en mettant une description (pour ça, voir la page 2) et la réutiliser plus tard.
Maintenant, on va étudier une macro déjà faitre...