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

 


Dernière réponse
Sujet : [OpenGL] Normales
darkoli voici un exemple en c qui marche :
 
pour faire une surface toute lissée (genre une sphere), il faut faire la moyenne des normales. normalement il y a une normale par face mais la on en calcul une pour chaque point. c'est la somme des normales des faces ou se trouve le point (en gros).
 
// -----------------------------------------------------------------------------
void Calcul_Normale(double* a,double* b,double* c,double* n) {
 // paramètre : trois points a,b et c (tableau de 3 valeurs)
 // les point sont donnés dans l'ordre anti-horaire, si c'est  
 // pas le bon sens, ben il faut inverser les points
  double v[3],w[3];
  double lng=0;
 
  v[0]=c[0]-a[0];
  v[1]=c[1]-a[1];
  v[2]=c[2]-a[2];
  w[0]=b[0]-a[0];
  w[1]=b[1]-a[1];
  w[2]=b[2]-a[2];
 
  n[0]=v[1]*w[2] - w[1]*v[2];
  n[1]=v[2]*w[0] - w[2]*v[0];
  n[2]=v[0]*w[1] - w[0]*v[1];
  lng=sqrt((n[0]*n[0])+(n[1]*n[1])+(n[2]*n[2]));
  if (lng>0) {
    lng=1/lng;
    n[0]=n[0]*lng;
    n[1]=n[1]*lng;
    n[2]=n[2]*lng;
    }}
//------------------------------------------------------------------------------

Votre réponse
Nom d'utilisateur    Pour poster, vous devez être inscrit sur ce forum .... si ce n'est pas le cas, cliquez ici !
Le ton de votre message                        
                       
Votre réponse


[b][i][u][strike][spoiler][fixed][cpp][url][email][img][*]   
 
   [quote]
 

Options

 
Vous avez perdu votre mot de passe ?


Vue Rapide de la discussion
darkoli voici un exemple en c qui marche :
 
pour faire une surface toute lissée (genre une sphere), il faut faire la moyenne des normales. normalement il y a une normale par face mais la on en calcul une pour chaque point. c'est la somme des normales des faces ou se trouve le point (en gros).
 
// -----------------------------------------------------------------------------
void Calcul_Normale(double* a,double* b,double* c,double* n) {
 // paramètre : trois points a,b et c (tableau de 3 valeurs)
 // les point sont donnés dans l'ordre anti-horaire, si c'est  
 // pas le bon sens, ben il faut inverser les points
  double v[3],w[3];
  double lng=0;
 
  v[0]=c[0]-a[0];
  v[1]=c[1]-a[1];
  v[2]=c[2]-a[2];
  w[0]=b[0]-a[0];
  w[1]=b[1]-a[1];
  w[2]=b[2]-a[2];
 
  n[0]=v[1]*w[2] - w[1]*v[2];
  n[1]=v[2]*w[0] - w[2]*v[0];
  n[2]=v[0]*w[1] - w[0]*v[1];
  lng=sqrt((n[0]*n[0])+(n[1]*n[1])+(n[2]*n[2]));
  if (lng>0) {
    lng=1/lng;
    n[0]=n[0]*lng;
    n[1]=n[1]*lng;
    n[2]=n[2]*lng;
    }}
//------------------------------------------------------------------------------
verdoux Oui en 1ère ou en même en terminale, on voit pas les maths utiles pour la 3D (espaces vectoriels normés, matrices).

 

[edit]--Message édité par Verdoux--[/edit]

z51 La normale d'un triangle se calcule par le produit vectoriel AB^AC par exemple où A, B et C sont les 3 sommets.
Si AB(x, y, z) et AC(x', y', z' ) alors  
AB^AC = (yz'-y'z, zx'-z'x, xy'-x'y)
En général la normale est normée.
 
Le calcul des lumières nécessite de connaître les normales aux sommets et non aux triangles. Pour les obtenir, il suffit de moyenner les normales des triangles auxquels le sommet appartient.
 
Maintenant il est inutile d'effectuer les calculs à chaque trame, il suffit juste de transformer les normales comme les autres sommets de l'objet.

 

[edit]--Message édité par z51--[/edit]

Alload Ben j'suis qu'en 1ère. On a pas du tout fait les produits vectoriels.
chadenat Pour une sphère Verdoux a raison il faut dire que les normales passent par le centre....
 
Sinon pour le produit vectoriel regarde dans un livre de math...
Alload chadenat > c'est quoi un produit vectoriel? :)
 
Verdoux > donc si je comprends bien, si j'utilise glBegin (GL_TRIANGLES) ou glBegin (GL_QUADS) ça ne sert à rien de préciser en plus les normales?
verdoux Pour un cube ou une pyramide, préciser les normales est inutile puisque ce sont des objets facettés.
 
Par contre si tu veux dessiner une sphère (ou une surface "douce" ) avec un ensemble de polygones, les normales ne doivent  plus êtres celles des polygones pour un meilleur rendu.
chadenat tu calcules la normale d'un triangle.Tu as les 3 sommets du triangle donc tu peux obtenir la normal du triangle en faisant un produit vectoriel.
Alload C'est bien beau les normales indispensables pour que les lumières soient bien rendues, mais comment les calculer rapidement?
 
J'arrive facilement à trouver leurs coordonnées quand je travaille avec un cube, mais comment trouver les coordonnés pour une pyramide par exemple? Ou pour tout autre objet dont les cotés ne sont pas parallèles à un des axes du repère?

Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)