Correctifs pour POVRay

Section POV

Section POV - sous section correction

Blob

Dans le cas de rotation(s) (rotate) combinées avec des dilatation(s) (scale) non-uniformes (style scale 2*x+y/2+z) sur un élément d'un blob, il arrive que le calcul d'une sphère d'optimisation se trompe.

illustration
Avant la correctionAprès la correction
Le bug initial, tel que soumis par Tor Olav Kristensen.
Ce n'est pas un bug qui a l'air de dépendre de la position de la caméra.
Par contre, en supprimant toutes les transformations, il disparaît.
Et sa disparition n'a pas l'aire de dépendre de la position de la caméra.
La suppression de la rotation sur le blob cyan supprime le bug.
Le déplacement des transformations de l'élément vers le blob entier supprime le bug.
le bug se déplace avec les variations de scale. Ça ressemble à un problème d'optimisation.
La forme de la manifestation du bug est très circulaire.
Le correctif est le suivant:


--- blob.c.old	Thu Sep  7 18:41:28 2000
+++ blob.c	Thu Sep  7 18:44:55 2000
@@ -2468,7 +2468,8 @@
 static void get_element_bounding_sphere(BLOB_ELEMENT *Element, VECTOR Center, DBL *Radius2)
 {
   DBL r, r2 = 0.0;
-  VECTOR C, H;
+  VECTOR C;
+  BBOX local_BBox;
 
   switch (Element->Type)
   {
@@ -2514,12 +2515,10 @@
 
     MTransPoint(C, C, Element->Trans);
 
-    Make_Vector(H, r, r, r);
-
-    MTransDirection(H, H, Element->Trans);
-
-    r = max(max(fabs(H[X]), fabs(H[Y])), fabs(H[Z]));
-
+    Make_BBox(local_BBox ,0,0,0,r,r,r);
+    Recompute_BBox(&local_BBox, Element->Trans);
+    r= max(max(fabs(local_BBox.Lengths[X]),fabs(local_BBox.Lengths[Y])),
+               fabs(local_BBox.Lengths[Z]));
     r2 = Sqr(r) + EPSILON;
   }
 

Explications: dans la fonction get_element_bounding_sphere de blob.c, lorsqu'il y a des transformations sur un élément

  1. Il y a création d'un vecteur (la boule magenta) supposé être une boite (en cyan) contenant la sphère d'optimisation (la boule grisâtre).
  2. Puis on applique les transformations au vecteur (boite jaune, tâche magenta)
  3. l'erreur était de considérer que la plus grande coordonnées du vecteur pouvait être le rayon d'une sphère contenant au moins la même chose qu'au début suite aux transformation (la boule grisâtre est devenue l'ellipsoïde grisâtre).
La correction consiste à faire les calculs sur une Bounding box au lieu d'un vecteur.
Section POV

Section POV - sous section correction