Les photographies de l'imaginaire...

Texture d'étalonnage

Le 28 Février 2005 à 23:39

Objectif

La macro setupMetricTextureKit

Cette macro définit un certain nombre de textures permettant de se visualiser les dimensions d'un objet. On considère qu'une unité équivaut à 1 mètre.

Si l'objet est déformé, la texture sera aussi déformée, il faudra tenir compte de cet effet.

Paramètres

baseTexture
Texture de base, par dessus laquelle on ajoute notre quadrillage.
backgroundColor
Couleur de fond, utilisée pour le calcul de la couleur du quadrillage 0.1 et 0.2
rulerColor
Couleur du quadrillage, utilisée pour le calcul de la couleur du quadrillage 1, 0.1 et 0.2
rulerWidth
Largeur du trait, en mm

Image de test

Test des textures métriques

Téléchargement

L'archive (MetricTextures.zip) contient tout le nécessaire pour générer l'image de test.

Résumé

Méthode pour créer une planète avec les patterns standards et les isosurfaces

Raisonnement

L'idée de base est la suivante : on peut utiliset les patterns standards de POVRay pour générer des terrains (heightfields par exemple), alors pourquoi ne pas faire la meme chose pour générer une planète ? On voudrait donc partir d'une sphère, et pour point de la sphère est éloigné du centre en fonction de la valeur donnée par une texture appliquée sur la sphère. Comme il n'y a pas de primitive pour ce la, on utilisera les isosurfaces

Equation de la sphère

On rappelle que l'équation d'une sphère est : x2+y2+z2=R2, avec R > 0 le rayon de la sphère. Pour simplifier, on prendra R = 1

Valeur du motif sur la sphère de rayon 1

Soit f la fonction représentant le pattern. Posons r = sqrt(x2+y2+z2) la distance d'un point M(x,y,z) à l'origine. Alors la valeur du pattern sur la sphère est f(x/r,y/r,z/r)

Equation de la planète

Soit 0 < a < 1 un coefficient utilisé pour combiner la sphère et le pattern. L'équation de la planète est alors : x2+y2+z2=a × R2 + (1 − a) × f(x/r,y/r,z/r)

Exemple

Extrait de code

#declare f_pattern = function{pattern{crackle form <1,0,0> poly_wave 2 turbulence 0.5 scale 0.5}}
#declare f_planete = function(x,y,z,r){x*x + y*y + z*z -(0.91 + 0.08 * f_pattern(x/r,y/r,z/r))}
#declare f_isosurface = function {f_planete(x,y,z,sqrt(x*x+y*y+z*z))}

isosurface {
    function { f_isosurface(x,y,z) }
    contained_by {sphere{0,1}}
    max_gradient 2.6

    //...etc...
}

Résultat

résultat obtenu avec l'extrait de code précédent

Réglage d'une caméra "réaliste"

Le 28 Février 2005 à 23:34

Objectif

On veut régler les paramètres d'une caméra pour simuler la géométrie d'un véritable appareil photo ou d'une caméra de cinéma.

Rappel sur le modèle suivi par la directive camera

Dans Povray, la directive camera définit une pyramide à base rectangulaire. Le sommet est l'origine des rayons qui sont lancés, et le pixel résultant pour le lancé d'un rayon est projeté sur la base.

Mise en oeuvre

Pour simuler un appareil photo ou une caméra, on va dimensionner la pyramide pour correspondre à la surface de la pellicule (pour la base de la pyramide). La hauteur de la pyramide correspondra à la distance focale.

A noter

Pour une largeur de 36mm, une distance focale d'environ 60mm reproduit la vision humaine. J'ai obtenu cette valeur en regardant dans le viseur d'un appareil photo Reflex et en laissant le deuxième oeil ouvert, jusqu'à ce l'image dans le viseur aie le même aspect que pour l'oeil libre.

Paramètres

focale
Distance en mm entre le centre optique et la "pellicule".
film
Largeur en mm de la "pellicule"
format
Rapport largeur/hauteur de la pellicule (p.ex. 16/9, 4/3, 3/2, etc...)

Exemple d'utilisation

#include "realcamera.inc"

//etc...

camera
{
    location  <.6 , 1.7 ,.1>
    setupRealCamera(60, 22, image_width/image_height)
    look_at   <2 , 1.0 , 2.5>
}

Code Source

//utiliser dans une camera, avant look_at
//focale : distance en mm du centre optique à la pellicule
//film : largeur en mm de la pellicule
//format : rapport largeur/hauteur de l'image (ex : 16/9, 4/3, 3/2)
#macro setupRealCamera(focale, film, format)
    #local myFocale = focale / 1000 ;
    #local myRight = film / 1000 ;
    #local myUp = myRight / format ;

    direction     myFocale        * z
    up            myUp            * y
    right         myRight         * x  
#end

Les photographies de l'imaginaire...