[opengl/Glut] source lumineuse

source lumineuse [opengl/Glut] - C++ - Programmation

Marsh Posté le 10-09-2005 à 23:24:30    

voila mon probleme, j'aimerai mettre une source lumineuse au centre d'une sphere pour simuler un soleil. Ca serai cool si quelqun pouvais me donné le morceau de code qui me permetterai de faire cela. merci d'avance

Reply

Marsh Posté le 10-09-2005 à 23:24:30   

Reply

Marsh Posté le 14-09-2005 à 10:31:18    

va voir la  
 
http://www.paulsprojects.net/openg [...] atten.html
 
bon courage
 
 

Reply

Marsh Posté le 14-09-2005 à 11:19:02    

faire un système solaire réduit où tu vois le soleil et les planètes ensembles ? (=> source de lumière ponctuelle, ou vecteur seul)
éclairer des objets distants, par exemple éclairer des véhicules sur la terre (=> vecteur de lumière seul)
un halo ? (=> impositor/lens flare)

Reply

Marsh Posté le 15-09-2005 à 15:49:13    

merci pour ces info, mais j'aurai encor une question. La j'ai bien reussi à créer la source ponctuelle au centre du soleil, mais le probleme c'est que meme la face caché des planetes est illuminée. est-ce qu'il faut appeller une autre fonction pour resoudre ce problemme? ou est-ce une erreur dans mon programme.


Message édité par Moebius911 le 15-09-2005 à 15:50:11
Reply

Marsh Posté le 15-09-2005 à 16:06:08    

poste des screenshots.
 
tu donnes bien une normale a chaque vertex ?
 
regarde si les coefficients de l'éclairage ambiant sont à 1 pour tes surfaces et ta lumière (je sais pas si c'est un état global en OpenGl), ce qui n'est pas bon puisque tu satures ton éclairage.
 
pour avoir les surfaces cachés au noir, et les surfaces éclairés au blanc (modulé par le matériau couleur/texture).
 
l'ambiant doit être a 0, et le diffuse a 1. si l'ambiant est à 1, ce sera tout blanc.


Message édité par bjone le 15-09-2005 à 16:34:39
Reply

Marsh Posté le 15-09-2005 à 16:36:53    

a vu de nez je ferai:
 
gluSphere(quadratic,rayon_planete,60,60);  
 
puis ensuite:
 
gluQuadricTexture(quadratic, GL_TRUE);  
gluQuadricNormals(quadratic, GLU_SMOOTH);  
 
car pour générer les coordoonées UV et les normales, il faut peut être avoir les données générées par gluSphere().
 

Reply

Marsh Posté le 15-09-2005 à 16:37:34    

tiens ton post a sauté :D
 
t'as dû te tromper entre edit et delete :D

Reply

Marsh Posté le 15-09-2005 à 16:39:21    

quoique non, ces attributs ne font peut être que influencer gluSphere, et ne font peut être pas de génération par eux même.

Reply

Marsh Posté le 15-09-2005 à 16:44:14    

tien voila mon sous prog pour créé les planetes
 
void planete (int ellipse_longeur,int ellipse_largeur,double rayon_planete,double vitesse,char inclinaison,int vitesse_rot){
 
         const double t = glutGet(GLUT_ELAPSED_TIME) / 1000000.0;
         const double a = (t*vitesse)*90.0;      
         
         glPushMatrix();
         glEnable(GL_TEXTURE_2D);
         GLUquadricObj *quadratic;  
         quadratic = gluNewQuadric();
         gluQuadricTexture(quadratic, GL_TRUE); // c'est pour gèrer automatiquement les textures
         gluQuadricNormals(quadratic, GLU_SMOOTH); ///pour une bonne gestion de l'éclairage  
         x=ellipse_longeur*cos(a*3.14);
         y=ellipse_largeur*sin(a*3.14);          
         glTranslated(x,y,0);    
         glRotated(a*vitesse_rot,0,0,1);
         glRotated(inclinaison,0,1,0);  
          gluSphere(quadratic,rayon_planete,60,60);  
          glDisable(GL_TEXTURE_2D);
     glPopMatrix();    
 
     }
 
 
et pour l'eclairage voici se que j'ai
 
const GLfloat light_ambient[]  = { 0.0f, 0.0f, 0.0f, 1.0f };
const GLfloat light_diffuse[]  = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_position[] = { 1.0f, 1.0f, 1.0f, 1.0f }; //position de la lampe (x,y,z)
 
const GLfloat mat_ambient[]    = { 0.7f, 0.7f, 0.7f, 1.0f };
const GLfloat mat_diffuse[]    = { 0.8f, 0.8f, 0.8f, 1.0f };
const GLfloat mat_specular[]   = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat high_shininess[] = { 100.0f };

Reply

Marsh Posté le 15-09-2005 à 16:46:25    

