Generation de terrain

Generation de terrain - Algo - Programmation

Marsh Posté le 30-01-2003 à 20:45:50    

Voila, je voudrais générer des montagnes toutes simples aléatoirement alors de souvenir j'ai codé ca :
 

Code :
  1. private void generateSubGround(int x1, int y1, int x2, int y2)
  2. {
  3.  int xtmp = (x1+x2)/2;
  4.  int ytmp = (y1+y2)/2;
  5.  if((xtmp!=x1)||(ytmp!=y1))
  6.  {
  7.   points[xtmp][y1]=((points[x1][y1]+points[x2][y1])/2)+hazard();
  8.   points[x1][ytmp]=((points[x1][y1]+points[x1][y2])/2)+hazard();
  9.   points[x2][ytmp]=((points[x2][y1]+points[x2][y2])/2)+hazard();
  10.   points[xtmp][y2]=((points[x1][y2]+points[x2][y2])/2)+hazard();
  11.   points[xtmp][ytmp] = ((points[x1][y1]+points[x2][y1]
  12.         +points[x2][y1]+points[x2][y2])/4)+hazard();
  13.   generateSubGround(x1,y1,xtmp,ytmp);
  14.   generateSubGround(xtmp,y1,x2,ytmp);
  15.   generateSubGround(x1,ytmp,xtmp,y2);
  16.   generateSubGround(xtmp,ytmp,x2,y2);
  17.  }
  18. }


 
Seulement les resulat que j'obtiens on pas l'air terrible.
J'ai pas affiche sous la forme d'un graphe mais seulement les valeur.
Est-ce que je me suis planté quelques part dans l'algo, il me semblait que les resultats etaient bien meilleurs

Reply

Marsh Posté le 30-01-2003 à 20:45:50   

Reply

Marsh Posté le 31-01-2003 à 00:02:09    

tu devrais réduire l'amplitude possible du résultat de ta fonction hazard() en fionction de la longueur du coté de ton carré.
En gros, les variations doivent etre plus faibles lorsqu'elles concernent des vertex qui sont proches l'un de l'autre.
 
En générale, on divise l'intervale par 2 en chaque appel récursif.

Reply

Marsh Posté le 31-01-2003 à 00:42:23    

Je pense effectivement que ca permettrais de lisser la courbe tout en gardant le cote accidente donc je pense que je vais le faire.
Par contre je me rappel bien que dans l'algo d'origine on ne le faisait pas.
J'ai cherché sur le net et j'ai trouvé cette algo ainsi que d'autre (en diamant  :??: ) du meme genre mais a chaque fois c'est super mal expliqué.
Sinon j'ai deja trouvé une petite erreur dans ma somme des quatre cotes je somme deux fois le meme.

Reply

Marsh Posté le 31-01-2003 à 01:48:39    

la qualite de ton terrain dependra surtout de ta fonction "hasard()".
En general un terrain c'est autre chose que du bruit.
 
