Terrain generation and editing: OpenSim tuning

Cet article fait suite à la première partie dédiée à la génération et l’édition de terrain pour OpenSim.
Il a pour objectif de détailler l’intégration et la gestion du terrain dans OpenSim ainsi que les retouches à réaliser sur la cartographie afin d’obtenir un relief “tout en douceur” , facilement praticable par un avatar en marchant. Cet article est principalement consacré au travail des heightmaps en niveaux de gris.

Les pré-requis pour cet article sont:

  • avoir une cartographie de base, disponible sous forme de fichier image, en niveaux de gris.
  • avoir OpenSimulator installé et configuré (Homepage)
  • avoir au moins un viewer fonctionnel connecté à l’instance d’openSim (Singularity | FireStorm | Alchemy )
  • au besoin, avoir un éditeur d’image/photo installé (GIMP)

Au delà des limitations des heightmaps

Comme vu précédemment, les heightmaps sont principalement exportés sous forme d’image en niveaux de gris. Certains éditeurs proposent des exports sous formes plus évoluées: fichier colorés, raw 32 bits etc.. il n’est toutefois pas facile de retoucher ces fichiers pour une raison simple: il faut bien garder en tête les gammes de colorimétrie lors des retouches: les tons bleus indiquent une certaine gamme de hauteur, tandis que les tons rouge une gamme tout à fait différente, la gamme verte venant s’intercaler entre les deux (ou pas!). Cela complique le travail des dénivelés, dégradés et des lissages.

Les heightmaps en niveaux de gris sont plus simples à interpréter et retravailler car monochromes mais disposent d’une limitation de taille: les valeurs possibles dans les niveaux de gris oscillent entre 0 et 255 (valeurs entières uniquement). Zéro étant le point le plus bas, et 255 le plus haut. Le point culminant aura une valeur maximum de 255 lors de l’importation initiale dans OpenSim. Si l’on désire modéliser une grande montagne qui aurait un pic à 700 de hauteur par exemple il faudra ruser pour contourner cette limitation.

La technique pour contourner cette limitation consiste à faire un choix parmi deux méthodologies de travail:

  • soit remanier le terrain au sein même d’OpenSim: utiliser les commandes fournies par OpenSim pour étirer le terrain et le recalibrer (voir ci-dessous les commandes multiply, rescale, elevate, etc..). Dans ce cas il faudra vérifier dans un viewer les dénivelés afin qu’ils restent praticables par un joueur. S’il reste des zones difficilement praticables, il faudra utiliser les outils d’édition de terrain intégré au viewer pour retoucher localement le terrain (lisser, aplatir..)
  • soit se décider à découper la cartographie d’origine en sous élements plus petits (par exemple 256×256), les importer séparément dans chaque région puis faire varier la hauteur de ceux-ci à l’aide des commandes elevate, lower ou rescale afin de créer des dénivelés plus importants d’une parcelle à l’autre. Attention toutefois, cette démarche est plus difficile à mettre en oeuvre et il faut bien se concentrer sur les raccords entre parcelles.

Heightmaps en pleines couleurs: des interprétations différentes selon les outils

Au delà des limitations d’OpenSim

