Tutoriel: Création d'une station avec arrêts de bus

Willkommen in der Transport Fever Community

Wir begrüßen euch in der Fan-Community zu den Spielen Transport Fever und Train Fever, den Wirtschaftssimulatoren von Urban Games. Die Community steht euch kostenlos zur Verfügung damit ihr euch über das Spiel austauschen und informieren könnt. Wir pflegen hier einen freundlichen und sachlichen Umgang untereinander und unser Team steht euch in allen Fragen gerne beiseite.

 

Die Registrierung und Nutzung ist selbstverständlich kostenlos.

 

Wir wünschen euch viel Spaß und hoffen auf rege Beteiligung.

Das Team der Transport-Fever Community


  • Création d'arrêts de bus dans une station


    Préambule.
    Pour présenter ce sujet, j'ai utilisé une structure empruntée à kanshi (que je remercie) intitulée "TV tower St Chrischona" que vous pouvez télécharger sur ce site.
    La circulation des personnes et des bus a été complètement modifiée pour les besoins de ce tuto.
    Vous pouvez télécharger sur ce site mon tuto et l'intégrer en tant que mod dans le jeu sous le nom de ML_tuto1_1



    Voici la station vue de la route (Fig.1):



    O est le point de coordonnées (0,0,0). Les axes sont orientés comme indiqué sur la figure, donc X positif vers le bord droit de la structure,
    Y positif vers le bord supérieur de la structure et Z positif vers le haut, perpendiculairement au plan X,Y de la structure.
    Ainsi, le point d'entrée/sortie des piétons P0 a comme coordonnées (7,0,0), l'autre point d'entrée/sortie des piétons P12 a comme coordonnées (-7,0,0)
    Les points d'entrée et sortie des bus ont comme coordonnées respectives: B0 (2.5,0,0) et B10 (-2.5,0,0).


    La structure est reliée à la rue principale par une route de connexion "new_medium". Le fichier se trouve dans:


    \res\config\street\new_medium.lua


    Si vous ne savez pas comment relier cette route à la structure, je vous conseille le lire le tuto en anglais à l'adresse suivante:


    WIKI


    En gros, la liaison entre la rue principale et la structure se fait au moyen d'une autre route, de manière à ce que les véhicules
    et les piétons puissent entrer et sortir de cette structure.
    Le codage se fait dans un fichier construction dont l'extension est .con que l'on trouve dans le répertoire


    \res\construction\


    Si vous jetez un oeil sur l'un de ces fichiers, vous verrez dans local result = {} une section result.edgeLists.
    C'est là que l'on code le type de liaison entre la structure et la rue principale.


    Pour mon tuto j'ai utilisé:



    Sachez simplement que la route associée à la structure se relie avec la rue principale par le segment (edge) du bas de cette route (snapNodes = {1})
    Dans un prochain tuto, je vous expliquerai l'utilité complète de ce fichier construction (.con).


    Revenons à notre sujet principal:
    la création d'arrêts de bus dans la structure.


    Nous devons définir 2 trajets:
    l'un utilisé par les piétons et l'autre par les bus.
    Chaque arrêt sera composé d'un point pour les bus et d'un point pour les piétons. En outre, les piétons devrons attendre le bus sur certaines portions de leur trajet, sinon, ils s'agglutineraient en un seul point !


    Chaque trajet est constitué de segments (edge en anglais) et chaque segment est défini par deux points que l'on appelle noeuds (nodes en anglais).
    Chaque point de départ d'un segment doit correspondre avec le point d'arrivée d'un autre segment.
    Retenez bien que puisque les segments sont définis dans une liste, le premier segment aura l'indice 0, le second l'indice 1 et ainsi de suite.
    C'est pareil pour les noeuds: le premier noeud sera le noeud 0, le second le noeud 1, etc...


    Quel est le premier noeud du premier segment ?
    Pour les bus, sur la figure 1, je l'ai noté B0. C'est un point qui se situe sur le segment de la route reliée à la structure. Je vous rappelle que l'autre segment de cette route est relié à la rue principale.
    Ici, ce point d'arrivée du bus ( le noeud 0) a comme coordonnées (2.5,0,0)
    Pour les piétons ce sera les points P0 et P12.


    Pourquoi 2 points d'entrées/sorties pour les piétons et un seul point d'entré et un point de sortie pour les bus ?
    Tout simplement parce que un bus roule toujours sur la droite de la rue alors que les piétons peuvent venir des deux côtés du trottoir.
    Ils se dirigeront vers les arrêts de bus en empruntant le chemin le plus court.
    Par exemple, s'ils attendent le bus à l'arrêt T2 ils entreront/sortiront par le nœud P12.


    Remarque importante
    Les piétons qui attendent le bus à un arrêt regardent toujours vers la gauche par rapport au sens de définition des segments d'attente.


    Prenons l'exemple du segment P10-P11 qui représente l'un des 2 segments où les piétons attendent le bus à l'arrêt T2.



    Si je définis, dans la liste des nœuds ce segment en prenant P10 comme point de départ et P11 comme point d'arrivée, la direction est de haut en bas et les piétons à l'arrêt regarderont vers l'intérieur de la structure, c'est à dire vers le bus quand il arrive.


    Par contre , si j'avais défini ce segment en commençant par le point P11, alors les piétons en attente du bus regarderaient vers l’extérieur de la structure, c'est-à-dire qu'ils tourneraient le dos au bus !
    Donc, prenez toujours pour habitude de définir l'ordre des points d'entrée et de sortie d'un segment dans le sens de déplacement des bus.


    Axes d'alignement ou axes de rotation
    Vous remarquerez dans la figure 1 que les chemins décrivent des courbes lorsqu'ils tournent à droite ou à gauche.
    Cela est réalisé grâce aux axes d’agilement. Sans eux, les chemins qui relient deux point se feraient en ligne droite, donc pas très naturel pour un véhicule ou pour un piéton.


    Voici le schéma des axes de rotation normalisés. Normalisés veut dire que chaque coordonnée (abscisse (X),ordonnée (Y) et cote (Z)) peuvent avoir comme valeur: 0 ou-1 ou 1.



    Il faut interpréter ce schéma en visualisant les chemins des bus et piétons depuis la rue principale.


    Donc, lorsque'un piéton se dirige vers le bord supérieur de la station, l'axe de rotation du nœud de départ et du nœud d'arrivée sera (0,1,0).
    Si le bus tourne vers la gauche, l'axe de rotation sera (-1,0,0), s'il descend, l'axe sera (0,-1,0) et s'il tourne à droite (1,0,0).


    Maintenant que nous avons compris les bases, voyons comment coder tout cela.


    Les chemins des bus et des piétons sont définis dans un fichier en langage lua dont le nom est nomdumodule.mdl ("mdl" est l'abreviation de "modèle").
    Ce fichier doit se trouver dans le répertoire :


    \res\models\model\railroad\nomdumodule.mdl


    En voici la structure:



    Intéressons nous aux listes des lignes (laneLists).


    C'est ici que nous allons coder les chemins empruntés par les piétons (transportModes = {"PERSON"}) et les bus (transportModes = {"BUS"}).
    Comme vous le voyez, il s'agit d'une liste dont chaque élément est une autre liste de segments du chemin appelés "edge".


    Puisque nous avons décidé de commencer par le chemin des piétons, le premier nœud correspond au point P0 de la figure 1.
    Le second nœud correspond au point P1 et ainsi de suite.
    Voici les coordonnées des premiers points:


    ...............Coordonnées Axe d'alignement
    P0 Nœud 0 { 7.0, 0.0, 0.1} { 0, 1, 0 }
    P1 Nœuds 1 et 2 {10.0, 6.0, 0.1} { 0, 1, 0 }
    P2 Nœuds 3 et 4 {10.0, 12.0, 0.1} { 0, 1, 0 }
    P3 Nœuds 5 et 6 {10.0, 18.0, 0.1} { 0, 1, 0 }
    P4 Nœuds 7 et 8 { 7.0, 20.0, 0.1} { -1, 0, 0 }
    P5 Nœuds 9 et 10 { 3.0, 20.0, 0.1} { -1, 0, 0 }
    P6 Nœuds 11 et 12 { 0.0, 20.0, 0.1} { -1, 0, 0 }


    Petite question: pourquoi 0.1 comme coordonnée z et pas 0.0 ?


    Nous mettons cette valeur de manière à ce que le piéton n'ait pas ses pieds enfoncés légèrement dans le sol.
    C'est donc juste pour une question d'esthétique.


    Ce qui se code:


    { { 7.0, 0.0, 0.1 }, { 10.0, 6.0, 0.1 }, { 0, 1, 0 }, { 0, 1, 0 }, 2.0 }, -- 0 - 1: Segment 0 (Edge 0)marche depuis le trottoir tout droit vers le haut
    { { 10.0, 6.0, 0.1 }, { 10.0, 12.0, 0.1 }, { 0, 1, 0 }, { 0, 1, 0 }, 2.0 }, -- 2 - 3: Segment 1 (Edge 1)continue tout droit vers le haut
    { { 10.0, 12.0, 0.1 }, { 10.0, 18.0, 0.1 }, { 0, 1, 0 }, { 0, 1, 0 }, 2.0 }, -- 4 - 5: (Segment 2 (Edge 2)continue à monter tout droit vers le haut
    { { 10.0, 18.0, 0.1 }, { 7.0, 20.0, 0.1 }, { 0, 1, 0 }, { -1, 0, 0 }, 2.0 }, -- 6 - 7: Segment 3 (Edge 3)continue à monter tout droit vers le haut avec une courbe vers la gauche
    { { 7.0, 20.0, 0.1 }, { 3.0, 20.0, 0.1 }, { -1, 0, 0 }, { -1, 0, 0 }, 2.0 }, -- 8 - 9: Segment 4 (Edge 4)marche tout droit vers la gauche
    { { 3.0, 20.0, 0.1 }, { 0.0, 20.0, 0.1 }, { -1, 0, 0 }, { -1, 0, 0 }, 2.0 }, -- 10 - 11: Segment 5 (Edge 5)marche tout droit vers la gauche


    Remarquez bien que le nœud de la fin d'un segment devient le nœud du début de l'autre segment.


    On fait pareil pour la descente jusqu'au trottoir:


    {{ 0.0, 20.0, 0.1 }, { -3.0, 20.0, 0.1 }, { -1, 0, 0 }, { -1, 0, 0 }, 2.0 }, -- 12 - 13:Segment 6 (Edge 0)marche tout droit vers la gauche
    {{ -3.0, 20.0, 0.1 }, { -7.0, 20.0, 0.1 }, { -1, 0, 0 }, { -1, 0, 0 }, 2.0 }, -- 14 - 15: Segment 7 (Edge 1)marche tout droit vers la gauche
    {{ -7.0, 20.0, 0.1 }, { -10.0, 18.0, 0.1 }, { -1, 0, 0 }, { 0, -1, 0 }, 2.0 }, -- 16 - 17: Segment 8 (Edge 2)tourne vers la gauche et descend
    {{ -10.0, 18.0, 0.1 }, { -10.0, 12.0, 0.1 }, { 0, -1, 0 }, { 0, -1, 0 }, 2.0 }, -- 18 - 19: Segment 9 (Edge 3)descend
    {{ -10.0, 12.0, 0.1 }, { -10.0, 6.0, 0.1 }, { 0, -1, 0 }, { 0, -1, 0 }, 2.0 }, -- 20 - 21: Segment 10 (Edge 4)descend
    {{ -10.0, 6.0, 0.1 }, { -7.0, 0.0, 0.1 }, { 0, -1, 0 }, { 0, -1, 0 }, 2.0 }, -- 22 - 23:Segment 11 (Edge 5)descend


    Encore une remarque


    Ici, j'ai construit le chemin de manière logique, c'est-à-dire segment après segment. mais rien ne vous empêche de ne pas suivre cette logique.
    Du moment qu'au final le chemin n'est pas cassé, rien ne vous empêche de coder vos segments dans un autre ordre.
    Rappelez-vous simplement la règle d'écriture des segments concernant le côté où regardent les piétons à l'arrêt (voir plus haut).
    J'ai défini la largeur du chemin à 2.0, ce qui correspond à une largeur de 2 mètres qui est une largeur normale d'un trottoir.


    Sens de progression des piétons


    Comme je l'ai souligné avant, les piétons peuvent emprunter ce chemin dans les deux sens. Mais pour que cela fonctionne correctement, il faut utiliser un stratagème.
    Ce stratagème consiste à rajouter un segment nul à chaque extrémité du chemin des piétons.
    Comme il n'est pas permis d'avoir un segment constitué de deux nœuds identiques, nous jouons sur les coordonnées Z, en plaçant l'une à 0 et l'autre à 0.3 et nous mettons à 1 la valeur Z des axes d'alignement.
    Ce sont les valeurs minimales que j'ai trouvées et qui fonctionnement parfaitement. (Si quelqu'un a une explication plus rationnelle, je serai heureux de la connaître).
    En faisant cela, les piétons vont se diriger depuis le trottoir vers un arrêt (et vice-versa), en utilisant le chemin le plus court.


    Nous rajoutons donc deux segments:


    {{ 7.0, 0.0, 0.0 }, { 7.0, 0.0, 0.3 }, { 0, 0, 1 }, { 0, 0, 1 }, 2.0 }, -- 24 - 25: Segment 12 (Edge 12) ajouté pour que les piétons entrent et sortent par ce nœud
    {{ -7.0, 0.0, 0.3 }, { -7.0, 0.0, 0.0 }, { 0, 0, 1 }, { 0, 0, 1 }, 2.0 }, -- 26 - 27: Segment 13 (Edge 13) ajouté pour que les piétons entrent et sortent par ce nœud


    Concernant les axes d'alignement


    Je vous ai dit qu'ils étaient normalisés dans mon tuto.
    Pour ceux qui l'auraient constatés, les segments ne sont rien d'autre que des vecteurs.
    Si l'on veut obtenir les axes d'alignement, il suffit de soustraire les coordonnées de début de segment à celles de fin de segment, donc Nœud n+1 - Nœud n.
    Par exemple pour le segment 9, l'axe d'alignement du nœud 19 sera:
    (-10.0,12.0,0.1)-(-10.0,18.0,0.1) = (-10.0+10.0,12.0-18.0,0.1-0.1)= (0.0,-6.0,0.0)
    Que vous utilisiez le vecteur normalisé (0,-1,0) ou non normalisé (0,-6,0) cela ne changera rien au résultat final dans le jeu.
    Mais comment passer de (0,-6,0) à (0,-1,0)?
    Un nombre impair ou nul non normalisé correspond à 0 normalisé
    Un nombre pair non normalisé correspond à 1 normalisé
    On conserve le signe positif ou négatif.
    Dans l’exemple ci-dessus, x=0 reste 0, y= -6 devient -1 et z=0 reste 0
    Nous avons donc bien (0,-1,0).


    Remarquez bien aussi que l'axe d'alignement d'un nœud de fin d'un segment, reste identique lorsque ce nœud devient le nœud de début du segment suivant.
    C'est logique puisqu'un nœud reste un nœud qu'il soit le début ou la fin d'un segment.
    Ce n'est que dans la liste des segments que la position d'un nœud est n ou n+1. N'oubliez pas qu'il s'agit d'une convention de quasiment tous les langages de programmation, dont Lua:
    une liste commence toujours par l'élément 0, puis l'élément 1, puis l'élément 2, etc...
    Ainsi, l'élément 20 d'une liste sera en 21ième position dans la liste.


    Cette petite digression pour vous faire comprendre la suite :


    Le trajet des bus


    la liste des nœuds des segments du parcours du bus est, dans mon exemple, codée à la suite de celui des piétons.
    Donc le premier point d'arrivée (B0) du bus dans la liste des nœuds suivra le dernier nœud du chemin des piétons.
    Ici, ce sera le nœud 17 ( et pas 0 comme vous auriez pu le penser). C'est important à retenir pour le codage des points d'arrêt.


    Pour le codage, le principe est pareil à celui des piétons. Tout ce qu'il faut se souvenir c'est qu'un bus occupe une certaine largeur et qu'il est donc judicieux de décaler son itinéraire par rapport à celui des piétons.
    Nous allons dessiner un itinéraire de bus à gauche de celui des piétons (en bleu sur la figure 1).
    Comme les véhicules se déplacent du côté droit de la route, le chemin sera tracé dans le sens indiqué sur la figure 1.
    Les bus montent par la droite en B0, puis font une courbe en haut pour redescendre et rejoindre la route en bas en B10.


    Les mêmes règles s'appliquent aux axes d'alignement.
    La largeur du chemin est fixée, dans notre exemple, à 3 mètres, ce qui est la largeur normale d'une voie de circulation dans le jeu.


    Ce qui nous donne pour le codage:



    Nous allons maintenant définir nos arrêts de bus et les zones où les piétons attendent les bus pour chaque arrêt.


    Nous avons défini 3 arrêts de bus.
    L'arrêt 1, tout en haut, en P6 sur la figure 1 est situé au nœud 12 pour les piétons et j'ai défini la zone d'attente du bus entre les points P5 et P7, c'est-à-dire les segments (Edges) 5 et 6.
    Pour les bus, l'arrêt est au nœud 38.
    On aurait tout aussi bien pu utiliser le nœud 37 puisqu'il possède les mêmes coordonnées que le nœud 38.
    Personnellement j'utilise toujours comme point d'arrêt le premier nœud d'un segment (ici nœud 38 du segment 19), mais ce n'est pas une obligation.
    Tout ce que à quoi je veille c'est que, au point d'arrêt, le bus soit bien parallèle au chemin des piétons. Pour cela il faut que les axes d'alignement de l'avant et l'arrière du bus soient identiques.
    C'est donc juste une question d'esthétique.


    L'arrêt 2 est à gauche : Nœud 42 pour les bus, Nœud 20 pour les piétons et segments 9 et 10 pour la zone d'attente des piétons
    L'arrêt 3 est à droite: Nœud 32 pour les bus, Nœud 4 pour les piétons et segments 1 et 2 pour la zone d'attente des piétons


    Piétons arrêts 2 et 3 (lignes rouges).................................arrêt 1 (ligne rouge en haut)


    Bus à l'arrêt 1


    Bus à l'arrêt 2


    Bus à l'arrêt 3


    L'ajoute des terminaux se fait à la suite du codage des nœuds en créant une liste de terminaux ("terminals").



    vehicleNode est le numéro du nœud où s'arrête de bus.
    personNodes est une liste de nœuds où les piétons entrent et sortent du bus à ce terminal. Si vous utilisez plusieurs nœuds, ceux-ci doivent être séparé par une virgule.
    personEdges est une liste de segments où les piétons attendent le bus à cet arrêt.


    Il est bien entendu que les listes des nœuds et segments des piétons doivent être dans la liste des piétons (transportNodes = {"PERSON"} et les nœuds des bus dans transportNodes = {"BUS"}, sinon les piétons se feraient écraser par les bus !!!


    Pour terminer, voici le code complet du fichier .mdl de cette station:



    Dernières précisions:
    Dans "transportModes", si vous rajoutez "CAR","TRUCK","TRAM","ELECTRIC-TRAM", ces véhicules pourront aussi utiliser le chemin des bus.
    Les voitures ("CAR") ne s'arrêtront pas aux arrêts de bus mais elles suivront le même chemin que les bus.


    Ici j'ai ajouté "CAR" à transportModes:



    Vous utiliserez transportModes = {"TRUCK"} pour les camions dans un dépôt de marchandises.


    Je vous expliquerai, dans un prochain tuto, comment faire pour transformer un simple bâtiment ou tout autre objet de décoration (Asset) en centre commercial ou industriel ou encore en immeuble d'habitation afin d'attirer des personnes à ces endroits.
    En les combinant avec des arrêts de bus, vous pouvez ainsi gagner beaucoup d'argent!
    Vous comprendrez alors toute l'importance des "transportModes".


    J'espère que ce tuto vous aura plu et j'attends vos commentaires à ce sujet.
    Merci de votre lecture et à bientôt!

    Michel Lacoste
    Belgium

    10 Mal editiert, zuletzt von mich.lacoste () aus folgendem Grund: Corrections fautes d'orthographe.

BlueBrixx