il existe d'autres methodes tres bien expliquees sur le web:
Perlin noise (c'est du bruit mais un peu organise),
fractales (faults par exemple),
deposition de particules,
diagrammes de voronoi etc..
 
Si tu as besoin d'explication plus precises n'hesite pas.
 
Legreg


---------------
voxel terrain render engine | animation mentor
Reply

Marsh Posté le 31-01-2003 à 12:59:12    

legreg a écrit :

Perlin noise (c'est du bruit mais un peu organise)

http://www.noisemachine.com
 
pour un tutorial & du code.

Reply

Marsh Posté le 31-01-2003 à 15:03:51    

Y'a un superbe exemple de prog (genere montage + neigne + un lac) livré comme exemple avec la lib wxWindows ("fractal" je crois)


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 31-01-2003 à 15:09:22    

HelloWorld a écrit :

Y'a un superbe exemple de prog (genere montage + neigne + un lac) livré comme exemple avec la lib wxWindows ("fractal" je crois)


Sinon, j'avais fait un prog en C de montagne fractale quand j'étais étudiant que tu peux trouver ici : http://tomlameche.free.fr/V2/image [...] ntagne.htm
C'est pas hyper bien propre niveau programmation ( j'étais étudiant en math, pas en info ) mais l'algo est correct.


---------------
Gérez votre collection de BD en ligne ! ---- Electro-jazzy song ---- Dazie Mae - jazzy/bluesy/cabaret et plus si affinité
Reply

Marsh Posté le 31-01-2003 à 15:56:14    

Reply

Marsh Posté le 31-01-2003 à 19:28:24    

Oui alors j'ai regarde tout ca ets pour la plupart des truc c'est trop compliqué parcequ'en fait mon but n'est pas de faire une images de montagnes mais plutot des maps aleatoires pour tester un pathfinding 2D.
Pitounet : ta derniere URL je l'avais vue est ca me parait bien mais j'arrive pas a comprendre la methode du diamant.
C'est quoi qu'il appelle un diamant ?

Reply

Marsh Posté le 31-01-2003 à 21:39:00    

les anglophones appellent
"diamonds" les carres qui sont tournes  
d'un angle de 45 degres
 
Comme tu rajoutes des points au milieu d'une grille de carres
quand tu selectionnes ces points 4 par 4 ca constitue
ce qu'ils appellent un diamond.
(on pourrait traduire ca par losange meme si ca m'embete
cet abus de qualifier de losange ce qui n'est qu'un carre qui a la tete penchee)
 
LeGreg


---------------
voxel terrain render engine | animation mentor
Reply

Marsh Posté le 31-01-2003 à 21:39:00   

Reply

Marsh Posté le 31-01-2003 à 21:57:57    

D'accord j'ai compris, il faut joindre les cote du carre un peu a la pacman  
Par contre je vois pas comment le faire de maniere recursive
Parce qu'il faut utiliser des points exterieurs:
Le diamant n'est pas contenu dans le carre de l'etape d'avant
C'est possible ?

Reply

Marsh Posté le 31-01-2003 à 22:03:10    

Clie a écrit :

Oui alors j'ai regarde tout ca ets pour la plupart des truc c'est trop compliqué parcequ'en fait mon but n'est pas de faire une images de montagnes mais plutot des maps aleatoires pour tester un pathfinding 2D.
Pitounet : ta derniere URL je l'avais vue est ca me parait bien mais j'arrive pas a comprendre la methode du diamant.
C'est quoi qu'il appelle un diamant ?


 
le perlin noise est vraiment tout con a faire, pour peu que tu dispose d'une fonction de resize d'image 2d.
 
La déposition de particule est pas ce que l'on a fait de plus dur non plus.  
 
 
 

Reply

Marsh Posté le 31-01-2003 à 22:19:08    

C'est vrai que le perlin noise a l'air pas mal mais le seul algo que j'ai trouve avait l'air complique.
En plus y a un truc que j'ai pas compris, on par forcement en 3D ?

Reply

Marsh Posté le 31-01-2003 à 22:31:30    

Clie a écrit :

C'est vrai que le perlin noise a l'air pas mal mais le seul algo que j'ai trouve avait l'air complique.
En plus y a un truc que j'ai pas compris, on par forcement en 3D ?


 
pour le perlin ? nope.
 
Bon, en version simple & culcul, vala comment faire :
 
prendre une bitmap B de taille N*N, ts les pixels etant egal a 0
prendre une valeur H (128 par ex)
 
tant que pas content
pour tous les pixels de N
N[i] += rand%H
H = H / 2;
N = N*2;
B = resize(B,N*2)
fpour
ftant que


Message édité par chrisbk le 31-01-2003 à 22:31:41
Reply

Marsh Posté le 31-01-2003 à 22:33:45    

Euh Tenez pas compte de mon dernier poste, j'ai trouve un site clair http://freespace.virgin.net/hugo.e [...] perlin.htm
sur perlin noise est j'ai mieux compris.
 
Alors j'hesite un peu sur l'utilisation que je pourrais en faire avec mon algo.
Parceque je peut pas l'utiliser seul, c'est deterministe
Est-ce que je l'utilise genre fonction de l'altitude moyenne des quatres points donc avec un noise sur une dimension ou est-ce que je l'utilise a l'aide des coordonnees des points  donc 2D.
Dans tous les cas ca reste deterministe

Reply

Marsh Posté le 31-01-2003 à 22:35:56    

Euh y a deux chose qui me choque dans ton algo :
Ca fait quoi resize ?
Comment tu estime pas content ?

Reply

Marsh Posté le 31-01-2003 à 22:38:50    

En relisant un peu je vois le pas content par contre le resize  :??:

Reply

Marsh Posté le 31-01-2003 à 22:43:25    

le pas content c toi qui voit, ca depend de la res finale de ta bitmap
 
le resize c juste une fonction resize de bitmap,genre le resize de ton toshop

Reply

Marsh Posté le 31-01-2003 à 22:49:08    

Eh oui mais c'est pour quelque chose d'automatique alors le pas content je vois je prend une valeur qui me plait et je la mets en dure.
Par contre le resize de toShop y fait quoi en simplifie je suis pas graphiste du tout (enfin si des fois mais au point a point)

Reply

Marsh Posté le 01-02-2003 à 10:43:35    

Clie a écrit :

Eh oui mais c'est pour quelque chose d'automatique alors le pas content je vois je prend une valeur qui me plait et je la mets en dure.
Par contre le resize de toShop y fait quoi en simplifie je suis pas graphiste du tout (enfin si des fois mais au point a point)


ben y t'etire ta bitmap, quoi d'autre ?
 
par exemple dans l'algo tu as une bitmap de 128x128, pour passer a l'etat suivant il te faut la resizer en 256x256. Y'a tout un tas de technique pour faire ca, qui te fournireront du plus ou moins moche en fonction de l'algo choisi (je te laisse deviner la contrepartie du beau...)
 
pourle perlin, je viens de me rapeller :
 
http://freespace.virgin.net/hugo.elias
 
pour le pas content, moi je donne juste la taille finale de la bitmap que je veux (par ex, 256x256)


Message édité par chrisbk le 01-02-2003 à 10:45:18
Reply

Marsh Posté le 01-02-2003 à 11:07:29    

Ok je vois, en fait etire ta map c'est un peu divise la frequence par 2

Reply

Marsh Posté le 01-02-2003 à 11:10:07    

Clie a écrit :

Ok je vois, en fait etire ta map c'est un peu divise la frequence par 2


 
heuh quand tu la double, tu augmente la frequence du bruit a venir (il aura 512 points au lieu de 256 par ex), mais pour ce qui etait la avant, vi, ca l'etale  
 
Le plus dur, la dedans c la fonction de resize, sinon c vraiment tres simple. Pas dit par contre que ca te genera un super paysage (j'esperes que tu reves pas de falaise par ex :D) mais bon

Reply

Marsh Posté le 01-02-2003 à 12:49:49    

Pour le paysage t'inquietes pas c'est pas pour faire des photo de vacances.
Merci a tous pour vos reponse je crois que j'ai de quoi bossé maintenant. (Foula du travail)

Reply

Marsh Posté le 01-02-2003 à 22:30:50    

[:sicko]
 
(J'ai besoin des height map moi :) )


---------------
Horizon pas Net, reste à la buvette!!
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed