Opengl - Light &Normales+ [edit] probleme de math

Opengl - Light &Normales+ [edit] probleme de math - C++ - Programmation

Marsh Posté le 31-01-2006 à 20:39:18    

J'essaie d'illuminer un modele sous opengl
http://users.skynet.be/fa218598/14.avi (DivX5.0)
 
Il s'agit d'une super ellipse (un cylindre avec les bords arrondis  :D)
 
En bleu clair c'est la position de la lumière, en bleu foncé les normales et vert pour les points du mesh.
 
Ce que je ne comprends pas :
 
-pourquoi qd jetire mon objet la face superieure devient elle plus claire ??? (doit-je changer aussi la position de la lumiere?)
-pq le fait de changer simplement l'orientation de l'objet change aussi son éclairage ??? (alors que la lumiere subit les rotations aussi)
 
Au depart, je faisais un glScalef pour changer les proportions mais cela perturbe aussi les normales. meme avec le fameux GL_NORMALIZED je n'arrive a aucun resultat valable. Du coup maintenant j'agis directement sur les normales.
 
Les normales ont ete normalisées. Seuls les points de l'objet sont deformes.
 

Code :
  1. void DrawFct(...)
  2. {
  3.    float mat_specular  [4]   = { 1.0, 1.0, 1.0, 0.0 };
  4.    float light_position [4]   = { 0.0, 1.0, 0.0, 1.0 };
  5.    float lightambiant [4]   = { 0.0, 0.0, 0.0, 1.0 }; 
  6.    glPushMatrix(); 
  7.  
  8.    glRotatef(-90,1.0f,0.0f,0.0f); 
  9.    //glScalef(radius,t.pieheight,radius);         
  10.  
  11.    glEnable(GL_DEPTH_TEST);
  12.    glEnable(GL_LIGHTING);
  13.    glEnable(GL_LIGHT0); 
  14.    light_position[1]=50.0+light_position[1]*t.pieheight;
  15.  
  16.    glMaterialf(GL_FRONT, GL_SHININESS, 1.5);
  17.    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
  18.    glLightfv(GL_LIGHT0, GL_AMBIENT, lightambiant);
  19.    glLightfv(GL_LIGHT0, GL_POSITION, light_position);
  20.  
  21.    glPointSize(5.0); 
  22.    glDisable(GL_LIGHTING);
  23.    glBegin(GL_POINTS);
  24.        glColor3ub(0,128,255);
  25.        glVertex3f(-light_position[0],-light_position[1],-light_position[2]);
  26.    glEnd();   
  27.    glEnable(GL_LIGHTING);   
  28.    glEnable(GL_RESCALE_NORMAL);   //seems useless
  29.    Draw3DObject(...);
  30.    glDisable(GL_RESCALE_NORMAL);
  31.    glDisable(GL_LIGHTING);
  32.    glDisable(GL_DEPTH_TEST);
  33.    glPopMatrix(); 
  34. }


Message édité par red faction le 02-02-2006 à 18:02:56
Reply

Marsh Posté le 31-01-2006 à 20:39:18   

Reply

Marsh Posté le 31-01-2006 à 22:21:04    

y'a un autre que je comprends pas, c'est qu'alors que ta source de lumière semble bien au dessus et au centre du "bouchon" elliptique supérieur.
 
en gros quand tu orientes ton truc vers la caméra, avec caméra->lumière->centre de l'ellipse supérieure presques alignés, on devrait voir l'éclairage diffus centré dans l'ellipse, et le spéculaire se déplacer verticalement de l'image du bord du bas vers le centre de l'ellipse.
 
note: l'éclairage diffus est comment pour ton matériau, je vois pas de code y référer ?

Reply

Marsh Posté le 31-01-2006 à 22:25:28    

m'est avis que le sgeg peut venir de ta position de lumière passée dans:
 
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
 
n'est pas celle qu'il faudrait par rapport a ce que tu penses passer.
 
