IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Algorithmes et structures de données Discussion :

Génération procédurale de cours d'eau / rivières


Sujet :

Algorithmes et structures de données

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Février 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Février 2015
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Génération procédurale de cours d'eau / rivières
    Bonjour,

    je recherche une méthode (algorithme, méthodologie, ...) pour arriver à générer des cours d'eau sur un relief.

    J'ai codé une bibliothèque qui génère un bruit fractal pour le terrain : j'ai donc une topologie accidentée (montagnes vallées etc...) et la dessus je voulais rajouter des rivières.

    Cette fonction de génération de terrain prend en paramètre les coords X et Y et ressort Z (sans s'occuper de ce qu'il y a sur X-1/X+1/Y-1.... c'est tout l'interet de ces generateurs de bruit coherent.

    Je cherche donc un moyen similaire pour obtenir un tracé (cours d'eau) mais sans devoir interpoler/itérer sur un terrain existant : je voudrai juste avoir une fonction simple et à temps constant qui serait du type isRiver(x,y,z) en utilisant si possible du bruit de perlin (vu que j'ai deja la lib de prete) ou bien une autre méthode de calcul mais sans interpolation quelconque.

    Le probleme avec les rivières c'est que par définition, on part d'un point et on "descend" la topologie. Mais peut etre que mon cours d'eau que je dois afficher depend d'une source située très loin et que je n'ai pas affichée/traitée. Ca m'embete d'itérer comme ca sur une grande distance pour afficher une petite portion de carte.

    Merci par avance pour votre aide la dessus.

    Romuald.

  2. #2
    Rédacteur/Modérateur

    Avatar de yahiko
    Homme Profil pro
    Développeur
    Inscrit en
    Juillet 2013
    Messages
    1 423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 1 423
    Points : 8 699
    Points
    8 699
    Billets dans le blog
    43
    Par défaut
    L'algo le plus simple c'est de partir de tes sommets (hauteur max), puis de tracer ton cours d'eau de proche en proche en empruntant la pente locale minimale (de signe négatif évidemment)

    EDIT : Désolé, je n'avais pas lu ton message entièrement.
    Pour forcer ta rivière à se jeter dans la mer, une technique consiste appliquer l'algorithme A* sur ta topologie.
    Tutoriels et FAQ TypeScript

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Février 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Février 2015
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Ouais mais du coup en faisant ca, je suis obligé de connaitre le point de source et d'itérer le tracé jusqu'à la zone que je veux afficher :je m'explique :

    J'ai une carte generee par du bruit de perlin : par définition cette carte peut etre infinie : disons qu'elle a la taille d'un carré de 1 million de point de coté. Si je veux afficher juste une zone de la carte (un carré de 100 sur 100 quelque part) et bien avec l'algo de bruit, c'est rapide je genere chaque hauteur avec ma fonction de bruit Z = bruit(X,Y).
    Mais pour savoir si il y a de l'eau en X/Y, il va falloir que je cherche les sources alentours et que je genere le terrain jusqu'à la zone à afficher. Et peut etre que le seul cours d'eau qui passe dans ma zone possède une source qui se situe à 10000 pixels de là : ce n'est pas envisageable de générer tout ca : moi je genere ma carte à la volée

    En fait je cherche à savoir si il existe des méthodes mathématiques (ou autres) qui mle permettraient de generer des cours d'eau sans avoir à generer toute la map et itérer le tracé de l'eau.

    Merci qd meme pour ton intervention.

  4. #4
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 211
    Points : 8 316
    Points
    8 316
    Billets dans le blog
    52
    Par défaut
    Ta problématique est que si tu génère qu'une partie de ta carte, tu ne sais pas si la génération "juste à côté" déclenché la création d'une rivière dans la zone que tu traite actuellement.

    Il n'y a pas 300 solutions à ce problème :

    Soit tu gère ces parties à l'avance. Sachant que tu peux limité la génération à une cuvette. Car si tu as un pique de hauteur ton cour d'eau ne le passera pas. (Sauf si tu gère l'accumulation d'eau)

    Soit tu interdit la génération de rivière dans les nouvelles zones générées si celle-ci débouche sur la modification d'une partie existante de ta carte. (Cela se traduit par des zones interdite de spawn, utilisant la une propagation de l'interdiction par rapport au bord existant) Cela implique que les rivières relativement longues seront forcément créé vers des zones qui n'existe pas encore. (Il faudra aussi prendre en compte la prolongation des rivières en fonction des bords).
    Si tu as un génération carte qui ne crée que très peu de cuvette, tu risque de te trouve avec beaucoup de zone interdit.

    Pour des raisons de performance, une fois ton cour d'eau généré, tu devrait attaché la propriété "cour d'eau" à chaque case. Cela évitera beaucoup de calcul lors de l'affichage.
    D'ailleurs, c'est ce que fait Minecraft pour la gestion de l'eau.


    Cordialement,
    Patrick Kolodziejczyk.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Février 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Février 2015
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Et si on applique un bruit de perlin, on peut récupérer les vecteurs des gradients de chaque point : vu que ce sont les dérivées du bruit (donc la "pente" du terrain en fait), ne pourrait-on pas utiliser ces informations pour le parcours de l'eau qui coule sur le terrain !?

  6. #6
    Rédacteur/Modérateur

    Avatar de yahiko
    Homme Profil pro
    Développeur
    Inscrit en
    Juillet 2013
    Messages
    1 423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 1 423
    Points : 8 699
    Points
    8 699
    Billets dans le blog
    43
    Par défaut
    Si tu t'en tiens à une seule itération du bruit de Perlin, ça reste une éventualité (à tester cependant).

    Si tu appliques plusieurs octaves pour générer ton terrain, ça risque par contre d'être difficile.
    Tutoriels et FAQ TypeScript

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Février 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Février 2015
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Meme avec plusieurs octaves, il faudra sommer autant de pentes qu'il y a d'octaves pour en faire la resultante non ? Je me trompe ?
    Du coup je vais réfléchir sur cette solution voir si j'arrive à obtenir un résultat satisfaisant.

Discussions similaires

  1. Game Connection 2013 - Europe : La génération procédurale
    Par LittleWhite dans le forum Développement 2D, 3D et Jeux
    Réponses: 0
    Dernier message: 23/01/2014, 21h17
  2. [relation][formulaire] les 2 Berges d'un cours d'eau
    Par carpouille dans le forum Modélisation
    Réponses: 3
    Dernier message: 09/12/2005, 21h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo