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

OpenGL Discussion :

Lissage terrain fractale


Sujet :

OpenGL

  1. #1
    Membre éclairé Avatar de nicolas66
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    326
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 326
    Par défaut Lissage terrain fractale
    Bonsoir tlm,

    Je suis en train de créer un programme qui génère un terrain par la technique des fractales. Le rendu brut m'a forcé à réaliser un lissage du terrain. En fait je prend chaque point de mon maillage, je fais une moyenne des points autour du point en cours et je réactualise la hauteur de ce point. J'effectue le tout N fois. Voilà ce que j'obtiens :



    Pour que ca rende bien je dois faire au moins 3 fois l'algo de lissage décrit avant.

    Mais je me suis demandé s'il existait d'autres techniques plus performantes pour lisser des terrains ? Merci d'avance pour votre aide


    Nico.

  2. #2
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Par défaut
    pour avoir un effet de lissage facilement, tu peut jouer sur l'eclairage.

    d'apres ce que je semble voir sur le screen shot tu utilise de l'eclairage pas face non ?

    pour le lissage, il faut bien calculer la normale de chaque vertex.

    en gros le but consiste a crée une normale par vertex qui ne soit par réelement perpendiculaire au plan, mais perpendiculaire a ce que devrait etre le plan si il etait effectivement lissé.

    pour ca c'est tres simple, pour chaque face, tu calcule la normal. une fois que tu a calculé la normale de chaque face, pour chaque vertex, tu prend le normale de toute les faces qui contiennent ce vertex, et tu additionne leurs normales (dans tu exemple, la plus part des vertex on 4 faces associée, ca donne donc vertex.normal = f1.normal + f2.normal + f3.normal + f4.normal)
    une fois que tu a ce vecteur, tu le normalise et voila tu a ton vecteur normal par vertex...
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

  3. #3
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour

    je me suis demandé s'il existait d'autres techniques plus performantes pour lisser des terrains ?
    Alors il y a plein de facon de lisser, de réaliser des moyennes en fait.

    Si j'ai bien compris (ou plutot deviné) pour ton calcul, tu prend 4 ou 8 points autour du point à lisser... tu peux essayer d'en prendre plus en les pondérant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    A[i] = (1/5)*(A[i-2] + A[i-1] + A[i] + A[i+1] + A[i+2]); //sans pondération
     
    A[i] = (1/8)*(A[i-2] + 2*A[i-1] + 2*A[i] + 2*A[i+1] + A[i+2]); //avec pondération
    //Exemple donné dans une seule dimension, sinon ca prend trop de place à écrire
    Tu peux aussi -si toutes tes valeurs sont assez grande par rapport à zéro- réaliser une moyenne géométrique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    A[i] = (1/3)*(A[i-1] + A[i] + A[i+1]); //arithmétique
     
    A[i] = racinecubique(A[i-1] * A[i] * A[i+1]);//géométrique
    Apres quoi, on peut mixer les deux, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    A[i] = racinecarre(A[i-1]*A[i-1] + A[i]*A[i] + A[i+1]*A[i+1])
    Mon conseil : implémenter plusieurs faconde faire et voir la plus rapide / jolie /pratique...

    Bon courage

  4. #4
    Membre éclairé Avatar de nicolas66
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    326
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 326
    Par défaut
    @mabu : Oui j'avais justement pensé à faire un autre type de moyenne. En fait elle n'est pas intéressante car il faut un nombre positif sous la racine. Et en essayant cette moyenne, jme suis naturellement retrouvé avec un terrain de niveau supérieur à 0. Sinon je vais essayer la moyenne quadratique et la moyenne avec coeffs de pondération. Merci pour tes précieux conseils .

    @ bafman : pour les normales je vais voir ca. Mais je préfère avoir un vrai terrain lissé qu'un terrain éclairé d'une manière détournée. Merci pr ta solution .

    Nico.

Discussions similaires

  1. generation de terrain par fractales
    Par cliquet dans le forum Développement 2D, 3D et Jeux
    Réponses: 7
    Dernier message: 17/01/2008, 07h24
  2. [FLASH MX 2004]lissage au secour
    Par livingdead dans le forum Flash
    Réponses: 8
    Dernier message: 28/06/2004, 16h41
  3. Lissage de contours
    Par GoldenEye dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 12/02/2004, 12h40
  4. Lissage des police
    Par Rifton dans le forum Flash
    Réponses: 27
    Dernier message: 02/10/2003, 17h43
  5. Gestion des collisions - terrains
    Par Dranor dans le forum DirectX
    Réponses: 1
    Dernier message: 26/06/2003, 18h50

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