Fichier include du générateur de ville: Guide du design

pour Persistence of Vision 3.1

Créé par Chris Colefax, 1er février 1999


Table des matières

  • Introduction
  • Créer les fichiers d'objets pour City
  • Fichiers d'objets basiques pour City
  • Objets trottoir
  • Objets véhicules
  • Objets bâtiments
  • Options des fenêtres des bâtiments
  • Conseils pour le fichier d'objets et astuces
  • Créer des fichiers de macros pour City
  • Coordonnées de la ville
  • Informations sur le copyright
  • Contacter l'auteur

  • Introduction

    La documentation pour le fichier include de genération de ville explique la structure basique du paquetage de fichiers. Ce document détaille les étapes à suivre lorsque vous créez votre propre macro et vos prores fichiers d'objets.

    Le type de fichier que vous créez (macro ou objet) dépend de la sorte de ville/bourg/village que vous voulez créer. Les fichiers d'objets pour City contiennent les définitions des véhicules, des objets pour les trottoirs (comme les lampadaires), les parties des bâtiments (étage, toit, etc.), qui sont copiés et placés par City.mcr pour assembler la ville. De plus une pincée de hasard peut être ajoutée aux textures pour les bâtiments et pour les fenêtres, tous les objets restant statiques.

    Les fichiers de macros de City, d'un autre côté, vous permettent de redéfinir complètement, non pas seulement les objets de la ville, mais aussi la manière dont les objets sont assemblés. Par exemple, vous pouvez créer une macro qui construit directement les bâtiments (plutôt que juste copier un objet prédéfini), pour vous assurer que vous n'aurez pas deux bâtiments (ou véhicules, ou rues, etc.) identiques. Vous pouvez aussi créer de macros qui animent la ville de diverses manières.


    Créer les fichiers d'objets pour City

    Les fichiers d'objets de City peuvent être créés de deux manières: ils peuvent contenir tous les objets requis pour construire une ville, ou ils peuvent contenir une sélection d'objets (disons, un type de véhicule, ou un simple bâtiment). Le second type de fichier peut ensuite être utilisé avec d'autres fichiers d'objets similaires, donc vous (ou les personnes à qui vous avez distribué vos fichiers d'objets) pouvez construire une bibliothèque de fichiers d'objets pour les combiner de diverses manières.

    Chacun des composants faisant une partie importante d'un objet de la ville sera explicité séparément, donc vous pouvez vous focaliser sur une section à la fois. Par exemple, des simples textures et objets seront utilisés là où ils seront utiles - bien sûr, vous pouvez rendre vos fichiers d'objets aussi complexes et détaillés que vous le souhaitez. Si vous créez des objets avec un modeleur extérieur ou que importez des mesh d'un autre programme, vous devez garder à l'esprit que le générateur de ville utilise un système de coordonnées direct avec l'axe +y pointant vers le ciel (et le sol est à y=0).

    Aussi, alors que l'échelle des objets et des textures est à votre charge (dépendant des options que vous utilisez avec City.inc et City.mcr comme building_width, pavement_height, etc.), vous pourriez préférer utiliser l'échelle par défaut : 1 unité = 1 mètre. Ceci pour faciliter l'échange de fichiers d'objets avec d'autres personnes.

    Fichiers d'objets basiques pour City

    Les éléments nécessaires pour faire un fichier d'objets sont très simples: tout ce que vous devez déclarer, c'est la texture qui sera utilisée pour les rues et celle pour les trottoirs, plus une valeur indiquant à City.mcr de ne pas utiliser les objets par défaut, par exemple:

    #declare city_default_objects = false;
    #declare street_texture = texture {pigment {rgb 0.5}}
    #declare pavement_texture = texture {pigment {rgb 0.7}}

    Si vous sauvegardez ces trois lignes dans un fichier (par exemple MyCity.obj), vous obtiendrez un fichier d'objets prêt à l'emploi utilisable avec City.inc, par exemple:

    camera {location <50, 100, -150> look_at <0, 0, 0>}
    light_source {<-1000, 3000, -4000> rgb 1} 
    
    #include "MyCity.obj" // Replaces DEFAULT.OBJ 
    #include "CITY.INC"

    Calculer la scène ci-dessus montrera l'agencement par défaut de la ville, avec des rues gris sombre et des trottoirs gris clair. Bien sûr vous pouvez déclarer les textures de la manière qui vous plait (images, des bosses, des maps de matériaux, des couches de textures, etc.)

    La troisième texture optionnelle de City est les marques sur les routes. Cette texture doit généralement être semi-transparente, ainsi la texture sous-jacente peut toujours être vue. Une unité de la texture correspondra à une voie de circulation, le long de l'axe x, par exemple pour créer des rues légèrement bosselées:

    #declare street_overlay = texture {pigment {gradient z color_map {[.1 rgb 1] [.1 rgbt 1]}}}

    Aux intersections, deux copies de la texture seront mises l'une sur l'autre, décalées de 90 degrés.

    Objets trottoir

    La prochaine (optionnelle) étape est de placer les objets sur les trottoirs de la ville, ce qui inclue les objets comme les lampadaires, les feux tricolores, les arrêts de bus, les bornes à incendie, les piétons. Pour définir les objets, vous devez définir des tableaux contenant les définitions des objets eux-mêmes, toutes les caractéristiques de l'objet, l'espace par rapport aux objets adjacents, ainsi que le niveau d'aléa dans cet espace. Ces tableaux seront utilisés pour placer les objets sur les quatre côtés de chaque chaussée, avec les rotations d'objets appropriées.

    Pour déclarer les objets eux-mêmes, vous devez imaginer une rue suivant l'axe z, avec les côtés du trottoir placés à l'origine. Bouger l'objet le long de l'axe -x, l'éloignera encore plus de la rue, tandis que prolonger l'objet sur l'axe +x l'éloignera de la rue, et ce, vers la haut. Disons que vous souhaitez créer des lampadaires, des piétons, et des cabines téléphoniques (représentés ici par des formes très simples de la bonne taille):

    #declare pavement_object = array[3] 
    #declare pavement_object_offset = array[3] 
    #declare pavement_object_spacing = array[3] 
    #declare pavement_object_turb = array[3] 
    
    // STREET LAMP 
    #declare pavement_object[0] = cylinder {0, y*3, 0.05 pigment {rgb 0} translate -x*0.25} 
    #declare pavement_object_offset[0] = 3; 
    #declare pavement_object_spacing[0] = 15; 
    #declare pavement_object_turb[0] = 0; 
    
    // PEDESTRIAN 
    #declare pavement_object[1] = cylinder {0, y*1.7, 0.15 pigment {rgb 1} translate -x*1.5} 
    #declare pavement_object_offset[1] = 0.5; 
    #declare pavement_object_spacing[1] = 2; 
    #declare pavement_object_turb[1] = 3; 
    
    // PHONE BOX 
    #declare pavement_object[2] = box {<-1, 0, -1>, <1, 1, 1> scale <0.75, 2.5, 0.75> pigment {rgbf 0.7} translate -x*.8} 
    #declare pavement_object_offset[2] = 5; 
    #declare pavement_object_spacing[2] = 0; 
    #declare pavement_object_turb[2] = 100;

    Dans cet exemple, les lampadaires ont 3 mètres de haut, et sont situés à un quart d'unité de la rue. Le premier lampadaire sur chaque côté du trottoir sera à 3 mètres du coin de la rue, et ils seront placés tous les 15 mètres (aucune turbulence n'est ajoutée dans l'espacement).

    Le piéton est grand de 1.7 unité, et est à 1.5 unité du bord du trottoir. Le premier piéton est à 50 cm du coin de la rue, avec une distance minimale entre deux piétons de 2 mètres. La valeur de turbulences de 3 signifie que ces valeurs peuvent augmenter jusqu'à 3 mètres, par exemple, le premier piéton sera à une distance entre 0.5 et 3.5 unité du coin de la rue, et l'espacement entre les piétons variera entre 2 et 5 mètres.

    La cabine téléphonique mesure 1.5 x 2.5 mètres, et est à 1 mètre de la rue. La valeur d'espacement de zero, signifie qu'une seule cabine sera créée sur chaque côté du trottoir. Aussi, la valeur de la turbulence à 100 signifie que la cabine sera située à entre 5 et 105 mètres de l'angle de rue. Si distance calculée pour une cabine est supérieure à la longueur du trottoir, aucune cabine ne sera créée (une caractéristique utile lorsque vous ne voulez pas toujours un objet par trottoir).

    Objets véhicules

    Les objets véhicules de City sont créés de la même manière que les objets des trottoirs, avec des tableaux contenant les définitions des objets, et l'espace minimum entre deux véhicules. Pour créer des véhicules vous devez imaginer une rue le long de l'axe z. Les véhicules doivent être centrés sur l'origine, le niveau du sol est à y = 0. Si l'avant du véhicule pointe vers la direction +z, le véhicule sera placé du côté gauche de la rue; les véhicules pointant vers la direction -z seront placés du côté droit de la rue. Pour que votre fichier supporte ces deux dispositions, vous pouvez inclure une option similaire à celle utilisée dans VEHICULES.OBJ, par exemple:

    #ifndef (city_left_hand_drive) #declare city_left_hand_drive = false; #end
    
    #declare city_vehicle = array[2] 
    #declare city_vehicle_spacing = array[2] 
    
    #declare city_vehicle[0] = cone {<0, 1, 1>, 1, <0, 0, -1>, 0 pigment {rgb <1, 1, 0>}rotate y*(city_left_hand_drive ? 180 : 0)} 
    #declare city_vehicle_spacing[0] = 2.5; 
    
    #declare city_vehicle[1] = cone {<0, 1, 1.5>, 1, <0, 0, -1.5>, 0 pigment {rgb <1, 0, 0>}rotate y*(city_left_hand_drive ? 180 : 0)} 
    #declare city_vehicle_spacing[1] = 3.5;

    Mettre la valeur de city_vehicle_spacing à la longueur de chaque véhicule sur l'axe z vous évite les chevauchements, même si vous utilisez l'option traffic_spacing pour les rendre très proches.

    Objets bâtiments

    Les objets bâtiments sont les objets les plus compliqués de la ville, avec plus de dix tableaux d'objets, de textures et de valeurs possibles pour un seul bâtiment. En plus, un fichier d'objets doit aussi délarer une liste de valeurs pour indiquer à City.mcr quels tableaux il faut utiliser pour quel bâtiment. La bonne nouvelle est que le fichier DEFAULT.OBJ peut être utilisé pour initialiser les tableaux et les valeurs pour faire un fichier d'objets personnalisés, en plaçant cette ligne au début du fichier:

    #ifndef (building_size) #include "DEFAULT.OBJ" #end

    Après avoir fait ceci, le fichier doit maintenant déclarer les valeurs pour quelques ou tous les tableaux définissant le bâtiment. Pour que votre fichier fonctionne avec d'autres fichiers de bâtiments, vous devez utiliser l'option building_types pour spécifier les index courants des tableaux (c'est-à-dire utiliser [building_types] à la fin de chaque identifiant de tableau, plutôt qu'un nombre comme [0]). A la fin du fichier, vous incrémentez la valeur de building_types de un, pour que l'objet que vous venez de définir ne soit pas écrasé par le suivant, par exemple:

    #declare building_types = building_types + 1;

    Au milieu de ces deux lignes, vous pouvez définir le bâtiment avec les options que vous voulez. Comme pour les objets véhicules, vous devez définir les bâtiments comme étant centrés sur l'origine, avec leur base à y = 0. Les bâtiments doivent aussi être orientés pour que l'avant pointe dans la direction -z et que l'arrière pointe dans la direction +z. Le bâtiment subira une rotation pour que l'avant soit toujours face à la rue entourant le bloc. Pour les bâtiments sur les angles des blocs (avec deux côtés exposés), le côté du bâtiment pointant vers -x sera aussi visible depuis la rue. L'autre côté (pointant dans la direction +x) et l'arrière du bâtiment ne seront généralement pas visibles, excepté si un bâtiment est plus grand que les bâtiments contigus.

    building_size
    Contrairement au trottoir et aux véhicules, les objets bâtiments seront redimensionnés pour s'insérer correctement dans la ville. building_size définit le gabarit du bâtiment que vous déclarez (voir plus bas), les composantes x et -z étant la largeur et la profondeur, et la composante y étant la hauteur d'un étage du bâtiment, par exemple:

    #declare building_size[building_types] = <100, 20, 100>;

    Ceci signifie que vous pouvez créer vos bâtiments de n'importe quelle taille (exemple: 1 unité = 1 pouce ou 1 unité = 100 mètres), et être sûr que vos bâtiments conviendront avec votre ville. Gardez à l'esprit, que les bâtiments sont par défaut de 25 m de large et de profondeur. Si vous créez un bâtiments de 100 mètres de large, et haut de la hauteur appropriée, building_width valant 25, le bâtiment sera du quart de la largeur qu'il aurait du avoir (comparé aux autres bâtiments de la ville). Bien sûr, ça ne posera pas de problème si vous changez l'option building_width.

    building_options
    Cette valeur correspond aux index du tableau qui on été définis pour le bâtiment courant, et doit regrouper toutes les valeurs définies dans DEFAULT.OBJ (c'est-à-dire build_texture, build_fit_texture, build_profile, build_details, build_window_levels, build_window_profile, build_base, et build_roof), par exemple:

    #declare building_options[building_types] = build_profile + build_fit_texture + build_roof;

    Ceci définira un bâtiment en utilisant le profil d'un objet, une texture adéquate, et un objet toit. Chacune des options possibles sera expliquée plus en détail plus bas.

    build_profile
    Basiquement, chaque bâtiment est construit par empilage de niveaux les uns sur les autres, et est ensuite agrandi, tourné, et translaté pour s'insérer correctement dans la ville. Pour certains bâtiments, en plus, la forme globale du bâtiment est la même du sol au toit. Dans ce cas, vous pouvez ajouter la valeur build_profile aux options du bâtiment, et déclarer un objet building_profile, par exemple:

    #declare building_profile[building_types] = box {<-48, 0, -48>, <48, 20, 48>}

    Lorsque le bâtiment est construit, cet objet est mis à l'échelle par rapport à la hauteur d'un étage pour convenir pour toute la hauteur du bâtiment, et ainsi sauver de la mémoire et gagner du temps de calcul puisqu'une seule copie est nécessaire pour tous les étages du bâtiment. Pour cette raison, vous déclarerez aussi une building_texture (si la texture est incluse dans le fichier objet, elle est étendue sur toute la hauteur).

    build_details
    Si vous ajoutez la valeur build_details aux options du bâtiment, vous pouvez déclarer l'objet building_details, par exemple:

    #declare building_details[building_types] = box {<-50, 0, -50>, <50, 1, 50> pigment {rgb 0.3}}

    Cet objet est copié pour chaque étage du bâtiment, translaté jusqu'à la hauteur correcte (de sorte que la boîte suivante commence à la base de chaque étage).

    build_base
    Ajouter la valeur build_base aux options du bâtiment, vous permet de déclarer un objet building_base qui ne sera créé qu'à la base du bâtiment (rez-de-chaussée). Si vous utilisez l'objet building_base, notez que tous les building_details que vous pourriez avoir déclarés ne seront pas créés pour la base. Si vous souhaitez utiliser le même détail d'objet pour la base, assurez-vous de déclarer les détails des objets en premier, puis de les unir avec les objets de la base, par exemple:

    #declare building_base[building_types] = union { 
    box {<-10, 0, -49>, <10, 17, -48> pigment {rgb 0.1}} 
    object {building_details[building_types]}}

    Notez que si l'option build_details est utilisée sans l'option build_base, l'objet building_details sera quand même créé à la base du bâtiment.

    build_roof
    Ajouter la valeur build_roof aux options du bâtiment vous permet de déclarer un objet building_roof (toit) qui sera placé au sommet du bâtiment, par exemple:

    #declare building_roof[building_types] = box {<-52, 0, -52>, <52, 2, 52> pigment {rgb 0.2}}

    Notez que l'objet toit commence à y = 0, et sera translaté verticalement pour venir au sommet du dernier étage du bâtiment.

    build_texture et build_fit_texture
    Ajouter la valeur build_texture aux options du bâtiment vous permet de déclarer une building_texture qui sera appliquée à tous les objets buildings qui ne sont pas texturisés, par exemple:

    #declare building_texture[building_types] = texture {pigment {rgb 0.4}}

    La texture est appliquée après que le building ne soit tourné et translaté, donc les motifs des textures de deux mêmes bâtiments à différents endroits de la ville seront différents. Dans certains cas, néanmoins, la texture peut être mal appliquée (par exemple si vous utilisez des images alignées très précisément). Pour certains types de textures, vous devrez ajouter la valeur build_fit_texture aux options du building au lieu de l'option build_texture. Les building_texture déjà déclarées seront ensuite agrandies, puis translatées avec les bâtiments, pour que l'alignement reste correct.

    Options des fenêtres des bâtiments

    Bien que les options précédentes soient suffisantes pour réaliser les bâtiments complexes, vous risquez de rencontrer des problèmes si vous voulez créer des scènes de nuit contenant des bâtiments avec des fenêtres allumées et d'autres non. Intégrer les fenêtres aux objets building_details signifiera que chaque étage aura le même arrangement de fenêtres, tandis qu'inclure les fenêtres dans la texture requerira des images plus grandes pour un résultat décent, et toutes les copies d'un même bâtiment auront exactement le même arrangement de fenêtres.

    Vous pouvez résoudre ce problème en utilisant l'objet building_windows, avec les macros de textures de fenêtres qui sont incluses dans DEFAULT.OBJ. Ces macros vont créer une texture tri-dimensionnelle contenant des blocs rectangulaires réguliers, d'une taille spécifique. Les macros acceptent deux textures: une pour les fenêtres éclairées, par exemple, avec une forte lumière amiante, et une pour les fenêtres éteintes. Chaque bloc de le texture contiendra l'une ou l'autre de ces textures de base, avec les proportions de chacune contrôlées par les options windows_lit et windows_blend. La syntaxe pour l'utilisation de la première est:

    #declare building_window_texture[building_types] = window_texture (Unlit Texture, Lit Texture, Window Size) La seconde macro exécute ces déclarations automatiquement, et déclare aussi la valeur building_window_size (voir plus bas) pour le type de bâtiment courant:

    set_window_texture (Unlit Texture, Lit Texture, Window Size)

    C'est généralement la méthode la plus simple, mais dans certains cas, vous devrez définir l'option building_window_size manuellement, ou utiliser la texture des blocs de fenêtres comme partie d'une autre texture (auquel cas, vous pouvez la première macro).

    Il y a plusieurs manières de créer des fenêtres pour un bâtiment : la première est de déclarer l'objet building_windows comme l'union de toutes les vitres que vous voulez créer dans tout l'étage du bâtiment. Dans ce cas, vous devez ajouter la valeur build_window_levels aux options du bâtiment, et déclarer une building_window_texture qui couvrira chaque vitre, par exemple:

    #declare building_windows[building_types] = union {box {<-40, 8, -49>, <-20, 17, 49>}box {<20, 8, -49>, <40, 17, 49> }} 
    set_window_texture (texture {pigment {rgb 0.2}}, texture {pigment {rgb 1} finish {ambient 0.8}}, <25, 0, 0>)

    Dans cet exemple, on a créé deux fenêtres (notez comme les fenêtres se prolongent de l'avant à l'arrière du bâtiment). En utilisant <25, 0, 0> pour l'option de taille des fenêtres, vous indiquez que chaque bloc de la texture des fenêtres doit avoir 25 unités de large, mais aucun bloc ne sera créé dans les directions y et z. Pour comprendre pourquoi cette valeur est utilisée, vous devez comprendre ce que l'option building_window_size fait. Outre le fait que la macro définisse la taille du bloc de la texture créée, chaque fois une copie de l'objet building_window est créée, la texture est déplacée selon un multiple de ce vecteur, par exemple: une copie peut voir sa texture déplacée selon <50, 0, 0>, une autre selon <-225, 0, 0>. De cette manière nous ne pouvons avoir deux fois le même arangement de fenêtres éclairées et non éclairées.

    Un problème avec la méthode précédente, c'est que la création d'autres fenêtres nécessite plus d'objets, et des bâtiments avec beaucoup d'étage nécessitent de plus en plus de mémoire. Vous pouvez éviter ceci en utilisant l'objet building_windows qui enveloppe tout le bâtiment, puis en utilisant la macro window_texture () comme faisant partie d'une texture (exemple : brique ou gradient). Vous pouvez voir un exemple de cette méthode dans le bâtiment rouge brique définit dans FLATS.OBJ.

    Néanmoins, ces deux méthodes ne créent des fenêtres que sur l'extérieur du bâtiment. Pour créer des fenêtres qui sont incorporées dans le bâtiment, vous pouvez ajouter la valeur build_window_profile dans les options du bâtiment, puis définir l'objet building_windows de la même manière que l'objet building_profile (cad qu'il sera agrandi pour prendre toute la hauteur). Dans ce cas la building_window_size doit aussi contenir une composante y égale à la hauteur d'un étage, de sorte que chaque étage ait un arrangement de fenêtres différent. Vous pouvez ensuite recouvrir tout le bâtiment, en utilisant à chaque fois un objet building_details contenant les découpages nécessaires pour voir les fenêtres de l'extérieur, ou en utilisant une building_texture adéquate qui contient des espaces vierges. Vous pouvez voir des exemples de ces deux méthodes dans les fichiers d'objets bâtiments allant avec le paquetage City.

    Conseils pour le fichier d'objets et astuces

    Avec de la chance, les informations ci-dessus, à propos des fichiers d'objets de City, seront suffisante pour vous permettre de vous lancer dans la création de vos propres nouveles villes. Voici quelques trucs à garder à l'esprit:


    Créer des fichiers de macros pour City

    Redéfinir les macros que City.inc utilise pour construire la ville, cela vous permet d'étendre les possibilités du fichier Include de génération de ville. Cette documentation permettra dans les grandes lignes les définitions de macros ainsi que les paramètres.

    Coordonnées de la ville

    Comme mentionné précédemment, le fichier include de génération de ville utilise un système de coordonnées directes. Toutes les coordonnées passées aux macros seront dans le plan x-y, et aucune donnée concernant les hauteurs n'est déterminée dans les fichiers ou passées aux macros. Notez que vous ne devez déclarer que les macros que vous souhaitez utiliser pour une construction de ville particulière.

    De plus, étant donné que les macros sont appelées depuis City.inc toutes les variables locales à ce fichier peuvent être utilisée dans les macros (par exemple street_width, building_width, city_corner1 & city_corner2, BlockSize, etc). Vous pouvez aussi déclarer et utiliser vos propres variables globales (comme des initialisateurs de nombres aléatoires ou des données relatives à des hauteurs) pour permettre à la macro l'utilisation d'autres paramètres.

    Notez aussi que le fichier TEMPLATE.MCR inclus avec le générateur de ville contient toutes les définitions des macros suivantes, ainsi que des exemples de création d'objets

    city_base
    Definition de la macro: city_base (Coin1, Coin2)

    Cette macro est généralement utilisée pour créer le terrain sur lequel la ville est créée. Habituellement le sol est au niveau y = 0, bien que le fichier de macro puisse inclure ses propres informations sur la hauteur, par exemple vous pourriez utiliser une version personnalisée de POV-Ray pour déterminer les hauteurs de divers points du `height field` (voir les propriétés de cet objet dans l'aide de POV-Ray). Le fichier de macros peut accepter une option comme city_height_field, et cette macro positionnera ensuite la hauteur du `height field` correctement (après avoir contruit les rues, les trottoirs et bâtiments sur celui-ci).

    city_street
    Definition de la macro: city_street (Depuis, Vers, Direction)

    Les valeurs Depuis et Vers tracent une ligne au centre dela rue, la largeur étant déterminée par l'option street_width. La valeur Direction indique le long de quel axe la rue se prolonge, avec 0 indiquant l'axe x et 1 indiquant l'axe z. Ceci est utile quand vous ajoutez de la circulation, vous devez savoir dans quel sens elle est orientée.

    city_pavement
    Definition de la macro: city_pavement (Coin1, Coin2)

    Les deux valeurs Coin1 et Coin2 pour chaque trottoir regroupent les informations pavement_width et building_gap. Comme avec la macro city_base, aucune information sur la hauteur n'est définie dans City.inc.

    city_building
    Definition de la macro: city_building (Coin1, Coin2, Direction)

    Les deux valeurs Coin{1,2} définissent les limites selon x-z des bâtiments qui seront créés. Une valeur Direction de 0 indique qu'un bâtiment est tourné cers la direction -z, une valeur de 1 indique qu'il est tourné dans la direction +x, 2 indique la direction +z, et 3 indique la direction -x. En général, cela correspond à une rotation de y*-90*Direction d'un bâtiment (bien que vous pouvez bien sûr choisir d'ignorer complètement cette valeur).

    city_finish
    Definition de la macro: city_finish ()

    Si elle est définie, celle macro sans paramètre est appelée après que toutes les autres macros de la ville aient été appelées, mais avant les transformations par des options city_transform, et avant la dernière parenthèse de l'union d'objets de la ville. Cette macro peut contenir des transformations de la ville, peut ajouter d'autres objets à la ville, par exemple la macro city_building peut créer des objets de taille aléatoire, stocker la hauteur du bâtiment le plus haut dans une variable. La macro city_finish peut ensuite modifier la ville en tenant compte de cette hauteur enregistrée.


    Informations sur le copyright

    Les déclarations sur le copyright à propos du paquetage de génération de ville peuvent être consultées sur la documentation de l'utilisateur.

    En plus de ces déclarations, tous les objets et les fichier de macros créés pour être utilisés avec le générateur de ville restent entièrement la propriété de l'utilisateur ou des utilisateurs qui les ont créés. Les auteurs endossent la responsabilité de leurs fichiers.


    Contacter l'auteur

    Si vous souhaitez me contacter pour me signaler des bugs, des bugs réparés, des critiques, des commentaires, des suggestions d'améliorations, des questions, etc. vous pouvez me joindre par email à:

    ccolefax@geocities.com

    ou par courrier à l'adresse:

    Chris Colefax
    PO Box 110
    Kuranda, Queensland
    Australia 4872


    Traduit de l'anglais par Pierre Schwartz

    POV-RayTM et Persistence of VisionTM sont des noms déposés par POV-Ray TeamTM