Du coté d’OpenSim on retrouve diverses limitations imposées par le moteur interne:

  • l’unité de base: l’unité de référence est toujours la même au sein d’une région pour une heightmap: un pixel correspond à un mètre linéaire dans le monde OpenSim. Il s’agit la de la plus petite mesure possible. En retravaillant la cartographie via les opérations terrain disponibles au sein de l’interpréteur de commande dans OpenSim la définition de la carte restera la même et ne pourra dépasser le mètre linéaire en précision.
  • niveau de la mer: Le niveau par défaut de la mer d’une région d’OpenSim est de 20. Cette valeur peut être aisément changée. En conservant cette valeur de 20 mètres de hauteur, la couleur de référence permettant d’identifier la mer est #141414 (car 20 en décimal est égal à 14 en hexa-décimal). Il faudra donc décider le plus tôt possible si le niveau doit rester le même ou s’il doit être changé. De plus ce niveau est unique pour une région. Il ne sera donc pas possible de réaliser des lacs ayant un niveau de hauteur différent, ni même des chutes d’eau. Pour cela il faudra avoir recours à des meshes et du scripting LSL (effets de particules)
  • extrapolation linéaire: Le chargement de la heightmap est réalisé par extrapolation par OpenSim. Un pixel correspond à un mètre linéaire et son pixel voisin sera évalué un mètre plus loin. OpenSim va tisser un segment raccord entre ces deux valeurs de dénivelés. Il peut ainsi en découler des dénivelés assez abruptes si les valeurs entre ces deux points sont très différentes. Découle de cette propriété le fait qu’il n’est pas possible de réaliser des cavités car OpenSim va toujours tisser un raccord d’un point vers ses points adjacents. Ainsi, tunnels, ponts, cavernes etc. donc tout élément venant entailler la surface du relief ne peuvent pas être réalisé directement lors de la génération du terrain. Il faudra avoir recours à des imports de meshes 3D pour réaliser ce type de reliefs.
  • pathfinding: un autre détail à prendre en compte est la capacité d’un avatar à marcher, franchir les dénivelés et gravir les côtes (bref, à tracer son chemin à travers le relief). Cette capacité est approximativementd’un mètre en qui concerne la hauteur, ceci à condition qu’il n’y ait pas d’obstacles complexes (tels que des meshes 3d) qui compliquent le relief.

Les commandes “terrain” OpenSim

Les commandes terrain disponible sous OpenSim sont les suivantes:

Region (kosmology) # help terrain
=== terrain ===
* terrain load - Loads a terrain from a specified file.
* terrain load-tile - Loads a terrain from a section of a larger file.
* terrain save - Saves the current heightmap to a specified file.
* terrain save-tile - Saves the current heightmap to the larger file.
* terrain fill - Fills the current heightmap with a specified value.
* terrain elevate - Raises the current heightmap by the specified amount.
* terrain lower - Lowers the current heightmap by the specified amount.
* terrain multiply - Multiplies the heightmap by the value specified.
* terrain bake - Saves the current terrain into the regions revert map.
* terrain revert - Loads the revert map terrain into the regions heightmap.
* terrain newbrushes - Enables experimental brushes which replace the standard terrain brushes. WARNING: This is a debug setting and may be removed at any time.
* terrain show - Shows terrain height at a given co-ordinate.
* terrain stats - Shows some information about the regions heightmap for debugging purposes.
* terrain effect - Runs a specified plugin effect
* terrain flip - Flips the current terrain about the X or Y axis
* terrain rescale - Rescales the current terrain to fit between the given min and max heights
* terrain min - Sets the minimum terrain height to the specified value.
* terrain max - Sets the maximum terrain height to the specified value.

En dehors des commandes de chargement (load) et sauvegarde (save) de terrain, OpenSim propose un panel de fonctions intéressantes pour recalibrer le terrain.


terrain fill [height]

Remplit/remplace le terrain de la région actuelle par une carte totalement plane dont la valeur (constante) est précisée en paramètre. Note: Eviter de placer le terrain exactement à la hauteur de la mer (terrain fill 20 pour un settings par défaut) car OpenSim ne saura pas décider à priori qui, du terrain ou de la mer est au dessus de l’autre. L’affichage sera donc hasardeux.

Exemple avec un hauteur de terrain de 25 (donc 5 points au dessus du niveau de la mer par défaut qui est de 20):

Region (kosmology) # terrain fill 25


terrain elevate/lower [amount]

Elève ou abaisse tout le terrain de la région de [amount] mètres. Les valeurs les plus basses seront clippées à zéro, les plus hautes à 255 par défaut (ou plus si la configuration de la région le permet).
Exemple d’une double élévation du terrain de 5 mètres puis 10 mètres qui équivaut à une seule élévation de 15 au total (terrain elevate 15).

Region (kosmology) # terrain elevate 5
Region (kosmology) # terrain elevate 10


terrain multiply [number]

Multiplie chacune des valeurs de la heightmap par [number]. Cela correspond donc à une mise à l’échelle verticale du terrain. Si number est supérieur à 1 alors on étire/agrandit le terrain, si number est inférieur à 1 alors on le contracte/réduit. Garder à l’esprit qu’étirer le terrain augmente les dénivelés. Il faudrait donc bien vérifier les parcours avec un avatar en mode marche.
Exemple d’étirement de 1.8x la hauteur du terrain.

Region (kosmology) # terrain mulitply 1.8