pi voici mon main() si ca pe t'aider
 
int  
main(int argc, char *argv[])
{
char bmp_load=0;          
    glutInit(&argc, argv);
    glutInitWindowSize(640,480);
    glutInitWindowPosition(10,10);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
 
    glutCreateWindow("System solaire" );
 
    glutReshapeFunc(Reshape);
    //on charge juste une fois les texture (sinon trop gros ralentissement PC)
    if(bmp_load==0){
    LoadTexture();
    bmp_load++;    
    }
     
    glutDisplayFunc(display);
    glutKeyboardFunc(key);
    glutSpecialFunc(GestionSpecial); //active les touche special du clavier
    glutMouseFunc(souris);  
    glutWarpPointer(0,0);
 
 
    glutIdleFunc(idle);
 
    glClearColor(0,0,0,0);
    glEnable(GL_CULL_FACE);
    glCullFace(GL_BACK);
     
    //glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);// active le mode trensparence
    //glEnable(GL_BLEND); // now utilisé glColor4d(0,0,0,0.2);(ici 0.2 corespond a la trensparence )
 
 
    glEnable(GL_DEPTH_TEST);//active le teste de profondeur
    glDepthFunc(GL_LESS);
 
 
    glEnable(GL_LIGHT0); //allume la limiere n°1 ( au maxi 8 sources lumineuses disop)
    glEnable(GL_NORMALIZE);
    glEnable(GL_COLOR_MATERIAL); // active la couleur des objets
    glEnable(GL_LIGHTING); // active l'eclairage
     
 
    glLightfv(GL_LIGHT0, GL_AMBIENT,  light_ambient);
    glLightfv(GL_LIGHT0, GL_DIFFUSE,  light_diffuse);
    glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);  
 
 
    glMaterialfv(GL_FRONT, GL_AMBIENT,   mat_ambient);
    glMaterialfv(GL_FRONT, GL_DIFFUSE,   mat_diffuse);
    glMaterialfv(GL_FRONT, GL_SPECULAR,  mat_specular);
    glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess); ////contraste
 
    glutMainLoop();
 
    return EXIT_SUCCESS;
}

Reply

Marsh Posté le 15-09-2005 à 16:46:25   

Reply

Marsh Posté le 15-09-2005 à 18:56:13    

mais nous des screenshots avec imageshack

Reply

Marsh Posté le 15-09-2005 à 19:42:00    

http://img11.imageshack.us/my.php?image=18fh1.jpg
 
comme on peut le voir sur l'image la partie de la planete face au soleil est aussi bien eclairé que derriere,alor qu'elle devrai etre moin éclairé.

Reply

Marsh Posté le 15-09-2005 à 19:57:19    

et pris d'un autre point de vue ?

Reply

Marsh Posté le 15-09-2005 à 20:21:30    

http://img172.imageshack.us/my.php?image=23ay.jpg
http://img172.imageshack.us/my.php?image=32rc.jpg
 
on voie bien le soleil sur la gauche mais ya pas de zone d'ombre sur la planete

Reply

Marsh Posté le 15-09-2005 à 21:03:11    

Comment est-ce que tu calcules light_position ?
 
si ta vue change il faut que tu recalcules light_position en conséquence.

Reply

Marsh Posté le 15-09-2005 à 22:03:18    

ba en fait j'ai une lumiere ponctuel au mileu du soleil donc j'ai ça :
const GLfloat light_position[] = { 1.0f, 1.0f, 1.0f, 1.0f }; puis j'y touche pu apres. mais comme c'est une source poctuel ca sere a rien de recalculé la position si?


Message édité par Moebius911 le 15-09-2005 à 22:04:03
Reply

Marsh Posté le 16-09-2005 à 02:26:52    

ca cest typique, ta source bouge en meme temps que la camera, tu dois recalculer la position a chaque fois.
 
j avez eu ce problem aussi : http://ozserver.no-ip.com/~greg/  dans projects

Reply

Marsh Posté le 17-09-2005 à 12:16:17    

oui mais pour mon soleil j'ai mis une source poctuelle au millieu, donc peut importe l'androi ou on se trouve on doit voir de la lumiere, à part derirere les objet. la en mettant ma source poctuel j'ai l'impression que la lumiere traverse tous les objet. Ca m'arrenge qu'elle traverse la texture du soleil comme elle est a l'interieure mais pas qu'elle traverse les autre planettes. Par contre quand je met la source lumineuse a une distance infini " GLfloat light_position[] = { 1.0f, 1.0f, 1.0f, 0.0f }; "   la je voi bien le coté non eclairé des planete mais le probleme c'est que pour moi la source lumineuse doit pas venir de l'infini mais du soleil.  


Message édité par Moebius911 le 17-09-2005 à 12:20:15
Reply

Sujets relatifs:

Leave a Replay

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