Ombres & lumières avec Lib GLUT
yannousfly
Messages postés
2
Statut
Membre
-
yannousfly Messages postés 2 Statut Membre -
yannousfly Messages postés 2 Statut Membre -
Bonjour,
J'ai quelques soucis avec Open GL et les lumières en programmant sous visual C++2005.
Le petit bout de code suivant devrait permettr d'afficher des cercles (types polygonnes), les formes sont affichées mais je ne m'en sors pas avec les ombres et les lumières, il n'y a aucun effet de lumière lorsque je bouge l'objet, aucune frontière entre les objets etc....
Voici le code que j'ai inclus dans une fonction d'affichage qui est appelée à chaque mouvement de souris (géré en modifiant la matrice translation et rotation). Je remercie d'avance ceux qui voudront bien vouloir jeter un coup d'oeil sur le code commentée suivant.
La matrcie est intialisée em mode projection et "modelview"
Salut.
DISPLAY()
{
static BOOL bBusy = FALSE;
if(bBusy)
return;
bBusy = TRUE;
//glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
//les variables m_tran et m_wangle sont mis à jour ailleurs dans
//le code en fonction des messages windows de la souris
glTranslatef(m_transX, m_transY, -m_fRadius);
glRotatef(m_wAngleXCourant, 1.0f, 0.0f, 0.0f);
glRotatef(m_wAngleYCourant, 0.0f, 1.0f, 0.0f);
glRotatef(m_wAngleZCourant, 0.0f, 0.0f, 1.0f);
glEnable(GL_AUTO_NORMAL);
glEnable(GL_NORMALIZE);
glEnable(GL_DEPTH_TEST);
//paramètrage de la lumière rayonnée
GLfloat em[] = {1,1,1,1};//spot blanc
GLfloat amb[] = {0.5,0.5,0.5,1.0};//lumière ambiante
GLfloat dif[] = {1,1,1,1.0};
GLfloat spe[] = {0,0,0,1.0};//pas de spéculaire
GLfloat pos[] = {0,0,-1,0.0};//position du spot lumineux en (0,0,-1)
//paramètrage des matériaux et réponse à la lumière
static float diffuse6[4] = { 0.5,0,0,0.5 };
static float ambiant6[4] = { 0.5,0,0,0.5 };
static float specular6[4] = { 0.5,0,0,0.5 };
static float emission6[4] = { 0.5,0.5,0.5,0.5 };
static float shininess6[1] = { 100 };
glEnable(GL_LIGHTING);//active les lumières
glEnable(GL_LIGHT0);
//initialisation des sources lumineuses
glLightfv(GL_LIGHT0,GL_POSITION,pos);
glLightfv(GL_LIGHT0, GL_DIFFUSE, dif) ;
glLightfv(GL_LIGHT0, GL_SPECULAR, spe) ;
glLightfv(GL_LIGHT0, GL_AMBIENT, amb) ;
//initialisation des matériaux
glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,diffuse6);
glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,ambiant6);
glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,specular6);
glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,emission6);
glMaterialfv(GL_FRONT_AND_BACK,GL_SHININESS,shininess6);
glEnable(GL_NORMALIZE);
//exemple : dessine 10 cercles parallèles régulièrement espacés suivant la direction Z
// les cercles sont des polygones constitués d'une centaines de sommets
for(int i=0;i<10;i++)//boucle sur les cercles parallèles
{
glBegin(GL_POLYGON);//GL_LINE_STRIP);
glNormal3f(0.0,0.0,1.0);//la normale à chaque polygone est suivant Z
for(int j=0;j<TabNbPoints[i];j++)//TabNbPoints contient le nbre de sommets du polygone
{ //m_fx m_fy m_fz contiennent les valeurs x, y et z des sommets dans l'espace
GLfloat x=(GLfloat)(m_fx[i][j]/500.0);
GLfloat y=(GLfloat)(m_fy[i][j]/500.0);
GLfloat z=(GLfloat)(m_fz[i][j]/500.0);
glVertex3f(x,y,z);//dessine le sommet
}
glEnd();
}
glPopMatrix();
glFinish();
SwapBuffers(wglGetCurrentDC());
bBusy = FALSE;
}
J'ai quelques soucis avec Open GL et les lumières en programmant sous visual C++2005.
Le petit bout de code suivant devrait permettr d'afficher des cercles (types polygonnes), les formes sont affichées mais je ne m'en sors pas avec les ombres et les lumières, il n'y a aucun effet de lumière lorsque je bouge l'objet, aucune frontière entre les objets etc....
Voici le code que j'ai inclus dans une fonction d'affichage qui est appelée à chaque mouvement de souris (géré en modifiant la matrice translation et rotation). Je remercie d'avance ceux qui voudront bien vouloir jeter un coup d'oeil sur le code commentée suivant.
La matrcie est intialisée em mode projection et "modelview"
Salut.
DISPLAY()
{
static BOOL bBusy = FALSE;
if(bBusy)
return;
bBusy = TRUE;
//glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
//les variables m_tran et m_wangle sont mis à jour ailleurs dans
//le code en fonction des messages windows de la souris
glTranslatef(m_transX, m_transY, -m_fRadius);
glRotatef(m_wAngleXCourant, 1.0f, 0.0f, 0.0f);
glRotatef(m_wAngleYCourant, 0.0f, 1.0f, 0.0f);
glRotatef(m_wAngleZCourant, 0.0f, 0.0f, 1.0f);
glEnable(GL_AUTO_NORMAL);
glEnable(GL_NORMALIZE);
glEnable(GL_DEPTH_TEST);
//paramètrage de la lumière rayonnée
GLfloat em[] = {1,1,1,1};//spot blanc
GLfloat amb[] = {0.5,0.5,0.5,1.0};//lumière ambiante
GLfloat dif[] = {1,1,1,1.0};
GLfloat spe[] = {0,0,0,1.0};//pas de spéculaire
GLfloat pos[] = {0,0,-1,0.0};//position du spot lumineux en (0,0,-1)
//paramètrage des matériaux et réponse à la lumière
static float diffuse6[4] = { 0.5,0,0,0.5 };
static float ambiant6[4] = { 0.5,0,0,0.5 };
static float specular6[4] = { 0.5,0,0,0.5 };
static float emission6[4] = { 0.5,0.5,0.5,0.5 };
static float shininess6[1] = { 100 };
glEnable(GL_LIGHTING);//active les lumières
glEnable(GL_LIGHT0);
//initialisation des sources lumineuses
glLightfv(GL_LIGHT0,GL_POSITION,pos);
glLightfv(GL_LIGHT0, GL_DIFFUSE, dif) ;
glLightfv(GL_LIGHT0, GL_SPECULAR, spe) ;
glLightfv(GL_LIGHT0, GL_AMBIENT, amb) ;
//initialisation des matériaux
glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,diffuse6);
glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,ambiant6);
glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,specular6);
glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,emission6);
glMaterialfv(GL_FRONT_AND_BACK,GL_SHININESS,shininess6);
glEnable(GL_NORMALIZE);
//exemple : dessine 10 cercles parallèles régulièrement espacés suivant la direction Z
// les cercles sont des polygones constitués d'une centaines de sommets
for(int i=0;i<10;i++)//boucle sur les cercles parallèles
{
glBegin(GL_POLYGON);//GL_LINE_STRIP);
glNormal3f(0.0,0.0,1.0);//la normale à chaque polygone est suivant Z
for(int j=0;j<TabNbPoints[i];j++)//TabNbPoints contient le nbre de sommets du polygone
{ //m_fx m_fy m_fz contiennent les valeurs x, y et z des sommets dans l'espace
GLfloat x=(GLfloat)(m_fx[i][j]/500.0);
GLfloat y=(GLfloat)(m_fy[i][j]/500.0);
GLfloat z=(GLfloat)(m_fz[i][j]/500.0);
glVertex3f(x,y,z);//dessine le sommet
}
glEnd();
}
glPopMatrix();
glFinish();
SwapBuffers(wglGetCurrentDC());
bBusy = FALSE;
}
A voir également:
- Ombres & lumières avec Lib GLUT
- Dr lib - Guide
- Comment faire des ombres sur illustrator - Forum The Gimp
- Cache lib - Forum Vos droits sur internet
- Cbk nous lib ✓ - Forum Consommation & Internet
- Error 2002 (hy000): can't connect to local mysql server through socket '/var/lib/mysql/mysql.sock' (2) ✓ - Forum Linux / Unix
1 réponse
Bonjour,
J'ai quelques soucis avec Open GL et les lumières en programmant sous visual C++2005.
Le petit bout de code suivant devrait permettr d'afficher des cercles (types polygonnes), les formes sont affichées mais je ne m'en sors pas avec les ombres et les lumières, il n'y a aucun effet de lumière lorsque je bouge l'objet, aucune frontière entre les objets etc....
Voici le code que j'ai inclus dans une fonction d'affichage qui est appelée à chaque mouvement de souris (géré en modifiant la matrice translation et rotation). Je remercie d'avance ceux qui voudront bien vouloir jeter un coup d'oeil sur le code commentée suivant.
La matrcie est intialisée em mode projection et "modelview"
Salut.
DISPLAY()
{
static BOOL bBusy = FALSE;
if(bBusy)
return;
bBusy = TRUE;
//glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
//les variables m_tran et m_wangle sont mis à jour ailleurs dans
//le code en fonction des messages windows de la souris
glTranslatef(m_transX, m_transY, -m_fRadius);
glRotatef(m_wAngleXCourant, 1.0f, 0.0f, 0.0f);
glRotatef(m_wAngleYCourant, 0.0f, 1.0f, 0.0f);
glRotatef(m_wAngleZCourant, 0.0f, 0.0f, 1.0f);
glEnable(GL_AUTO_NORMAL);
glEnable(GL_NORMALIZE);
glEnable(GL_DEPTH_TEST);
//paramètrage de la lumière rayonnée
GLfloat em[] = {1,1,1,1};//spot blanc
GLfloat amb[] = {0.5,0.5,0.5,1.0};//lumière ambiante
GLfloat dif[] = {1,1,1,1.0};
GLfloat spe[] = {0,0,0,1.0};//pas de spéculaire
GLfloat pos[] = {0,0,-1,0.0};//position du spot lumineux en (0,0,-1)
//paramètrage des matériaux et réponse à la lumière
static float diffuse6[4] = { 0.5,0,0,0.5 };
static float ambiant6[4] = { 0.5,0,0,0.5 };
static float specular6[4] = { 0.5,0,0,0.5 };
static float emission6[4] = { 0.5,0.5,0.5,0.5 };
static float shininess6[1] = { 100 };
glEnable(GL_LIGHTING);//active les lumières
glEnable(GL_LIGHT0);
//initialisation des sources lumineuses
glLightfv(GL_LIGHT0,GL_POSITION,pos);
glLightfv(GL_LIGHT0, GL_DIFFUSE, dif) ;
glLightfv(GL_LIGHT0, GL_SPECULAR, spe) ;
glLightfv(GL_LIGHT0, GL_AMBIENT, amb) ;
//initialisation des matériaux
glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,diffuse6);
glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,ambiant6);
glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,specular6);
glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,emission6);
glMaterialfv(GL_FRONT_AND_BACK,GL_SHININESS,shininess6);
glEnable(GL_NORMALIZE);
//exemple : dessine 10 cercles parallèles régulièrement espacés suivant la direction Z
// les cercles sont des polygones constitués d'une centaines de sommets
for(int i=0;i<10;i++)//boucle sur les cercles parallèles
{
glBegin(GL_POLYGON);//GL_LINE_STRIP);
glNormal3f(0.0,0.0,1.0);//la normale à chaque polygone est suivant Z
for(int j=0;j<TabNbPoints[i];j++)//TabNbPoints contient le nbre de sommets du polygone
{ //m_fx m_fy m_fz contiennent les valeurs x, y et z des sommets dans l'espace
GLfloat x=(GLfloat)(m_fx[i][j]/500.0);
GLfloat y=(GLfloat)(m_fy[i][j]/500.0);
GLfloat z=(GLfloat)(m_fz[i][j]/500.0);
glVertex3f(x,y,z);//dessine le sommet
}
glEnd();
}
glPopMatrix();
glFinish();
SwapBuffers(wglGetCurrentDC());
bBusy = FALSE;
}
J'ai quelques soucis avec Open GL et les lumières en programmant sous visual C++2005.
Le petit bout de code suivant devrait permettr d'afficher des cercles (types polygonnes), les formes sont affichées mais je ne m'en sors pas avec les ombres et les lumières, il n'y a aucun effet de lumière lorsque je bouge l'objet, aucune frontière entre les objets etc....
Voici le code que j'ai inclus dans une fonction d'affichage qui est appelée à chaque mouvement de souris (géré en modifiant la matrice translation et rotation). Je remercie d'avance ceux qui voudront bien vouloir jeter un coup d'oeil sur le code commentée suivant.
La matrcie est intialisée em mode projection et "modelview"
Salut.
DISPLAY()
{
static BOOL bBusy = FALSE;
if(bBusy)
return;
bBusy = TRUE;
//glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
//les variables m_tran et m_wangle sont mis à jour ailleurs dans
//le code en fonction des messages windows de la souris
glTranslatef(m_transX, m_transY, -m_fRadius);
glRotatef(m_wAngleXCourant, 1.0f, 0.0f, 0.0f);
glRotatef(m_wAngleYCourant, 0.0f, 1.0f, 0.0f);
glRotatef(m_wAngleZCourant, 0.0f, 0.0f, 1.0f);
glEnable(GL_AUTO_NORMAL);
glEnable(GL_NORMALIZE);
glEnable(GL_DEPTH_TEST);
//paramètrage de la lumière rayonnée
GLfloat em[] = {1,1,1,1};//spot blanc
GLfloat amb[] = {0.5,0.5,0.5,1.0};//lumière ambiante
GLfloat dif[] = {1,1,1,1.0};
GLfloat spe[] = {0,0,0,1.0};//pas de spéculaire
GLfloat pos[] = {0,0,-1,0.0};//position du spot lumineux en (0,0,-1)
//paramètrage des matériaux et réponse à la lumière
static float diffuse6[4] = { 0.5,0,0,0.5 };
static float ambiant6[4] = { 0.5,0,0,0.5 };
static float specular6[4] = { 0.5,0,0,0.5 };
static float emission6[4] = { 0.5,0.5,0.5,0.5 };
static float shininess6[1] = { 100 };
glEnable(GL_LIGHTING);//active les lumières
glEnable(GL_LIGHT0);
//initialisation des sources lumineuses
glLightfv(GL_LIGHT0,GL_POSITION,pos);
glLightfv(GL_LIGHT0, GL_DIFFUSE, dif) ;
glLightfv(GL_LIGHT0, GL_SPECULAR, spe) ;
glLightfv(GL_LIGHT0, GL_AMBIENT, amb) ;
//initialisation des matériaux
glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,diffuse6);
glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,ambiant6);
glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,specular6);
glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,emission6);
glMaterialfv(GL_FRONT_AND_BACK,GL_SHININESS,shininess6);
glEnable(GL_NORMALIZE);
//exemple : dessine 10 cercles parallèles régulièrement espacés suivant la direction Z
// les cercles sont des polygones constitués d'une centaines de sommets
for(int i=0;i<10;i++)//boucle sur les cercles parallèles
{
glBegin(GL_POLYGON);//GL_LINE_STRIP);
glNormal3f(0.0,0.0,1.0);//la normale à chaque polygone est suivant Z
for(int j=0;j<TabNbPoints[i];j++)//TabNbPoints contient le nbre de sommets du polygone
{ //m_fx m_fy m_fz contiennent les valeurs x, y et z des sommets dans l'espace
GLfloat x=(GLfloat)(m_fx[i][j]/500.0);
GLfloat y=(GLfloat)(m_fy[i][j]/500.0);
GLfloat z=(GLfloat)(m_fz[i][j]/500.0);
glVertex3f(x,y,z);//dessine le sommet
}
glEnd();
}
glPopMatrix();
glFinish();
SwapBuffers(wglGetCurrentDC());
bBusy = FALSE;
}