terrain rescale [min] [max]

Rééchantillonne TOUTES les valeurs du terrain pour que la valeur minimale corresponde à [min] et que la valeur maximale corresponde à [max]. Il s’agit d’une autre forme de contraction/extension de terrain. Cela équivaut à un multiply excepté que l’on précise les bornes inférieurs et supérieures au lieu du facteur de multiplication.

Exemple d’étirement de terrain afin de l’ajuster systématiquement au dessus du niveau de l’eau par défaut (20) avec un maximum de hauteur 15 mètres en dessous du maximum région par défaut (255 – 15 = 240).

Region (kosmology) # terrain rescale 21 240


terrain min [minValue]

Clip toutes les valeurs inférieures à [minValue] sur le terrain et les rends égales à [minValue]. Ceci peut être vu comme une fonction d’aplatissement par le bas.

Exemple de clip de terrain à 19 mètre, donc pour tous les points sous le niveau de la mer par défaut (=20). De cette façon le terrain sera praticable par un avatar en marchant dans l’eau. En effet placer le point minimum du terrain à 19 laisse un mètre de profondeur dans l’eau. Ce qui est facilement praticable par un joueur.

Region (kosmology) # terrain min 19


terrain max [maxValue]

Clip toutes les valeurs supérieures à [maxValue] sur le terrain et les rends égales à [maxValue]. Ceci peut être vu comme une fonction d’aplatissement par le haut.

Exemple de clip de terrain pour tous les points situés en hauteur (collines, montagnes) afin de créer des plateaux à 70 mètres.

Region (kosmology) # terrain max 70

La commande “terrain modify”

Fonction non documentée en ligne dans l’interpréteur OpenSim (v 0.8.2), elle s’avère pourtant être d’une très grande utilité.
Cette fonction permet d’appliquer un effet de zone sur une parcelle du terrain.

Syntaxe et paramères de terrain modify

terrain modify <operation> value [<mask>] [-taper=<value2>]

value: base value to use in applying operation

mask:
-rec=x1,y1,dx[,dy] creates a rectangular mask based at x1,y1
-ell=x0,y0,rx[,ry] creates an elliptical mask centred at x0,y0

taper:
- rectangular masks taper as pyramids
- elliptical masks taper as cones

L’effet de zone est tout d’abord décrit par son opération qui peut être de type: remplissage (fill), minimum (min), maximum (max), elever (raise), abaisser (lower), bruit (noise), adoucir (smooth).
Toutes ces opérations acceptent un premier paramètre qui est la valeur standard value qui sera appliquée au cours de l’effet.
Un effet de zone s’applique par définition à une zone définie qui est précisée à l’aide du paramètre mask. Si ce paramètre est omis, l’effet est appliqué à toute la parcelle. mask peut être de deux types: rectangulaire ou elliptique. En mode rectangle, il faut préciser les coordonnées de départ (x1, y1) ainsi que la largeur (dx) et en option la hauteur (dy). Si la hauteur est omise alors dy prendra la valeur de dx ainsi l’effet aura la forme dans un carré et non un rectangle. Dans le cas d’une ellipse, il faut préciser le centre de l’ellipse à l’aide de puis un rayon rx et en option ry. Si ry est omis, alors ry prendra la valeur de rx auquel cas l’effet prendra forme dans un cercle.
Enfin, le dernier paramètre taper (effilage) va permettre de modifier le comportement au périmètre de la zone décrite par le masque. Si la zone est rectangulaire l’effilage produira une pyramide, si elle est elliptique, l’effilage sera conique.
Important:

  • si taper est utilisé, alors la valeur du paramètre value sera appliqué au centre de la zone et la valeur de value2 aux extrémités.
  • l’opération smooth se comporte quelque peu différemment: les paramètres value et value2 prennent pour valeur une force d’adoucissement compris entre 0.01 et 0.99.

L’algorithme utilisé par la fonction smooth est une moyenne pondérée aux points adjacents. Pour plus de détails sur cette opération voir la page de documentation officielle.

Exemple de terrain modify avec les opérations elevate puis smooth

Region (kosmology) # terrain modify elevate 28 -ell=128,128,64 -taper=11

Region (kosmology) # terrain modify smooth 0.5 -taper=0.3

Démonstation des opérations “terrain modify” en vidéo

kosmo