Sommaire Carte de Navigation Index Rechercher Nouveautés Archives Liens A Propos de LF
[Barre supérieure]
[Barre inférieure]
[Photo de l'Auteur]
Carlos Calzada
Quelques mots de l'auteur: Je suis étudiant en informatique (pour le moment), et j'ai toujours aimé le graphisme, ça remonte au Spectrum. Je suis également un fan de Linux et de tout ce qui n'est pas Micro$oft. Deux de mes passe-temps non-informatiques sont les bonsais et l'aquariophilie.

Ecrire à l'auteur

Contents:
Introduction
Prise en main de la caméra
Le Motion Blur
La profondeur de champ

Prise en main de la caméra

[Ilustration]

Abstract:

Dans ce deuxième article consacré à RenderMan nous aborderons la configuration et le positionnement de la caméra et nous examinerons certains des effets spéciaux que l'on peut obtenir. Bien que ce positionnement ne soit pas aussi intuitif qu'avec Pov-Ray, il s'avère avantageux pour décrire les déplacements de la caméra. Ce dernier sujet sera approfondi dans un troisième article.




Introduction

Dans ce deuxième article, nous explorons en détail le modèle de caméra proposé par RenderMan. La caméra est l'un des éléments les plus importants du moteur de rendu, et c'est lui qui permet de créer les effets les plus intéressants comme le Motion Blur (ce que l'obtient lorsque l'on prend une photo d'un objet en mouvement) et la profondeur de champ (focus). D'autres effets aurait pu ëtre réalisé avec la caméra, par exemple le Lens Flare (les reflets dûs à la lentille visibles sur les photos de sources de lumière), mais le modèle aurait été alors trop complexe. Pour réaliser ces autres effets, on utilise les propriétés des objets et le système perfectionné des shaders (il faut voir ici les shaders comme des outils qui génèrent les textures des objets). En utilisant des familles de shaders nous pouvons construire nos propres "shaders" et générer certains effets impressionnants. La méthode à suivre pour programmer et compiler ces shaders sera présentée dans un autre article, et c'est un sujet très vaste (très très vaste et pour l'instant je n'ai pas beaucoup d'idées, il faut que je le travaille).

Comme nous l'avons vu dans le premier article, pour calculer une image, on écrit :

rendrib fichero.rib
pour une sortie sur fichier or

rendrib -d fichero.rib
pour l'afficher à l'écran.

Prise en main de la caméra

Le système de coordonnées associé à la caméra est dit "de la main gauche" et coincide avec la surface du moniteur. L'origine est située au centre de l'écran et l'axe des x est dirigé vers la droite, les y vers le haut et les z vers l'intérieur du moniteur. Par défaut, le "système de coordonnées courant" est identique au système de coordonnées de la caméra, exactement comme illustré sur la première image (les x sont en rouge,les y en vert et les z en bleu). La première image montre une vue plongeante de la scène et la seconde est la véritable scène (Les sources de lumière ne sont pas placées à la même position dans les deux scènes pour des raisons de lisibilité). Même si la scène n'est pas particulièrement complexe (ça se voit à son absence de beauté), elle nous servira à comprendre les fichiers RIB d'examples sans les surcharger de modèles géométriques complexes.

Voyons ensuite comment choisir la position de la caméra. Ce qui paraît le plus logique, en particulier aux habitués de Pov-Ray, c'est de déplacer la caméra. Pour voir la scène de plus loin, nous voudrions translater la caméra à la position <0,0,-20>, ce qui revient à faire reculer la caméra. Avec RenderMan, cette translation est réalisée avec la commande Translate 0 0 -20 placée avant WorldBegin:

Et voilà que cette commande fait avancer la caméra ! En fait, ce n'est pas la caméra qui a été déplacée mais le système de coordonnées, tout le système de coordonnées a été translaté en arrière, laissant la caméra devant. Par conséquence, pour faire reculer la caméra, nous devons faire au contraire une translation faire l'avant en pensant que c'est le système de coordonnées et non la caméra que nous déplaçons (avec Translate 0 0 20):

Maintenant la caméra est exactement où nous voulions qu'elle soit. A partir de maintenant toutes les modifications de positionnement dans la scène se référera au système de coordonnées actuel. Dans l'exemple suivant le modèle reste à l'origine mais nous faisons tourner la caméra autour:

Regardons le fichier RIB qui contient les transformations géométriques appliquées à la caméra :

Display "camara_default2.tif" "file" "rgb"
Projection "perspective" "fov" 45
Format 320 240 1

LightSource "ambientlight" 1 "intensity" 
            0.3 "lightcolor" [1 1 1]
LightSource "distantlight" 2 "intensity" 
            1.0 "from" [10 10 -10] "to" [0 0 0]

Translate 0 0 20
Rotate 45 1 0 0
Rotate 135 0 1 0

WorldBegin
        Color 1 1 1
        # Background blanc
        Sphere 10000 -10000 10000 360 

        # Objets de la scene
        TransformBegin
                Color 1 0 0
                Sphere 3 -3 3 360
        TransformEnd
        TransformBegin
                Rotate -90 1 0 0
                Translate 0 0 2
                Cone 3 3 360
                Disk 0 3 360
        TransformEnd
        TransformBegin
                Rotate -90 0 1 0
                Cylinder 1 -4 4 360
                Disk 4 1 360
                Disk -4 1 360
        TransformEnd
WorldEnd

Il y a une translation (Translate 0 0 20) et deux rotations , une autour de l'axe des x (Rotate 45 1 0 0) et l'autre autour de l'axe des y (Rotate 135 0 1 0). L'ordre des opérations dans cet exemple apparaîtra peut-être embrouillant aux utilisateurs de Pov-Ray, car avec celui-ci les opérations sont appliquées dans l'ordre d'apparition, mais ce n'est pas le cas avec RenderMan. RenderMan stocke toutes les opérations en attendant de trouver un mot clé particulier (dans cet exemple : WorldBegin), et alors seulement les transformations sont appliquées à la scène. Ce système d'empilement des transformations a pour conséquence que les transformations sont appliquées dans l'ordre inverse d'apparition, ou plus simplement que la dernière transformation définie est appliquée en premier. Nous pouvons alors interpréter comme suit les opérations de notre exemple :

1. Etat initial
2. Rotation du système de coordonnées de 135 degrés autour de l'axe des y.
3. Rotation du système de coordonnées de 45 degrés autour de l'axe des x.
4. Translation du système de coordonnées courant de 20 unités le long de l'axe des z.

N'oubliez jamais que toutes les transformations du système de coordonnées courant (rotations et translations) sont toujours relatives à la caméra, ce qui signifie qu'une rotation autour de l'axe des x doit être compris comme une "rotation autour de l'axe x de la caméra".

Passons maintenant à la partie la plus intéressante de cet article, comment utiliser le modèle de caméra pour réaliser des effets spéciaux.

Motion blur (simulation d'objets en mouvement)

Le premier effet possible avec la caméra est le Motion blur, qui simule la trainée laissée sur un film par des objets en mouvement.

On active le Motion Blur en insérant une directive Shutter 0 1 dans la section de notre fichier d'exemple qui définit la caméra. La commande Shutter 0 1 simule le temps d'exposition, dans ce cas, l'ouverture du diaphragme a lieu à l'instant 0 pendant une unité de temps. Les paramètres 0 1 pour shutter sont quasi universels et nous utiliserons toujours ce paramètre car il n'indique qu'un comportement précis de la caméra de RenderMan.

Ensuite nous devons indiquer à RenderMan quels éléments de la scène sont en mouvement, ce que nous faisons en insérant la paire de tags MotionBegin MotionEnd. Les illustrations suivantes montrent un exemple (et le fichier RIB source) d'un balle se déplaçant de la position 0 10 5 à l'instant 0 vers 5 10 0 à l'instant 1. La directive MotionBegin [0 1] dans le fichier RIB spécifie exactement à Renderman quand ont lieu les transformations (l'instant 0 correspond à la première et l'instant 1 à la seconde) et les valeurs numériques doivent correspondre avec celles de la section Shutter. L'illustration montre que cet effet apparait assez réaliste et cette impression est encore meilleure pour une animation.

Bien sûr, les transformations insérées entre MotionBegin et MotionEnd ne sont pas forcément des translations. RenderMan peut calculer des trajectoires non linéeaires pour le Motion Blur. L'exmple suivant montre une rotation de 25 degrés autour de l'axe des y du système de coordonnées.

En général seuls les objets de la scène bougent. Renderman permet également de déplacer la caméra elle-même, et alors l'effet de Motion Blur pourra également être appliqué à la caméra. Dans cet exemple nous déplacerons la caméra de 5 unités sur la droite (c'est à dire déplacer le système de coordonnées de 5 unités vers la droite), et tous les objets de la scène deviendront flou. Bien sûr la paire de tags MotionBegin MotionEnd doit être placée dans le fichier RIB dans la section consacrée à la caméra.

Profondeur de champ (mise au point)

Pour finir, passons à un autre effet intéressant offert par RenderMan, la profondeur de champ ("Depth of Field") ou mécanisme de mise au point (focus). La directive utilisée pour activer cette fonctionnalité est DepthOfField. Cette commande prend trois paramètres : f-stop, fov (field of view) and focus-lenght (distance focale). Le premier paramètre, f-stop, définit la distance limite pour la mise au point, dans notre exemple, un objet situé à 2 unités ou moins de la caméra apparaitra uniformément hors du champ. Le paramètre fov est en général laissé à la valeur 1.0 si la perspective a été préalablement définie avec Projection "perspective" "fov" 45 (comme dans notre exemple), en changeant la valeur on ne fait que multiplier le paramètre fov de la directive perspective. Enfin, focus-lenght est le paramètre qui nous intéresse ici, il définit la distance à partir de laquelle les objets apparaissent comme étant hors du champ de mise au point. Dans l'example suivant, la caméra est à l'origine et les trois balles à distance de 10, 20, 30 unités. Nous allons calculer plusieurs images avec différentes valeurs du paramètre focus-lenght.

Pour la première image, on a utilisé DepthOfField 2.0 1.0 10, ce qui signifie que tous les objets situés à plus de 10 unités de la caméra seront hors champ.

Dans le second cas, on entre DepthOfField 2.0 1.0 20. Maintenant la sphère verte, située à 20 unités de la caméra, entre dans le champ de mise au point.

Enfin pour que la dernière sphère (à 30 unités de la caméra) soit nette, il faut indiquer DepthOfField 2.0 1.0 30:

Les effets réalisés permettent de générer des images plus réalistes. Bien sûr, les temsp de calculs requis s'accroissent car Motion Blur et Profondeur de champ nécessitent plusieurs passes supplémentaires dans le moteur de rendu.

Traduit par Cyril M. Hansen


Site web maintenu par Miguel Ángel Sepúlveda
© Carlos Calzada 1998
LinuxFocus 1998