écran cylindrique companime
modification du logiciel POVray


Modifications apportées à PovRay 3.5 pour introduire une caméra spécifique.

C'est la version 3.5 qui a été utilisée pour les essais car elle est facile à compiler lorsqu'on dispose déja de Visual 6, alors que la version suivante nécessite l'installation d'un nouvel environnement.
Les modifications sont mineures et consistent uniquement en l'ajout d'une caméra que j'ai appelée COMPANIME. Elle est analogue à la caméra OMNIMAX
La version modifiée s'appelle povcompa.
Le module exécutable est disponible ici.
Quelques exemples test sont ici.
Je maîtrise encore très mal POVray. Ces exemples n'ont donc qu'un objectif : vérifier que la perspective est correctement traitée (au cours du calcul de l'image et lors de la reconstitution sur l'écran).

Voici le source des modifications (aussi disponible avec les exemples):
pvengine.c(110):

#define CLASSNAMEPREFIX "Companime35"
parse.cpp(1199):

	 CASE
		(COMPANIME_TOKEN)New->Type = COMPANIME_CAMERA;
	END_CASE

parse.cpp(1335):

	 case
		COMPANIME_CAMERA:
			EXPECT CASE
				(ANGLE_TOKEN)New->Angle = Parse_Float();
				if (New->Angle<  0.0)
					Error("Negative viewing angle.");
			END_CASE

			CASE5(PERSPECTIVE_TOKEN, ORTHOGRAPHIC_TOKEN, FISHEYE_TOKEN, ULTRA_WIDE_ANGLE_TOKEN, PANORAMIC_TOKEN)
			CASE2(SPHERICAL_TOKEN, CYLINDER_TOKEN)
				Expectation_Error("companime camera modifier");
			END_CASE

			OTHERWISE
				UNGET
				if(Parse_Camera_Mods(New) == false)
				   EXIT
			END_CASE
		END_EXPECT
		break;
parse.cpp(1572):

	 CASE
		(COMPANIME_TOKEN)New->Type = COMPANIME_CAMERA;
	END_CASE
render.cpp(2988):

    /*
     * Companime camera.	ajouté par companime 15 decembre 2004  
     */

    case COMPANIME_CAMERA:								//companime																	
																	
      /* Convert the x coordinate to be a DBL from -0.5 to 0.5. */
      x0 = x / (DBL)Frame.Screen_Width - 0.5;

      /* Convert the y coordinate to be a DBL from -0.5 to 0.5. */

//=====================================================================================================
      y0 = ((DBL)Frame.Screen_Height*0.5 - 1.0 - y) / (DBL)Frame.Screen_Width *1.3333;
#define of  160.0
  double k2, w, zn, t2;

    w=0.5;  
	t2=
	x0*x0/(w*w);if(t2>1.0) t2=1.0;
	zn = 600.0/(4.0+sqrt(1.0-t2));

    k2 = 0.4 * zn/(of-zn);
	x0*=k2;
	y0*=k2;
#undef of    

//=====================================================================================================
       /* Create primary ray.

      */VLinComb3(Ray->Direction, 1.0, FCD, x0, FCR, y0, FCU);

      /* Do focal blurring (by Dan Farmer). */

      if (Focal_Blur_Is_Used)
      {
        jitter_camera_ray(Ray, ray_number);
        initialize_ray_container_state(Ray, true);
      }
      else
      {
        initialize_ray_container_state(Ray, Precompute_Camera_Constants);
        Precompute_Camera_Constants = false;
      }

    break;										//companime fin
tokenize.cpp(467):

 {COMPANIME_TOKEN, "companime"},	//---- ajout Companime

Fin des modifs.

Réalisation pratique ->
Logiciels adaptés ->
<- Accueil Immersion