Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3058 connectés 

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1295882
red factio​n
Posté le 31-01-2006 à 20:39:18  profilanswer
 

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
mood
Publicité
Posté le 31-01-2006 à 20:39:18  profilanswer
 

n°1295970
bjone
Insert booze to continue
Posté le 31-01-2006 à 22:21:04  profilanswer
 

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 ?

n°1295973
bjone
Insert booze to continue
Posté le 31-01-2006 à 22:25:28  profilanswer
 

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)
 
 
 

n°1295989
red factio​n
Posté le 31-01-2006 à 22:37:42  profilanswer
 

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.

n°1295993
red factio​n
Posté le 31-01-2006 à 22:42:06  profilanswer
 

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...

n°1296008
bjone
Insert booze to continue
Posté le 31-01-2006 à 23:01:15  profilanswer
 

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.

n°1296011
bjone
Insert booze to continue
Posté le 31-01-2006 à 23:05:24  profilanswer
 

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

n°1296023
red factio​n
Posté le 31-01-2006 à 23:24:40  profilanswer
 

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

n°1296181
bjone
Insert booze to continue
Posté le 01-02-2006 à 10:52:18  profilanswer
 

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.

n°1297669
red factio​n
Posté le 02-02-2006 à 18:02:18  profilanswer
 

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
mood
Publicité
Posté le 02-02-2006 à 18:02:18  profilanswer
 

n°1297751
bjone
Insert booze to continue
Posté le 02-02-2006 à 19:22:20  profilanswer
 

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

n°1298449
red factio​n
Posté le 03-02-2006 à 12:11:04  profilanswer
 

up

n°1301925
red factio​n
Posté le 09-02-2006 à 11:45:30  profilanswer
 

[:yoyoz]

n°1301933
chrisbk
-
Posté le 09-02-2006 à 12:00:20  profilanswer
 

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

n°1302079
red factio​n
Posté le 09-02-2006 à 14:35:38  profilanswer
 

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
n°1302749
red factio​n
Posté le 10-02-2006 à 11:31:25  profilanswer
 

up


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
problème variables de session sur site freeprobleme lien audio
problème de chemin ?Probleme avec jdk et Jedit
probleme formulaire de contact "bouton envoyer"probleme eclipse (+plugin SOA, worflow pi4soa)
[ORACLE] petit problème avec les procédures..[ problème avec la librairie gd ] transparence et miniatures
problème avec la fonction onBlurfonction Timer vide, problème ???
Plus de sujets relatifs à : Opengl - Light &Normales+ [edit] probleme de math


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR