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

Développement 2D, 3D et Jeux Discussion :

Générer des cartes aléatoires


Sujet :

Développement 2D, 3D et Jeux

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 8
    Points : 5
    Points
    5
    Par défaut Générer des cartes aléatoires
    Bonjour,

    je suis en train de commencer un projet de jeu du type "civilization".
    je recherche une méthode ou des conseils pour la génération aléatoire de terrains sachant qu'il faut que ces maps soient cohérentes sur le plan géographique (faire des continents suffisemment imprtants par exemple).

    merci de votre aide ;-)

    Vincent

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Bon, c'est peut-être un marteau et une enclume pour tuer une mouche, mais les champs de Markov m'ont l'air assez adaptés, non ?
    Il s'agit de champs qui définissent la probabilité d'appartenance à une classe selon les voisins, donc si tu as une classe continent et une classe mer, tu as juste des probabilité de transition d'une classe à l'autre à définir.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Merci pour l'info! je vais étudier tout cela, mon père est assez ccalé en math il va m'aider!

  4. #4
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par syrio123
    Bonjour,

    je suis en train de commencer un projet de jeu du type "civilization".
    je recherche une méthode ou des conseils pour la génération aléatoire de terrains sachant qu'il faut que ces maps soient cohérentes sur le plan géographique (faire des continents suffisemment imprtants par exemple).

    merci de votre aide ;-)

    Vincent
    J'ai déjà fait ce genre de progamme, j'avais utilisé une idée d'un générateur de terrain pour le faire.

    En fait je génére des paraboles (en 3D et en fait utilisant des exponentielles), pour avoir un terrain remplit de grosses montagnes. Pour calculer l'hauteur du terrain en un point, je faisais une somme des hauteurs des différentes exponentielles comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    double Terrain_SimpleCalcHeight(STerrainImpl* t,double x, double y)         //calcule la hauteur d'un pt (x,y)
    {
    int i=0;
    double res = 0.0,tmp;
    for(i=0;i<t->nb_centre;i++)
            {
            tmp = t->hauteur[i]*exp( -(t->centre[i][0]-x)*(t->centre[i][0]-x)/t->etal[i][0]-
                            (t->centre[i][1]-y)*(t->centre[i][1]-y)/ t->etal[i][1]);
            res += tmp;
            }
    return res;
    }
    Donc j'avais défini une structure qui contenait le nombre d'exponentielles, leur centre et leur étalement (est-ce que serait un pic ou une colline).

    Ensuite comment revenir à un monde 2D?

    On utilise un seuil pour dire si la case associée va se retrouver sous l'eau ou non.

    L'avantage de cette méthode : rapide, facile à mettre en place et je trouvais que cela donnait des bons résultats.

    [EDIT] D'ailleurs, c'était aussi pour un remake de Civilisation[/EDIT]
    Si tu veux plus d'explications, n'hésite pas,
    Jc

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Merci beaucoup, je teste ca ce soir après le travail.
    a premiere vue j'ai compris le principe, je n'ai qu'a l'adapter a mes besoin, et définir aussi deux seuils entre Mer/Terre et Terre/MOntagne

    a+

  6. #6
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par syrio123
    Merci beaucoup, je teste ca ce soir après le travail.
    a premiere vue j'ai compris le principe, je n'ai qu'a l'adapter a mes besoin, et définir aussi deux seuils entre Mer/Terre et Terre/MOntagne

    a+
    Tout à fait, j'en avais fait trois à mon souvenir :

    Mer/Terre
    Terre/Colline
    Colline/Montagne

    Ensuite dépendant de la hauteur de la tuile, j'avais mis une version enneigée ou désertique...

    Jc

  7. #7
    Membre éprouvé
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Points : 1 249
    Points
    1 249
    Par défaut
    J'avais vu un truc là-dessus dans un mag ou sur un site. Me rappelle plus des détails, mais dans l'idée on générait un terrain totalement aléatoire puis ensuite on uniformisait en moyennant sur des carrés plus ou moins grands pour avoir des zones cohérantes.

    Faudrait voir comment fait freeciv...

    Sinon, idée débile : tirer des failles aléatoires (pour avoir des sortes de plaques continentales), abaisser ou surélever le terrain en partant des failles, et embrancher sur les seuils de fearyourself. Ca pourrait faire des massifs plus tortueux, moins ronds... Quoi, le maillet et la mouche ?

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    je viens d'essayer pdt la pause déjeuner, ca fonctionne très bien. je n'ai plus
    qu'a lier ca a un nombre aléatoire de montagne avec pour chacune coordonnées et hauteur aléatoires. c'est vraiment chouette!

    petite question supplémentaire : pour l'instant mes maps sont des tableaux
    de structures que j'ai définies avec entre autres les coordonnées et l'altitude.
    est ce que tu a utilisé la même méthode ?
    ca me semble problematique pour les grandes maps non ? la mémoire sera tès sollicitée non ?

    les idées de "Sivrit" sont assez intérressantes aussi, je vais expérimenter!
    je vous tiens au courant...

    merci a+

  9. #9
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par Sivrît
    J'avais vu un truc là-dessus dans un mag ou sur un site. Me rappelle plus des détails, mais dans l'idée on générait un terrain totalement aléatoire puis ensuite on uniformisait en moyennant sur des carrés plus ou moins grands pour avoir des zones cohérantes.

    Faudrait voir comment fait freeciv...
    C'est possible, faut voir les résultats et les paramétres...

    Sinon, idée débile : tirer des failles aléatoires (pour avoir des sortes de plaques continentales), abaisser ou surélever le terrain en partant des failles, et embrancher sur les seuils de fearyourself.
    Pas débile du tout, c'est un algo qui s'appelle le Fault Algorithm :
    http://www.lighthouse3d.com/opengl/t...dex.php3?fault
    Avec une normalisation du terrain, on obtient des très bons résultats.

    Ca pourrait faire des massifs plus tortueux, moins ronds... Quoi, le maillet et la mouche ?
    La fonction peut prendre une distance différente que l'euclidienne, la norme infinie permet d'avoir un résultat plus carré

    Jc

  10. #10
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par syrio123
    je viens d'essayer pdt la pause déjeuner, ca fonctionne très bien. je n'ai plus qu'a lier ca a un nombre aléatoire de montagne avec pour chacune coordonnées et hauteur aléatoires. c'est vraiment chouette!
    C'est cool

    petite question supplémentaire : pour l'instant mes maps sont des tableaux
    de structures que j'ai définies avec entre autres les coordonnées et l'altitude.
    est ce que tu a utilisé la même méthode ?
    Oui
    ca me semble problematique pour les grandes maps non ? la mémoire sera tès sollicitée non ?
    Pour une structure de 128 octets (donc déjà pas mal d'infos), avec une carte de 256*256, on tient sur 8 MO ce qui est correct. Mais généralement je faisais une carte 50*50 donc cela utilisait pas trop de mémoire.

    les idées de "Sivrit" sont assez intérressantes aussi, je vais expérimenter!
    je vous tiens au courant...
    Tout à fait, faut tenter,
    Jc

  11. #11
    Membre éprouvé
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Points : 1 249
    Points
    1 249
    Par défaut
    Sinon, à partir du moment où on calcule une altitude sur toute la carte, pourquoi ne pas superposer un bruit blanc (une variation purement aléatoire sur le monde entier) pour limiter la régularité ? Il suffit de lui donner une amplitude suffisament faible pour ne pas réécrire le relief, mais suffisante pour rendre les limitations entre les différentes zones moins nettes.

    D'aileurs, en jouant sur cette amplitude on pourrait ajuster la quantité de 'chaos' (ou entropie ou bazard suivant comment on veut l'appeler) de la carte.

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    J'ai intégré tout ca dans mon jeu. pour l'instant le code est pas très clair (j'ai pas eu le temps hier soir) mais ce soir je vais essayer de terminer tout cela et de vous en faire profiter sur le forum.
    (le code source est en C++)
    j'ai aussi fait la même chose en VB.net pour essayer!

    a+

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Bonjour a tous,

    après quelques petits perfectionnement, voici une copie d'écran exemple. bon ok, c'est pas très beau ;-)
    je vais essayer d'améliorer tout ca, et je posterais le code source dès qu'il sera mieux organisé et commenté...

    voici le lien vers l'image :
    http://www.syrio.rf.lv/ecran1.JPG

    Vincent

  14. #14
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par syrio123
    Bonjour a tous,

    après quelques petits perfectionnement, voici une copie d'écran exemple. bon ok, c'est pas très beau ;-)
    je vais essayer d'améliorer tout ca, et je posterais le code source dès qu'il sera mieux organisé et commenté...

    voici le lien vers l'image :
    http://www.syrio.rf.lv/ecran1.JPG

    Vincent
    C'est un déjà début, bon boulot ,
    Jc

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 12/09/2006, 16h42
  2. Générer des nombres aléatoires
    Par nbeligh dans le forum C++
    Réponses: 6
    Dernier message: 05/09/2006, 16h05
  3. Algo pour générer des nombres aléatoires
    Par Admin dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 12/06/2006, 09h06
  4. Générer des couleurs aléatoires
    Par sbeu dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 06/06/2006, 16h21
  5. Réponses: 2
    Dernier message: 16/05/2006, 17h02

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