(c'est une idée, pas sûr)
 
 
 

Reply

Marsh Posté le 31-01-2006 à 22:37:42    

glVertex3f(-light_position[0],-light_position[1],-light_position[2]);
 
le "-" ici c'est normal ?
j'ai du faire egalement le meme genre de chose pour dessiner les normales.

Reply

Marsh Posté le 31-01-2006 à 22:42:06    

pour le diffuse voila comment je fait

Code :
  1. float DiffuseMaterial [4]   = { 1.0, 0.0, 0.0, 1.0 };
  2. void SetLightColor(int color){
  3.           DiffuseMaterial[0]=GetRValue(color)/255.0;
  4.           DiffuseMaterial[1]=GetGValue(color)/255.0;           
  5.           DiffuseMaterial[2]=GetBValue(color)/255.0; 
  6.           glLightfv(GL_LIGHT0, GL_DIFFUSE, DiffuseMaterial);     
  7. }


ne fait l'objet 3d est compose de differentes parties qui ont un diffuse different...
bon je c c'est crade mais j'ai vu d'autre manière de faire sur le moment...

Reply

Marsh Posté le 31-01-2006 à 23:01:15    

pour ta couleur diffuse, je m'attends plus à un:
 
glMaterialf_(.....)
 
et avoir le spéculaire et diffus de la lumière à 1,1,1.
 
en gros c'est toujours:
propriété matériau * propriété_lumière * coefficient_issu_de_l'éclairage.
 
donc si tu veux un truc cohérent, ton traçage de modèle fixe toutes les propriétées des matériaux, et la boucle extérieure fixe une fois pour toute les propriétées de tes lumières.

Reply

Marsh Posté le 31-01-2006 à 23:05:24    

essayes une lumière directionnelle, en mettant le w à 0.

Reply

Marsh Posté le 31-01-2006 à 23:24:40    

ok merci pour t reponses
je vais toute de suite changer pour le material
 
j'ai l'impression que c'est le shininess qui perturbe tout

Reply

Marsh Posté le 01-02-2006 à 10:52:18    

effectivement si c'est bien l'exposant de l'éclairage spéculaire, 1.5 ça fait peut, il vaut mieux mettre entre 20 et 50 dans le doute. (enfin un truc assez grand pour que la tache de spéculaire soit petite ça évite les artéfacts dû à l'éclairage par vertex).
 
par contre je penses que le beans viens probablement de la position de la source de lumière.

Reply

Marsh Posté le 02-02-2006 à 18:02:18    

pour les lumiere cetait simplement le shininess un peu trop violent + la position de la lampe mal réglée (le 4 paremetre doit etre a zero dans mon cas)
 
---------
Autre probleme:
Pour ma super ellipse je fait comme ceci :
http://img132.imageshack.us/img132/3128/untitled8jw.th.jpg
 
voila les formules

Code :
  1. x=sign(sin(t))*sin(abs(t))^0.14*10;
  2. y=sign(cos(t))*cos(abs(t))^0.14*10;


 
en gros c juste x=sin(t)^2 et y=cos(t)^2 le "sign(cos(t))" servant a retablir le signe  :sarcastic:  
 
le seul probleme c'est que les points sont plus reparti sur les cotés que sur le centre :S c'est bien pour le modéle mais pour l'eclairage c'est pa trop ca
 
il faut donc que je fasse avancer "t" de maniere non lineaire en le fassant passer avant dans une fonction
 
et la je trouve pa :/
 
 
une autre solution serait de calculer la distance avec le point precedent et d'avancer tant que la distance est inferieure a une certaine valeur (mais ca reste vraiment bourrin)


Message édité par red faction le 02-02-2006 à 18:05:19
Reply

Marsh Posté le 02-02-2006 à 18:02:18   

Reply

Marsh Posté le 02-02-2006 à 19:22:20    

bourrin, mais si ça marche, surtout que c'est fait une fois pour toutes, c'est hors boucle de traçage.

Reply

Marsh Posté le 03-02-2006 à 12:11:04    

up

Reply

Marsh Posté le 09-02-2006 à 11:45:30    

[:yoyoz]

Reply

Marsh Posté le 09-02-2006 à 12:00:20    

la méthode bourrin me parait simple et pas mal, surtout si comme dit bjone c'est préca

Reply

Marsh Posté le 09-02-2006 à 14:35:38    

j'ai deja essaye cette methode, mais le probleme c qu'il faut que la valeur dincrementation entre 2 points soit vraiment tres petite... genre 0.00001 et ca, ca prend enormement de temps :S (de toute facon je skippe  qd mm des points, puisqu'il sont placés de maniere exponentielle)  
 
le calcul de la distance est loin detre leger mm sans sqrt
 
le code que j'utilise est base sur cette page :  
http://astronomy.swin.edu.au/~pbou [...] ellipsoid/
 
 
http://astronomy.swin.edu.au/~pbourke/opengl/superellipsoid/d.png
 
la, on voit clairement le fait que le centre et les cotés ne disposent pas d'assez de points (en tout cas pour un eclairage correct)


Message édité par red faction le 09-02-2006 à 14:38:28
Reply

Marsh Posté le 10-02-2006 à 11:31:25    

up

Reply

Sujets relatifs:

Leave a Replay

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