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 :

Question pour un null


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 30
    Par défaut Question pour un null
    Bonsoir,

    Je suis débutant en OpenGL. Je n'utilise que OpenGL (pas GLUT ou autre).
    Je pensais qu'il pourrait m'aider a afficher des objets simple mais je crois que je me trompe.

    J'essaye d'afficher un simple cylindre (avec mouvement de rotation) dur un fond noir. J'ai exporté un cylindre de Blender avec les normales et je l'affiche dans un programme sous VC6.

    Jusqu'ici tout va bien, j'arrive à avoir des ombrages et même à le colorier en jouant sur les lumières.

    Par contre je souhaiterai avoir des contours lissés. J'ai tout essayé (dont GL_SMOOTH) ,mais je vois toujours les faces sur la circonférence !!

    Je dois forcement faire une erreur mais je ne sais pas si c'est dans l'init d'OpenGL, dans la déclaration de l'objet (normales) ou autre.

    Si vous avez des idées n'hésitez pas à m'aider.
    Si vous voulez un bout du code, demandez.

    Merci.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    399
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 399
    Par défaut
    Salut,

    Si même en ombrage de Gouraud tu vois la faces, oui tu as sans doute un problème avec tes normales qui doivent être orienté suivant la face auquel appartient le sommet plutot que suivant le sommet (calculé d'après toute les faces auquel un sommet appartient).

    Il doit y avoir un moyen de régler ca dans blender mais je ne peux pas t'aider car je ne connais pas du tout ce logiciel

    Sinon tu peux les recalculer toi même lors du chargment de l'objet. Pour un cylindre c'est pas très dur (les faces du haut et du bas gardant des normales orienté suivant la face pour conserver l'arrete)
    SPARK
    Moteur de particule C++ opensource avec modules de rendu OpenGL, Irrlicht et SFML

  3. #3
    Membre chevronné
    Inscrit en
    Février 2008
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Février 2008
    Messages : 413
    Par défaut
    Bonjour,

    d'accord avec Frifon, ca m'a tout l'air d'un probleme de normales...

    Comme lui je ne connais pas vraiment blender, mais une fois ton modèle importé tu dois pouvoir les modifier toi même. Pour un cylindre c'est simple, la normale à chaque point P (à part ceux des faces haut et bas) c'est le vecteur P'P normalisé, avec P' le projeté de P sur l'axe du cylindre.

    Après, si tu veux juste afficher un cylindre tu peux te passer de blender et utiliser gluQuadricObject pour creer un cylindre en 3 lignes de code, avec les normales générées automatiquement comme il faut.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 30
    Par défaut
    Merci pour vous intéresser à mon problème.

    Voici ma séquence d'initialisation :
    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
    	glShadeModel (GL_SMOOTH);							// Enable Smooth Shading
    	glClearColor (0.0f, 0.0f, 0.0f, 1.0f);				// Black Background
    	glClearDepth (1.0f);								// Depth Buffer Setup
    	glEnable (GL_DEPTH_TEST);							// Enables Depth Testing
    	glDepthFunc (GL_LEQUAL);							// The Type Of Depth Testing To Do
    	glEnable (GL_NORMALIZE);
    	glHint (GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);	// Really Nice Perspective Calculations
     
     
    	GLfloat LightPosition[]= { 15.0f, -15.0f, 15.0f, 1.0f };    // Lumière de position
    	GLfloat LightAmbient[]= { 0.1f, 0.1f, 0.1f, 1.0f };			// Lumière ambiante
    	GLfloat LightDiffuse[]= { 1.0f, 1.0f, 1.0f, 1.0f };			// blanc
     
    	GLfloat specularLight[] = { 0.5f, 0.5f, 0.5f, 1.0f };
     
     
    	glLightfv (GL_LIGHT0, GL_AMBIENT, LightAmbient);     // eclairage ambiant
    	glLightfv (GL_LIGHT0, GL_DIFFUSE, LightDiffuse);     // eclairage diffus
    	glLightfv (GL_LIGHT0, GL_SPECULAR, specularLight);
    	glEnable (GL_LIGHT0);                                // active la lumière de position (spot)
     
    	glEnable (GL_LIGHTING);
    et ma déclaration d'un cylindre (avec 8 faces pour la circonférence), les triangles sont pour les 2 faces plate, les quads pour la circonférence :
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    // Generated by OBJ2C converter
    glBegin (GL_TRIANGLES);
    glNormal3d (0.000000,-1.000000,0.000000);
    glVertex3d (0.100307,-2.152969,-0.001729);
    glNormal3d (0.000000,-1.000000,0.000000);
    glVertex3d (1.622686,-2.152969,-1.524109);
    glNormal3d (0.000000,-1.000000,0.000000);
    glVertex3d (2.253276,-2.152969,-0.001729);
    glNormal3d (0.000000,1.000000,0.000000);
    glVertex3d (0.100307,2.152969,-0.001730);
    glNormal3d (0.000000,1.000000,0.000000);
    glVertex3d (2.253276,2.152969,-0.001731);
    glNormal3d (0.000000,1.000000,0.000000);
    glVertex3d (1.622686,2.152969,-1.524110);
    glNormal3d (0.000000,-1.000000,0.000000);
    glVertex3d (0.100307,-2.152969,-0.001729);
    glNormal3d (0.000000,-1.000000,0.000000);
    glVertex3d (2.253276,-2.152969,-0.001729);
    glNormal3d (0.000000,-1.000000,0.000000);
    glVertex3d (1.622686,-2.152969,1.520650);
    glNormal3d (0.000000,1.000000,0.000000);
    glVertex3d (0.100307,2.152969,-0.001730);
    glNormal3d (0.000000,1.000000,0.000000);
    glVertex3d (1.622687,2.152969,1.520649);
    glNormal3d (0.000000,1.000000,0.000000);
    glVertex3d (2.253276,2.152969,-0.001731);
    glNormal3d (0.000000,-1.000000,0.000000);
    glVertex3d (0.100307,-2.152969,-0.001729);
    glNormal3d (0.000000,-1.000000,0.000000);
    glVertex3d (1.622686,-2.152969,1.520650);
    glNormal3d (0.000000,-1.000000,0.000000);
    glVertex3d (0.100307,-2.152969,2.151240);
    glNormal3d (0.000000,1.000000,0.000000);
    glVertex3d (0.100307,2.152969,-0.001730);
    glNormal3d (0.000000,1.000000,0.000000);
    glVertex3d (0.100307,2.152969,2.151240);
    glNormal3d (0.000000,1.000000,0.000000);
    glVertex3d (1.622687,2.152969,1.520649);
    glNormal3d (0.000000,-1.000000,0.000000);
    glVertex3d (0.100307,-2.152969,-0.001729);
    glNormal3d (0.000000,-1.000000,0.000000);
    glVertex3d (0.100307,-2.152969,2.151240);
    glNormal3d (0.000000,-1.000000,0.000000);
    glVertex3d (-1.422073,-2.152969,1.520650);
    glNormal3d (0.000000,1.000000,0.000000);
    glVertex3d (0.100307,2.152969,-0.001730);
    glNormal3d (0.000000,1.000000,0.000000);
    glVertex3d (-1.422073,2.152969,1.520649);
    glNormal3d (0.000000,1.000000,0.000000);
    glVertex3d (0.100307,2.152969,2.151240);
    glNormal3d (0.000000,-1.000000,0.000000);
    glVertex3d (0.100307,-2.152969,-0.001729);
    glNormal3d (0.000000,-1.000000,0.000000);
    glVertex3d (-1.422073,-2.152969,1.520650);
    glNormal3d (0.000000,-1.000000,0.000000);
    glVertex3d (-2.052662,-2.152969,-0.001729);
    glNormal3d (0.000000,1.000000,0.000000);
    glVertex3d (0.100307,2.152969,-0.001730);
    glNormal3d (0.000000,1.000000,0.000000);
    glVertex3d (-2.052662,2.152969,-0.001731);
    glNormal3d (0.000000,1.000000,0.000000);
    glVertex3d (-1.422073,2.152969,1.520649);
    glNormal3d (0.000000,-1.000000,0.000000);
    glVertex3d (0.100307,-2.152969,-0.001729);
    glNormal3d (0.000000,-1.000000,0.000000);
    glVertex3d (-2.052662,-2.152969,-0.001729);
    glNormal3d (0.000000,-1.000000,0.000000);
    glVertex3d (-1.422073,-2.152969,-1.524108);
    glNormal3d (0.000000,1.000000,0.000000);
    glVertex3d (0.100307,2.152969,-0.001730);
    glNormal3d (0.000000,1.000000,0.000000);
    glVertex3d (-1.422071,2.152969,-1.524110);
    glNormal3d (0.000000,1.000000,0.000000);
    glVertex3d (-2.052662,2.152969,-0.001731);
    glNormal3d (0.000000,-1.000000,0.000000);
    glVertex3d (0.100307,-2.152969,-0.001729);
    glNormal3d (0.000000,-1.000000,0.000000);
    glVertex3d (-1.422073,-2.152969,-1.524108);
    glNormal3d (0.000000,-1.000000,0.000000);
    glVertex3d (0.100306,-2.152969,-2.154699);
    glNormal3d (0.000000,1.000000,0.000000);
    glVertex3d (0.100307,2.152969,-0.001730);
    glNormal3d (0.000000,1.000000,0.000000);
    glVertex3d (0.100310,2.152969,-2.154699);
    glNormal3d (0.000000,1.000000,0.000000);
    glVertex3d (-1.422071,2.152969,-1.524110);
    glNormal3d (0.000000,-1.000000,0.000000);
    glVertex3d (0.100306,-2.152969,-2.154699);
    glNormal3d (0.000000,-1.000000,0.000000);
    glVertex3d (1.622686,-2.152969,-1.524109);
    glNormal3d (0.000000,-1.000000,0.000000);
    glVertex3d (0.100307,-2.152969,-0.001729);
    glNormal3d (0.000000,1.000000,0.000000);
    glVertex3d (0.100307,2.152969,-0.001730);
    glNormal3d (0.000000,1.000000,0.000000);
    glVertex3d (1.622686,2.152969,-1.524110);
    glNormal3d (0.000000,1.000000,0.000000);
    glVertex3d (0.100310,2.152969,-2.154699);
    glEnd ();
     
     
    glBegin (GL_QUADS);
    glNormal3d (0.923879,0.000000,-0.382684);
    glVertex3d (1.622686,-2.152969,-1.524109);
    glNormal3d (0.923879,0.000000,-0.382684);
    glVertex3d (1.622686,2.152969,-1.524110);
    glNormal3d (0.923879,0.000000,-0.382684);
    glVertex3d (2.253276,2.152969,-0.001731);
    glNormal3d (0.923879,0.000000,-0.382684);
    glVertex3d (2.253276,-2.152969,-0.001729);
    glNormal3d (0.923880,0.000000,0.382683);
    glVertex3d (2.253276,-2.152969,-0.001729);
    glNormal3d (0.923880,0.000000,0.382683);
    glVertex3d (2.253276,2.152969,-0.001731);
    glNormal3d (0.923880,0.000000,0.382683);
    glVertex3d (1.622687,2.152969,1.520649);
    glNormal3d (0.923880,0.000000,0.382683);
    glVertex3d (1.622686,-2.152969,1.520650);
    glNormal3d (0.382683,0.000000,0.923879);
    glVertex3d (1.622686,-2.152969,1.520650);
    glNormal3d (0.382683,0.000000,0.923879);
    glVertex3d (1.622687,2.152969,1.520649);
    glNormal3d (0.382683,0.000000,0.923879);
    glVertex3d (0.100307,2.152969,2.151240);
    glNormal3d (0.382683,0.000000,0.923879);
    glVertex3d (0.100307,-2.152969,2.151240);
    glNormal3d (-0.382684,0.000000,0.923879);
    glVertex3d (0.100307,-2.152969,2.151240);
    glNormal3d (-0.382684,0.000000,0.923879);
    glVertex3d (0.100307,2.152969,2.151240);
    glNormal3d (-0.382684,0.000000,0.923879);
    glVertex3d (-1.422073,2.152969,1.520649);
    glNormal3d (-0.382684,0.000000,0.923879);
    glVertex3d (-1.422073,-2.152969,1.520650);
    glNormal3d (-0.923880,0.000000,0.382683);
    glVertex3d (-1.422073,-2.152969,1.520650);
    glNormal3d (-0.923880,0.000000,0.382683);
    glVertex3d (-1.422073,2.152969,1.520649);
    glNormal3d (-0.923880,0.000000,0.382683);
    glVertex3d (-2.052662,2.152969,-0.001731);
    glNormal3d (-0.923880,0.000000,0.382683);
    glVertex3d (-2.052662,-2.152969,-0.001729);
    glNormal3d (-0.923879,0.000000,-0.382684);
    glVertex3d (-2.052662,-2.152969,-0.001729);
    glNormal3d (-0.923879,0.000000,-0.382684);
    glVertex3d (-2.052662,2.152969,-0.001731);
    glNormal3d (-0.923879,0.000000,-0.382684);
    glVertex3d (-1.422071,2.152969,-1.524110);
    glNormal3d (-0.923879,0.000000,-0.382684);
    glVertex3d (-1.422073,-2.152969,-1.524108);
    glNormal3d (-0.382683,0.000000,-0.923880);
    glVertex3d (-1.422073,-2.152969,-1.524108);
    glNormal3d (-0.382683,0.000000,-0.923880);
    glVertex3d (-1.422071,2.152969,-1.524110);
    glNormal3d (-0.382683,0.000000,-0.923880);
    glVertex3d (0.100310,2.152969,-2.154699);
    glNormal3d (-0.382683,0.000000,-0.923880);
    glVertex3d (0.100306,-2.152969,-2.154699);
    glNormal3d (0.382684,0.000000,-0.923880);
    glVertex3d (1.622686,2.152969,-1.524110);
    glNormal3d (0.382684,0.000000,-0.923880);
    glVertex3d (1.622686,-2.152969,-1.524109);
    glNormal3d (0.382684,0.000000,-0.923880);
    glVertex3d (0.100306,-2.152969,-2.154699);
    glNormal3d (0.382684,0.000000,-0.923880);
    glVertex3d (0.100310,2.152969,-2.154699);
    glEnd ();
    Voyez-vous quelque chose qui vous choque dans les normales ?

  5. #5
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 582
    Par défaut
    sur la circonférence, la normale d'un sommet commun à 2 triangles doit être la même, sinon tes triangles réagiront différemment à la lumière et tu verras les faces

    également, la normale de chaque sommet d'un même triangle est différente des autres normales des autres sommets qui composent ce même triangle
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    399
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 399
    Par défaut
    En effet tes normales sur la circonférence sont identiques 4 a 4 donc par quads. C'est donc logique que tu es un effet facetté même avec un ombrage de Gouraud.

    Dans ton cas, il faut que tes normales soient par arretes. En gros, pour ton cylindre, pour les faces de la circonférence, il faut que tout sommets avec X et Z identique ait une normale identique. Pour calculer les normales aux arrêtes, rien de plus simples : addition des 2 normales (ca marche uniquement car elles sont normalisées) des faces adjacentes puis normalisation ou alors par trigonométrie en fonction de l'angle.

    Au passage, tes normales étant bien normalisées le glEnable(GL_NORMALIZE) n'est pas necessaire et ne fera que ralentir l'execution.
    SPARK
    Moteur de particule C++ opensource avec modules de rendu OpenGL, Irrlicht et SFML

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

Discussions similaires

  1. BTS Info de Gestion passé aujourd'hui question pour SQL
    Par red210 dans le forum Décisions SGBD
    Réponses: 11
    Dernier message: 29/05/2005, 14h48
  2. [bochs] Question pour un kernel de base...
    Par hudson dans le forum Assembleur
    Réponses: 2
    Dernier message: 24/02/2005, 12h07
  3. Petite question pour Backup
    Par chicken92000 dans le forum Administration
    Réponses: 2
    Dernier message: 16/09/2004, 16h10
  4. [MIB] Questions pour construire une mib
    Par fadoua dans le forum Développement
    Réponses: 4
    Dernier message: 11/03/2004, 10h47

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