[RESOLU] pluton
Moderator: Franck
Bonjour,
Lorsque l'on augmente la valeur du zoom pour faire apparaître le disque de pluton dans le mode planétarium de winstars, le zoom est alors d'environ 100000 x !
Pour afficher des objets 3d sur votre écran, Directx construit une matrice de projection unique qui comme son nom l'indique projette les sommets des objets 3d (sommets définis par leur coordonnées dans l'espace x,y,z) sur la surface 2D du moniteur...
Cette matrice est définie comme ceci :
où h = cos( angle de vue/2) / sin( angle de vue /2)
w = h/ (rapport d'aspect)
zn= distance du plan proche
zf= distance du plan lointain
(Et oui, ce ne sont pas des matrices 3x3 que l'on utilise sous directx mais 4x4. Cela permet d'éviter des anomalies comme le "gimbal lock" qui perturbait le fonctionnement des premiers jeux vidéos en 3D et qui rendait impossible certains mouvements de rotation...
On pourrait se contenter de matrices 3x3 pour faire ce travail mais à condition d'introduire les nombres complexes. Malheureusement, les ordinateurs ne sont pas capables d'évaluer rapidement des expressions mélangeant nombres réels et complexes...)
Sans entrer dans les détails de la programmation 3D, on ne va s'intéresser qu'à la quantité 2*zn/h (c'est cette valeur qui pose problème ici)
lorsque le zoom est de 100000x, l'angle de vue est approximativement de 0.000008° soit 1,4 *10 ^-7 radian
Avec la valeur de notre zoom, 2*zn/h vaut alors 1e-11
Les valeurs 2*zn/w, zf/(zf-zn) et zn*zf/(zn*zf) sont quand à elles bien plus grandes (j'ai pas fait les calculs...).
C'est cette différence de grandeur entre les éléments de la matrice qui pose problème. Lorsque l'on multiplie un vecteur avec une matrice, on est amené à multiplier des nombres en eux mais aussi à additionner les résultats intermédiaires...
et cette matrice va amener notre ordinateur à additionner des nombres très grands avec des nombres si petits que le résultat sera entaché d'erreurs d'approximations...
L'ordinateur ne peut pas prendre en compte toutes les décimales d'un nombre réel pour évaluer une opération arithmétique . Il est amené à "tronquer" les nombres pour aller plus vite. Dans notre cas, les calculs de projection sont réalisés par le chip de la la carte graphique qui ne fonctionne qu'en simple précision (en ne tenant compte que de 8 chiffres significatifs)
Aussi, lorsque dans le calcul d'une projection, le processeur graphique calcule le produit du centre de pluton (un vecteur) par la matrice de projection, il tombe sur des calculs du type :
212146545.154654 + 0.00000000000000054645454, le deuxième nombre sera tronqué à 8 décimales après la virgule pour donner la valeur 0.000000000 !!!
La somme deviendra donc 212146545.154654 + 0.0 et donnera le chiffre de départ 212146545.154654. On peut considérer le résultat juste mais l'erreur deviendra plus significative si l'opération est réalisée de nombreuses fois !
Ces erreurs en s'accumulant et en s'amplifiant mutuellement vont augmenter la marge d'erreur et l'on verra alors Pluton zigzaguer sur l'écran lorsque le zoom est trop fort (la position x,y du centre de pluton sur l'écran sera alors trop approximative)...
Il faut préciser que dans la réalité aucun instrument optique n'est capable d'observer un corps céleste avec un grossissement si important. C'est pour cette raison que l'on n'a aucune image de la surface de Pluton ...
La seule façon d'en savoir plus sur cette planète est d' envoyer une sonde (et justement, les américains viennent de lancer leur mission New Horizons) pour prendre quelques clichés de près...
Franck
Lorsque l'on augmente la valeur du zoom pour faire apparaître le disque de pluton dans le mode planétarium de winstars, le zoom est alors d'environ 100000 x !
Pour afficher des objets 3d sur votre écran, Directx construit une matrice de projection unique qui comme son nom l'indique projette les sommets des objets 3d (sommets définis par leur coordonnées dans l'espace x,y,z) sur la surface 2D du moniteur...
Cette matrice est définie comme ceci :
Code: Select all
( 2*zn/w 0 0 0 )
( 0 2*zn/h 0 0 )
( 0 0 zf/(zf-zn) 1 )
( 0 0 zn*zf/(zn*zf) 0 )
w = h/ (rapport d'aspect)
zn= distance du plan proche
zf= distance du plan lointain
(Et oui, ce ne sont pas des matrices 3x3 que l'on utilise sous directx mais 4x4. Cela permet d'éviter des anomalies comme le "gimbal lock" qui perturbait le fonctionnement des premiers jeux vidéos en 3D et qui rendait impossible certains mouvements de rotation...
On pourrait se contenter de matrices 3x3 pour faire ce travail mais à condition d'introduire les nombres complexes. Malheureusement, les ordinateurs ne sont pas capables d'évaluer rapidement des expressions mélangeant nombres réels et complexes...)
Sans entrer dans les détails de la programmation 3D, on ne va s'intéresser qu'à la quantité 2*zn/h (c'est cette valeur qui pose problème ici)
lorsque le zoom est de 100000x, l'angle de vue est approximativement de 0.000008° soit 1,4 *10 ^-7 radian
Avec la valeur de notre zoom, 2*zn/h vaut alors 1e-11
Les valeurs 2*zn/w, zf/(zf-zn) et zn*zf/(zn*zf) sont quand à elles bien plus grandes (j'ai pas fait les calculs...).
C'est cette différence de grandeur entre les éléments de la matrice qui pose problème. Lorsque l'on multiplie un vecteur avec une matrice, on est amené à multiplier des nombres en eux mais aussi à additionner les résultats intermédiaires...
et cette matrice va amener notre ordinateur à additionner des nombres très grands avec des nombres si petits que le résultat sera entaché d'erreurs d'approximations...
L'ordinateur ne peut pas prendre en compte toutes les décimales d'un nombre réel pour évaluer une opération arithmétique . Il est amené à "tronquer" les nombres pour aller plus vite. Dans notre cas, les calculs de projection sont réalisés par le chip de la la carte graphique qui ne fonctionne qu'en simple précision (en ne tenant compte que de 8 chiffres significatifs)
Aussi, lorsque dans le calcul d'une projection, le processeur graphique calcule le produit du centre de pluton (un vecteur) par la matrice de projection, il tombe sur des calculs du type :
212146545.154654 + 0.00000000000000054645454, le deuxième nombre sera tronqué à 8 décimales après la virgule pour donner la valeur 0.000000000 !!!
La somme deviendra donc 212146545.154654 + 0.0 et donnera le chiffre de départ 212146545.154654. On peut considérer le résultat juste mais l'erreur deviendra plus significative si l'opération est réalisée de nombreuses fois !
Ces erreurs en s'accumulant et en s'amplifiant mutuellement vont augmenter la marge d'erreur et l'on verra alors Pluton zigzaguer sur l'écran lorsque le zoom est trop fort (la position x,y du centre de pluton sur l'écran sera alors trop approximative)...
Il faut préciser que dans la réalité aucun instrument optique n'est capable d'observer un corps céleste avec un grossissement si important. C'est pour cette raison que l'on n'a aucune image de la surface de Pluton ...
La seule façon d'en savoir plus sur cette planète est d' envoyer une sonde (et justement, les américains viennent de lancer leur mission New Horizons) pour prendre quelques clichés de près...
Franck
Last edited by Franck on 24 Mar 2006, 16:25, edited 1 time in total.