source lumineuse [opengl/Glut] - C++ - Programmation
Marsh Posté le 14-09-2005 à 10:31:18
va voir la
http://www.paulsprojects.net/openg [...] atten.html
bon courage
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)
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.
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.
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().
Marsh Posté le 15-09-2005 à 16:37:34
tiens ton post a sauté
t'as dû te tromper entre edit et delete
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.
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 };
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;
}
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é.
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
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.
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?
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
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.
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