normalisation d'un vecteur et epsilon value in raytracing - C++ - Programmation
Marsh Posté le 07-11-2004 à 20:46:30
Le format IEEE des floats n'est qu'approximatif. Il introduit donc des erreurs de calcul qui, bien que faibles, peuvent s'accumuler dans un calcul itératif. De même du fait de ces erreurs, on peut difficilement tester une égalité parfaite en calcul flotant.
La normalisation d'un vecteur est nécessaire à chaque fois que t'as besoin d'un vecteur de longueur 1, typiquement dans un calcul d'éclairage (phong par ex.).
Marsh Posté le 07-11-2004 à 21:15:54
la valeur epsilon sert à rendre le calcul plus juste,plus precis???
Pourquoi dans un calcul d'eclairage a t on besoin d'un vecteur de longueur 1???
Marsh Posté le 07-11-2004 à 22:01:35
jfken2000 a écrit : la valeur epsilon sert à rendre le calcul plus juste,plus precis??? |
Elle sert à compenser le manque d'imprécision dont parle Panini. Une opération comme 10.21 - 10.2 donne 0.0100000000000016, pas 0.01. Tester si le résultat est dans un certain domaine [résultat-epsilon, résultat+epsilon] teste si le nombre est environ 0.01 et règle le problème.
jfken2000 a écrit : Pourquoi dans un calcul d'eclairage a t on besoin d'un vecteur de longueur 1??? |
On n'en a pas forcément besoin, c'est plus simple et plus rapide de l'écrire ainsi. Prends un produit scalaire v1*v2/(norme(v1)*norme(v2)), éclaire un point avec multiples lumières. C'est le même calcul avec des valeurs différentes. La normale de l'objet est constante, la normaliser gicle le calcul de norme dans l'éclairage et l'accélère.
Marsh Posté le 09-11-2004 à 01:48:35
jfken2000 a écrit : la valeur epsilon sert à rendre le calcul plus juste,plus precis??? |
Non, tu ne peux pas regagner la précision que tu as perdu.
Il s'agit avant tout de robustesse.
Sur ta feuille de papier tu fais des calculs exacts tels
que a + b - b == a.
Sur ton ordinateur ce n'est pas le cas. Dans le cas où tu as déterminé que la valeur exacte du résultat importe moins que le fait que a == a, alors il faut utiliser un epsilon ou valeur d'erreur acceptable dans ton calcul d'égalité (a <= a+e && a >= a-e). En faisant ça tu perds de la précision ! donc si b est plus petit que epsilon ça n'a aucun sens et il faut que tu fasses tes calculs autrement (changer l'algorithme ou l'ordre des calculs ou la limite de la précision de tes flottants).
jfken2000 a écrit : Pourquoi dans un calcul d'eclairage a t on besoin d'un vecteur de longueur 1??? |
Il ne s'agit pas de n'importe quel vecteur. Il s'agit de la normale à la surface qui est une représentation symbolique de l'orientation de ta surface. Cette normale n'a pas d'unité (la valeur de l'éclairement en un point ne varie pas en fonction de la taille de la surface élémentaire utilisée pour faire le calcul en ce point). On lui donne donc une norme de valeur arbitraire de 1 qui servira de référence dans tous les calculs d'illumination faisant intervenir cette normale.
L'avantage de 1 c'est que si l'intensité lumineuse est L, le coefficient
de diffusion est d (modèle de Lambert), alors l'illumination maximale du vecteur lumière d'intensité L, est simplement L*d.
Marsh Posté le 10-11-2004 à 23:02:30
Euh, la norme de 1 n'est pas arbitraire puisqu'il nous faut le cosinus de l'angle formé entre la normale et la lumière inscidante.
Marsh Posté le 07-11-2004 à 20:09:06
1)à quoi sert la normalisation d'un vecteur dans le raytracing?
2)à quoi sert la valeur epsilon toujours dans le raytracing?