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 :

Aberration géométrique dans OpenGL


Sujet :

OpenGL

  1. #1
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Juin 2007
    Messages : 15
    Par défaut Aberration géométrique dans OpenGL
    Bonjour,

    Je fais un petit programme de rendu du système solaire (appelé à évoluer, bien sûr )
    Mais j'ai un gros problème (gros parce que je ne sais pas d'où ça vient): mes sphères qui représentent mes planètes sont déformées (cf. screenshot). Cet effet n'apparaît que lorsque que l'on désaxe la visée du centre de la planète.

    Que faire?

    Merci d'avance
    Images attachées Images attachées  

  2. #2
    Membre très actif

    Profil pro
    Étudiant
    Inscrit en
    Décembre 2004
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2004
    Messages : 499
    Par défaut
    salut

    peux-tu faire un code minimal (juste initiation opengl + draw sphere = 100 lignes max) qui montre le bug ?

    plusieurs possibilités : viewport, matrices (projection et modelview), géométrie affichée, bug ? ...

  3. #3
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Juin 2007
    Messages : 15
    Par défaut
    Oui très juste:

    Voici la méthode afficher de ma classe planete:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    void  Planete::afficher(void) {
        float mat_emission[4] = {1.0f, 1.0f, 1.0f, 1.0f};
    	float mat_no_emission[4] = {0.0f, 0.0f, 0.0f, 1.0f};
     
    	if (Sname == "Soleil" ) {
    		glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission);
    	} else {
    		glMaterialfv(GL_FRONT, GL_EMISSION, mat_no_emission);
    	}
     
    	glPushMatrix();
    	glTranslated(pos.get_x(), pos.get_y(), pos.get_z());
    	double R = radius;
    	glColor3ub(255, 255, 255);
    	glRotated(angle, rot.get_x(), rot.get_y(), rot.get_z());
    	GLUquadric* params = gluNewQuadric();
    	gluQuadricTexture(params,GL_TRUE);
    	glBindTexture(GL_TEXTURE_2D,text_day_map);
    	gluSphere(params, R, 50, 50); 
    	gluDeleteQuadric(params);
    	glPopMatrix();
    }
    Initialisation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void InitGL(void) {
    	glewInit();
    	glMatrixMode( GL_PROJECTION );
    	glLoadIdentity();
    	double zNear = 70000;
    	double zFar = zNear*65536;
    	gluPerspective(70,(double)LARGEUR_ECRAN/HAUTEUR_ECRAN,zNear,zFar);
     
    	glEnable(GL_DEPTH_TEST);
    	glEnable(GL_TEXTURE_2D);
    	//glEnable(GL_LIGHTING);
    	//glEnable(GL_LIGHT0);
    }
    Le tout dans une fenetre SDL. Pour info: les nombres manipulés sont énormes (en mètres) (astronomiques, c'est le cas de le dire!!!), d'où l'initialisation de zNear à quelque chose qui peut sembler ne pas être "près".
    (D'ailleurs, j'aimerais le mettre à 1 à terme; mais bon. Il semble que ce ne soit pas possible vu les bugs que j'ai quand je fais ça. Mais bon. Mon post ne concerne pas ça)

    Merci d'avance

  4. #4
    Expert confirmé

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 819
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 819
    Par défaut
    Change le fovy de gluPerspective. Met 45 au lieu de 70, pour voir...

    Pourquoi 70 d'ailleurs? il y a une raison particulière?
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  5. #5
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Juin 2007
    Messages : 15
    Par défaut
    Dsl pour le double post, mais c'est pour éviter des posts inutiles par la suite.
    En effet, 45° de FOV donne des résultats meilleurs, mais je retourne la question à plegat: pourquoi 45? Qu'est-ce qu'il faut mettre pour une valeur réaliste (mon simulateur se veut réaliste, donc pas question de mettre des valeurs aberrantes!!! ) (Non pas que 45 soit une valeur aberrante, mais je voudrais juste savoir ce qui justifie que "ça marche bien")

  6. #6
    Expert confirmé

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 819
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 819
    Par défaut
    Citation Envoyé par ydethe Voir le message
    En effet, 45° de FOV donne des résultats meilleurs, mais je retourne la question à plegat: pourquoi 45?
    Bah parce que ça fonctionne mieux qu'avec 70?

    Citation Envoyé par Red Book
    With gluPerspective(), you need to pick appropriate values for the field of view, or the image may look distorted. For example, suppose you're drawing to the entire screen, which happens to be 11 inches high. If you choose a field of view of 90 degrees, your eye has to be about 7.8 inches from the screen for the image to appear undistorted. (This is the distance that makes the screen subtend 90 degrees.) If your eye is farther from the screen, as it usually is, the perspective doesn't look right. If your drawing area occupies less than the full screen, your eye has to be even closer. To get a perfect field of view, figure out how far your eye normally is from the screen and how big the window is, and calculate the angle the window subtends at that size and distance. It's probably smaller than you would guess. Another way to think about it is that a 94-degree field of view with a 35-millimeter camera requires a 20-millimeter lens, which is a very wide-angle lens. "Troubleshooting Transformations," gives more details on how to calculate the desired field of view.
    (Source)

    En gros, l'angle que tu fournis permet de définir l'angle de vision (dans le sens vertical). Pour illustrer, quand tu regardes ton écran, tu traces deux droites, une qui va de ton oeil au haut de ton écran, et une seconde qui part aussi de ton oeil mais qui va vers le bas de ton écran, et tu mesures l'angle entre les deux. Tu vas voir qu'il est bien inférieur à 70°, sauf si tu est collé à ton écran. Si tu es effectivement collé à ton écran, tu ne percevras pas les déformations que tu avais, car tu n'as pas la même perspective que si tu es bien assis dans ton fauteuil, et l'image de paraitra "normale".
    Pourquoi 45°? Parce que c'est à peu près l'angle de vision de l'oeil humain (du mien au moins), et que c'est une valeur plus ou moins remarquable, et que ça marche assez bien avec. Teste avec 50° ou 20°, tu verras qu'il n'y a pas énormément de différence.

    Quelques plages de valeurs:
    Citation Envoyé par Wikipédia
    Lenses are often referred to by terms that express their angle of view:

    * Ultra wide-angle lenses, also known as fisheye lenses, cover up to 180° (or even wider in special cases)
    * Wide-angle lenses generally cover between 100° and 60°
    * Normal, or Standard lenses generally cover between 50° and 25°
    * Telephoto lenses generally cover between 15° and 10°
    * Super Telephoto lenses generally cover between 8° through less than 1°
    (Source)
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  7. #7
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Juin 2007
    Messages : 15
    Par défaut
    Merci bien Je pense que ca répond à ma question. Je passe le post en "Résolu"

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

Discussions similaires

  1. insérer du 3ds dans opengl + collisions + tout quoi ;)
    Par Darknicosh dans le forum OpenGL
    Réponses: 5
    Dernier message: 22/04/2005, 15h14
  2. Objets 3Ds Max dans OpenGL
    Par Deedier dans le forum OpenGL
    Réponses: 5
    Dernier message: 24/03/2005, 14h21
  3. comment savoir définir les figure dans opengl
    Par romainhoarau2764 dans le forum OpenGL
    Réponses: 1
    Dernier message: 05/03/2005, 19h30
  4. Intégration 3DS dans OPENGL
    Par clara dans le forum OpenGL
    Réponses: 3
    Dernier message: 28/12/2004, 17h39
  5. Tableau de vertex dans OpenGL
    Par Guizmo57 dans le forum OpenGL
    Réponses: 5
    Dernier message: 11/04/2004, 09h15

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