Version en ligne

Tutoriel : POV-Ray

Table des matières

POV-Ray
Introduction à POV-Ray
Rendeur ? Modeleur ? Kesako ? :-S
Persistence Of Vision Raytracer
Installation et Découverte...
Lientographies...
Les bases de POV-ray
Le langage POV-Ray
L'espace...
Les vecteurs
Les couleurs
L'échelle
Petits trucs
Ma première scène ! (1/2)
Les essentiels
Premier objet : un sol
Deuxième objet : une boîte
Troisième objet : la sphère
Ma première scène ! (2/2)
Un cylindre...
...et un cône.
Et enfin un anneau
TP : une tour du futur...
Objectifs du TP
Correction du TP
Conclusion
Les transformations d'objets
Translate
Rotate
Scale (1/2)
Scale (2/2)
Les associations d'objets
Association - CSG...
Union
Différence
Intersection
Fusion
La puissance de pigment
La nature cachée de pigment...
rgb, rgbf, rgbt, rgbft...
Les motifs
Liste des motifs
Les motifs à liste
Les motifs à color_map (1/2)
Les motifs à color_map (2/2)
Jouer avec les motifs
Des modifications simples...
Warp (1/2)
Warp (2/2)
Les formes d'onde
Modificateurs usuels
Les textures
Comprendre la texture
Finish
Normal
Indice de réfraction...
Quand on mélange tout ça...
Des pigments de pigments ?
C'est toi le motif !
Un peu de 2D
De la 2D ?
Le disque
Le polygone
Le triangle
Formes avancées (1/2)
Le mesh
Le SuperEllipsoide
Du texte
Le height_field
Le blob
Formes avancées (2/2)
Les prismes
Les lathe
Les sphere_sweep
TP : Un vase
Présentation
Indices...
Correction
La ligne de commande
Ligne de commande ?
Taille de l'image
Autres options
Tout dans un fichier
Les variables
Présentation
Définir une variable
Utiliser ses variables
Re-définir une variable
Attention !
Commentaires
Les inclusions
Qu'est-ce que c'est ?
Inclure un fichier
Utiliser les inclusions
Inclure ses propres fichiers
Conditions et boucles
Condition
Boucles
TP : Une météorite
Présentation
Indices...
Réalisation
Animez-vous !
Le principe
Les options
Utilisation
Les macros
A quoi ça sert ?
Macros de calcul
Macros d'objets
Global_settings
Présentation
Ambient_Light
Max_trace_level
ADC_Bailout
Charset
Les isosurfaces (1/2)
Iso-quoi ?
Une fonction et un seuil.
Le contenant et le contenu
Une histoire de précision
Sortir la fonction
Des intersections
Les isosurfaces (2/2)
Pigment ?
Une fonction pigment ?
Combinaison !
Application
Lumière sur...
Encore un illuminé...
Angle ? Distance ?
Dans la pénombre tu sombreras
Sous les feux des projecteurs
Extra
Les médias (1/2)
Chers téléspectateurs, bonsoir...
Emission, absorption
Un peu par ci, un peu par là...
Répartition avancée
Les médias (2/2)
De la couleur
Car tu es poussière...
De la précision !

POV-Ray

Vous avez adoré Monstres & Cie, Shrek ou Final Fantasy ?... :lol:
Vous avez toujours voulu créer vos propres images de synthèse ? Mais vous ne voulez pas dépenser un rond pour ça ?... :euh:

Pas de problème !

Je vous présente POV-Ray, l'un des meilleurs moteur de rendu 3D entièrement gratuit... ;)

Introduction à POV-Ray

Rendeur ? Modeleur ? Kesako ? :-S

POV-Ray est, comme je vous l'ai dit, un Rendeur de scène, et non un Modeleur (comme l'excellent Blender, par exemple).
Qu'est-ce que ça veut dire ? Vous n'avez qu'a lire ! :p

Rendeur ? Modeleur ? Kesako ? :-S

Introduction à POV-Ray Persistence Of Vision Raytracer

Rendeur ? Modeleur ? Kesako ? :-S

C'est bien joli, tu nous dis que c'est un moteur de rendu... mais c'est quoi exactement ???

POV-Ray est un moteur de rendu, c'est à dire qu'il se contente de la phase finale de création d'une image : il transforme la description de la scène en une image de synthèse jolie tout plein :D .
Toute la partie de conception de la scène reste à faire. Il faut en plus savoir comment décrire cette scène, pour que le programme puisse l'interpréter correctement...

Les modeleurs, quant à eux, sont principalement tournés vers cette première partie : ils vous permettent de modeler facilement ce à quoi vous pensez.

Modeleurs et moteurs de rendus sont complémentaires : un modeleur est pratique pour créer votre scène, mais un moteur de rendu aura au final une qualité d'image bien supérieure à ce que le modeleur seul peut faire.

Il existe quelques modeleurs spécialement prévus pour POV-Ray, mais ils sont encore assez basiques (POV-Ray a cependant racheté récement Moray, un de ces modeleurs prévus pour fonctionner avec POV-Ray, mais aucune mise à jour n'a encore été effectuée).
Il existe des moyens d'utilser vos modeleurs préférés pour fonctionner avec POV-Ray, mais ce n'est pas le but premier de ce tutoriel.

En effet, il existe un autre moyen de créer une image de synthèse, sans passer par un modeleur : écrire directement la description de la scène, à la main.

Pas tant que ça, vous verrez ! :lol: POV-Ray possède son propre langage de description de scène, très efficace et assez simple à apprendre, qui vous permettra d'arriver à de très bons résultats. Et c'est sur cette méthode que porte ce tuto...

Vous voulez voir la puissance de POV-Ray ? Voici quelques images :
Une rue sous la pluie
Une planète inconnue
Des verres
Une autoroute
Ce ne sont que des exemples de ce que vous pourrez faire (mais il faut avouer que ceux qui ont fait ça sont vachement doués...).
Vous comprenez maintenant pourquoi on dit que POV-Ray est "photoréaliste" ?...


Introduction à POV-Ray Persistence Of Vision Raytracer

Persistence Of Vision Raytracer

Rendeur ? Modeleur ? Kesako ? :-S Installation et Découverte...

Persistence Of Vision Raytracer

Derrière un nom un peu tordu comme POV-Ray se cachent les mots :
Persistence Of Vision Raytracer o_O
Ça veut dire quoi ?
Raytracer, ça veut dire que POV-Ray marche en traçant des rayons.
Dans la vraie vie (l'école, la famille, les tournois de Warcraft III, ... :-° ), la lumière vient des sources de lumière, frappe un objet et va vers notre oeil.
POV-Ray fait un peu la même chose, mais à l'envers : il "envoie" des rayons depuis la caméra, regarde si ça tape un objet, puis si cet objet est éclairé...
...

Et qu'est-ce que ça change ?

Bon, bon, bon, encore rien, mais c'est toujours bon à savoir, non ? :euh:

Vous verrez, la seule limite à ce que POV-Ray peut avoir, c'est votre imagination...


Rendeur ? Modeleur ? Kesako ? :-S Installation et Découverte...

Installation et Découverte...

Persistence Of Vision Raytracer Lientographies...

Installation et Découverte...

Bon, bon, c'est vrai que je vous ai un peu raconté des trucs dont vous n'aurez probablement rien à faire de toute votre vie (et moi non plus d'ailleurs), mais maintenant, *ouf*, c'est fini !

Donc pour installer POV-Ray, direction le site officiel :
-> http://povray.org/
Ou plus directement :
-> http://povray.org/download/
Ou encore, pour la version bêta :
-> http://www.povray.org/beta/

Seule une version anglaise est disponible... Mais ne vous inquiétez pas, ce n'est pas grave, je suis là pour vous guider . :D

POV-Ray est disponible pour Windows (32 ou 64 bits), Mac OS ou Linux (mais si vous avez Linux, cherchez d'abord dans votre gestionnaire de paquet, on l'y trouve assez souvent). Choisissez celui qui vous convient...

Ça va, jusque là ? Pas encore perdu ? Bien !

Bon, vous lancez le fichier d'installation... Je vais pas tout vous expliquer quand même !
Une fois que c'est installé, vous pouvez le lancer...

Donc, si vous êtes sous Windows (et peut-être sous Mac OS aussi, je ne sais pas), vous devriez voir apparaître un truc à peu près comme ça :

Image utilisateur

Au milieu, le texte sur fond blanc, c'est le fichier de description de la scène. Ici, c'est la scène par défaut, donnée avec POV-Ray pour vous montrer un truc joli. ^^ Cliquez sur RUN en haut à droite pour la voir.

Ce bouton RUN lance la "compilation" de votre code : POV-Ray commence à lire votre code pour en faire une image.
Les autres boutons sont assez explicites, ceux qui ne le sont pas sont pour le moment inutiles. On verra plus tard ce qu'ils font.


Persistence Of Vision Raytracer Lientographies...

Lientographies...

Installation et Découverte... Les bases de POV-ray

Lientographies...

Pour finir sur la présentation de POV-Ray, voici quelques liens qui vous seront très utiles :

Le site officiel de POV-Ray (regardez le Hall of Fame, vous y trouverez de très belles images !)
Le forum officiel de POV-Ray (en anglais)
Le site de la communauté française de POV-Ray (à visiter !!!)
La doc en français de POV-Ray (à visiter aussi, très utile)

Ça y est, vous avez compris ce qu'est POV-Ray ? Si vous souhaitez continuer, le prochain chapitre vous donnera les bases dont vous aurez besoin avant d'apprendre vraiment le langage de description des scènes.


Installation et Découverte... Les bases de POV-ray

Les bases de POV-ray

Lientographies... Le langage POV-Ray

Bon, je sais que vous êtes impatients de réaliser votre premier chef-d'oeuvre, mais encore un tout petit peu de patience... Voilà les bases de la programmation POV-Ray.

Le langage POV-Ray

Les bases de POV-ray L'espace...

Le langage POV-Ray

POV-Ray, je vous l'ai dit, transforme un fichier texte en image.
Le fichier texte est le descriptif de la scène. C'est VOUS qui décrirez la scène, en écrivant ce qu'elle doit contenir.
La description de la scène se fait avec un langage spécifique à POV-Ray, qui ressemble assez à de nombreux langages déjà existants ; il est séparé en 2 parties :

Le langage de description de scène de POV-Ray n'est PAS difficile. Il emploie de mots-clés qui seront évocateurs aux anglophones, et qui seront (pour la plupart) faciles à retenir pour les autres...


Les bases de POV-ray L'espace...

L'espace...

Le langage POV-Ray Les vecteurs

L'espace...

Quand je vous dit "L'espace", vous pensez à quoi ?
-> A Star Wars !

Bon, l'espace, c'est... le monde. Le monde en 3 dimensions en fait, tel que nous le percevons (on va pas chipoter sur le temps ^^).
Pour pouvoir se repérer, l'ordinateur va représenter cet espace par un repère, comme quand il le fait en 2 dimensions.
En 2D, il y a les x et les y (ça vous rappelle les cours de maths ?... :p ), et chaque point peut être repéré par ces deux coordonnées.
En 3D, c'est pareil... sauf qu'il y a en plus la profondeur, les z.

Mais puisqu'un schéma est mille fois mieux que tout ce que je pourrais vous dire, voilà une représentation des axes de l'espace :

Image utilisateur

Comme vous pouvez le voir, en haut c'est +y, en bas c'est -y, à droite c'est +x, à gauche -x, devant c'est +z et derrière c'est -z.
Retenez ça, c'est un point FONDAMENTAL.

Par exemple, un point de coordonnées (x = 1,y = 2,z = 3) sera un peu à droite, un peu en haut, et assez devant vous (si vous vous tenez en x=0,y=0,z=0).


Le langage POV-Ray Les vecteurs

Les vecteurs

L'espace... Les couleurs

Les vecteurs

Bon, maintenant vous savez localiser un point dans l'espace.
Mais reste à savoir le faire comprendre à POV-Ray !
Les coordonnées dans POV-Ray sont notées sous la forme de vecteur : <x,y,z> (où vous remplacez, évidemment, x, y et z par les coordonnées réelles de l'objet).
Par exemple, pour noter les coordonnées (x = 5,y = -2, z = 0.2) il faudra écrire...

<5,-2,0.2>

Vous aviez trouvé ? :lol: Trop facile hein ?

Encore une chose à propos des vecteurs de positions : des raccourcis existent... :D
Par exemple, au lieu de faire <0,1,0> (qui correspond à... x=0, y=1 et z=0), vous pouvez tout simplement écrire "y" ! De même, x et z correspondent respectivement à <1,0,0> et <0,0,1>
De plus, vous pouvez les multiplier et les ajouter :

Ça simplifie assez souvent la lecture (sauf dans le dernier cas... :-°)

Voilà, vous savez maintenant écrire les coordonnées d'un point en vecteur !
Avouez que jusque là, ce n'était pas VRAIMENT difficile... n'est-ce pas ?
(Mais non, je veux pas dire qu'à partir de maintenant ça va devenir impossible, roooh...)


L'espace... Les couleurs

Les couleurs

Les vecteurs L'échelle

Les couleurs

Vous verrez, faire de jolies formes, c'est cool, mais vous allez vite vouloir donner un peu de couleur à vos scènes...

Les couleurs que nous connaissons (vert, violet, orange, turquoise, rose fushia, coca-cola) se composent de 3 couleurs : vert, bleu, et rouge. Le noir correspond à rien du tout (0 de rouge, de bleu et de vert), tandis que le blanc correspond au max de chaque... si vous avez un peu l'habitude des ordinateurs, je ne vous apprends rien. ^^

Dans POV-Ray, ces valeurs vont de 0 (rien du tout) à 1 (max). Le blanc correspond donc à (rouge = 1, vert = 1, bleu = 1), et le noir (rouge = 0, vert = 0, bleu = 0)...
Maintenant, à votre avis, comment on va dire à POV-Ray qu'on veut 0.164486 de rouge, 0.68412 de bleu et 0 de vert ??? :o
Les vecteurs ! :lol:
Mais pour différencier ces vecteurs à 3 couleurs des anciens vecteurs à 3 coordonnées, on va placer devant le vecteur un petit mot-clé qui va lui dire qu'on donne des valeurs de rouge, vert et bleu, et non x, y et z : on va ajouter "rgb" (pour Red Green Blue) :
rgb <1,0,0> donnera un rouge pur.
rgb <0,1,0> donnera du vert.
rgb <0,0,1> donnera un joli bleu.
Bien entendu, les décimales sont acceptées :
<0.5,0.5,0.5> donnera du gris
<0.1654,0.654684,0.3213> donnera du... euh... bah, essayez. ^^

Et voilà pour les couleurs !
Cette fois, il n'y a pas de raccourcis directement intégrés dans POV-Ray pour faire des couleurs déjà préparées. Il existe un autre moyen d'accéder à des raccourcis, mais nous verrons ça plus tard.


Les vecteurs L'échelle

L'échelle

Les couleurs Petits trucs

L'échelle

POV-Ray ne force aucune échelle de distance...
En effet, les distances se comptent en "unités". C'est à vous de choisir, si vous souhaitez utiliser 1 unité pour 1 mètre, pour 1 cm, 1 km, 273.5 mètres, etc.
Bah oui, c'est normal : qu'est-ce qui fait, dans la vie, qu'une chose est grande ?

Ainsi, vous êtes libres d'utiliser l'échelle de votre choix, tant que vous l'appliquerez à tous les objets de votre scène.
Lors de scènes réalistes, je vous conseillerais d'utiliser 1 unité = 1 mètre, par simplicité...

Voila pour les distances et les échelles !


Les couleurs Petits trucs

Petits trucs

L'échelle Ma première scène ! (1/2)

Petits trucs

Dernière petite chose, vous pouvez, à la place de n'importe quelle valeur numérique, mettre une opération. Par exemple, 6/3 au lieu de 2, (3+0.5)*(2-1) pour 3.5, etc...

Ce n'est pas forcément super utile, mais ça peut vachement aider, parfois... enfin, vous verrez bien !

Et voilà ! A présent (et cette fois-ci, pour de bon !), vous savez tout ce qu'il faut savoir pour commencer... Dans le prochain chapitre, nous entamerons immédiatement votre première scène !!


L'échelle Ma première scène ! (1/2)

Ma première scène ! (1/2)

Petits trucs Les essentiels

Bon, vous en avez bien bavé, mais maintenant, ça y est ! Dans ce chapitre, vous allez (enfin !) entamer votre première scène POV-Ray.

Les essentiels

Ma première scène ! (1/2) Premier objet : un sol

Les essentiels

Bon, ouvrez une nouvelle page, et c'est parti !

Si déjà, vous lancez le rendu (en appuyant sur RUN en haut à droite), vous obtiendrez... un truc noir. :colere2: Bizarre ?
Pas tellement ! :o
Bah oui, y a ni caméra, ni lumière !
Donc vous ne regardez rien, de nulle part, et sans aucune chance de le voir. o_O Sympa, hein ?
...
La première chose à mettre dans une scène est une caméra, ou un appareil photo, histoire qu'on puisse voir ce qui se passe dans ce monde en 3D.
Appareil photo se dit camera en anglais, donc le mot pour le désigner sera... camera !!!
(Pour plus de compréhension, j'écrirai camera, et non appareil photo par la suite, bien que ce soit une erreur de traduction... en plus, c'est moins long à écrire :p )
Allez, écrivez camera en haut de la page...
Mais bon, marquer juste ça ne suffit pas ! Bah oui, comment POV-Ray fait pour savoir où elle est, où elle regarde ?

Donc, juste après camera, écrivez {. On saute quelques lignes où on mettra les infos, et on referme : }. Voilà ce que ça devrait vous donner jusque là :

camera {


}

Bon, maintenant, on va lui dire où elle est...
On va la mettre en <0,1,-3>, c'est-à-dire un peu au-dessus et un peu derrière l'origine, qui est <0,0,0>.
Le mot à employer pour donner la position de la camera est location (position en anglais), suivi du vecteur correspondant à la position.
Ensuite, on va indiquer où regarder : on va mettre <0,0,0>, l'origine. Le mot à employer pour dire où l'on regarde est look_at, suivi du vecteur position de la cible. Donc, si vous avez suivi, le code total à mettre pour la camera est...

camera {
   location <0,1,-3>
   look_at <0,0,0>
}

Okay, la camera est finie ! :D
Mais si vous lancez le rendu, toujours un truc noir. :(

Bah oui, il n'y a toujours pas de lumière ni d'objet...
Mais ça viendra !

Le deuxième truc essentiel dans une scène est justement la lumière.
Ou une source de lumière, pour être plus précis.
Le mot-clé à employer est light_source.
Le premier paramètre à lui donner est sa position, mais cette fois directement en vecteur, sans mot devant.
Le deuxième est la couleur de la source de lumière.
Nous, on veut une lumière blanche, venant de 3 au-dessus de nous. La position de la lumière sera donc...

<0,4,-3>

La couleur blanche étant rgb <1,1,1>, le code vient tout seul !

light_source {
   <0,4,-3>
   rgb <1,1,1>
}

Et le tour est joué ! :)

Voilà, maintenant vous devriez être capables de faire vos propres camera et sources de lumière.
Si la camera doit être unique (logique ^^ ), il n'en est rien des sources de lumière : vous pouvez facilement avoir 10, 30, 2056 sources de lumière dans votre scène si vous le voulez... Ça ne dépend que de vous !

Encore une fois, le rendu ne donnera rien qu'une fenêtre noire. Cette fois, c'est juste qu'il n'y a rien à voir. Allez hop, on va lui ajouter un sol !


Ma première scène ! (1/2) Premier objet : un sol

Premier objet : un sol

Les essentiels Deuxième objet : une boîte

Premier objet : un sol

Bon, on y est presque, plus qu'à ajouter un objet à notre scène pour le voir. :D
On va commencer par ajouter un sol... enfin un truc plat et grand, quoi. :lol:
On va utiliser plane : ça va nous donner un... plan. Un truc plat, immense (infini, en fait).

Infini ??? :o C'est pas un peu grand ??

Meuh non ! :lol: Vous verrez, ça ira très bien pour faire le sol.
plane prend 2 paramètres. Le premier, c'est le vecteur normal.

Normal ?? o_O Tu veux dire qu'il y a des vecteurs pas normaux ??

:D Un vecteur normal, c'est un vecteur "perpendiculaire" au plan. Par exemple, ici, pour un plan horizontal, le vecteur normal sera... vers le haut ! (ou vers le bas, ça marche aussi)
Donc le vecteur normal sera <0,1,0>. On pourrait aussi bien utiliser <0,5,0> ou <0,-0.001,0> mais <0,1,0> c'est... plus... clair.
Sauf que c'est toujours pas vraiment clair... quand on voit <0,1,0>, on ne devine pas au premier coup d'oeil que c'est directement vers le haut.
Donc, on va utiliser un des raccourcis qu'on a appris !
Vous vous souvenez ? y = <0,1,0>. Donc on aura qu'à mettre y ! Avouez que c'est plus clair, non ?

Le deuxième paramètre, c'est la "hauteur" du plan, de combien on le "glisse" le long de l'axe normal. Ici, si on met 1, ça le mettra à la hauteur y = 1... c'est pas vraiment ce qu'on veut ; nous on veut au sol, à 0. Donc on met : y = 0.

Donc ?... A votre avis, ça va donner quoi comme code pour notre plan ? :o
Bon, je ne suis pas méchant, je vous le donne : :D

plane {
    y
    0
}

Mais si vous avez suivi, vous devriez l'avoir trouvé tout seul ^^ .

:colere2: Tu te fous de nous ? Je fais ça et j'ai toujours tout noir !

Eh bah oui, c'est normal !
Le plan est bien là, et n'attend qu'à être vu, mais il n'a pas de couleur : il est tout noir ! Voilà pourquoi on ne voit rien...
Hop là, on va lui donner une couleur jaune : rgb <1,1,0>.
Pour ça, on ouvre une zone dans notre plane : pigment. Regardez comment ça marche :

plane {
    y
    0
    pigment {

    }

}

Vous voyez le genre ? On insère une zone pigment dans la zone plane. pigment sert à indiquer le MOTIF de l'objet. On va lui dire qu'on veut un truc jaune. Pour ça, il suffit de mettre la couleur dans la zone pigment.
Allez, voilà le code :

plane {
    y
    0
    pigment {
        rgb <1,1,0>
    }
}

Et voilà ! Et là, enfin, si vous rendez, ça devrait marcher !
*Youpi !*

Euh, on n'a pas mis de zone pigment avec la lumière, pourquoi ?

Parce que la lumière prenait la couleur directement comme paramètre, c'était obligatoire. Ici, la couleur n'est qu'un plus : c'est pour ça qu'on l'ajoute dans une zone pigment.
Si vous ne comprenez pas (et c'est vrai que ce n'est pas trop clair), apprenez simplement par cœur qu'on utilise la zone pigment pour donner une couleur, SAUF avec la lumière ^^ .

Bon, pour ceux qui sont perdus, voici le code final de la scène :

camera {
    location <0,1,-3>
    look_at <0,0,0>
}

light_source {
    <0,4,-3>
    rgb <1,1,1>
}

plane {
    y
    0
    pigment {
        rgb <1,1,0>
    }
}

Et voilà !
Normalement, ça devrait donner ça :Image utilisateur

Bon, ce n'est pas encore exceptionnel, mais on voit que c'est un sol, non ?...
Allez, ne vous découragez pas, on va ajouter des trucs marrants, maintenant.


Les essentiels Deuxième objet : une boîte

Deuxième objet : une boîte

Premier objet : un sol Troisième objet : la sphère

Deuxième objet : une boîte

Bon, on a déjà un joli sol jaune... Il est temps d'ajouter à la scène un nouvel objet : une boîte !
La boîte est l'un des objets basiques de POV-Ray. C'est en fait un pavé : comme un rectangle, mais en 3D.
Le mot-clé pour faire une boîte est box. box prend 2 paramètres : deux vecteurs-positions, correspondant à deux coins de la boîte.

Hein ?? Je pensais qu'une boîte avait 8 coins !! Pourquoi on en donne que 2 ?

Parce que POV-Ray se charge de trouver les autres !
En fait, on ne donne à POV-Ray que 2 points opposés.
Image utilisateur
Voilà une image pour mieux comprendre. Pour faire la boîte, vous pouvez donner les deux points rouges, ou bien les deux points bleus, ou les deux jaunes, ou encore les deux verts. Ça donnera la même chose.

Attention ! Les deux points DOIVENT être opposés, sinon POV-Ray ne pourra en faire une boîte, et retournera un message d'erreur. De plus, ces deux points ne peuvent avoir AUCUNE coordonnée commune : les deux valeurs de x doivent être différentes, comme celles de y ou de z. Ceci est dû au fait que les faces de la boîte suivent les axes.

Encore une chose : les box sont toutes dans le même sens : la face du haut sera toujours horizontale, les faces latérales seront toujours verticales et parallèles aux axes z et x, etc...
Si ça peut paraître contraignant au début, on verra bientôt comment contourner ce léger problème.

Nous, on veut une boîte cubique de 1 de côté, posée sur le sol, et "centrée en 0" sur les axes x et z.

Qu'est-ce que ça veut dire, centrée en 0 ??

Centrée en 0, ça veut dire que le centre de l'objet (ici, la boîte) se trouve au point de coordonnées 0.
Dans notre boîte, comment on fait ? On réfléchit !
Si le centre est en x = 0 et z = 0, alors notre boîte sera symétrique par rapport à l'axe des x et des z, non ? Donc, normalement, elle devrait aller aussi loin de chaque côté (aussi loin en x positif qu'en x négatif, et pareil pour les z).

Je pige toujours rien !

Bon, ce n'est pas vraiment grave... vous comprendrez en regardant le code :

box {
  <-0.5,0,-0.5>
  <0.5,1,0.5>
}

Et voilà notre boîte. Vous pouvez regarder, de -0.5 à 0.5, cela fait bien 1 de côté ; et de 0 à 1 aussi : on a bien un cube.
Le point le plus bas (le premier point) est en y = 0, donc la boîte est bien posée sur le sol.
Elle va de -0.5 à 0.5 en x et en z : elle va donc aussi loin en positif qu'en négatif. Le centre est donc en 0 : notre boîte est centrée sur 0 pour les axes x et z !!

Si vous ne comprenez toujours pas, ne paniquez pas. Ce point est le plus (enfin un des plus) délicat à comprendre, donc n'hésitez pas à relire. Le principe en lui-même n'est pas spécialement compliqué, mais il peut vous falloir du temps pour voir quoi comprendre...

Bon, euh, j'ai à peu près compris. Mais... ça sert à quoi d'avoir centré notre boîte comme ça ?

Pour l'instant, à pas grand chose de spécial. Mais vous verrez que plus tard, c'est vachement utile de savoir le faire.
Ça nous a quand même permis de placer la boîte en plein milieu du champ de vision !
Mais... si vous rendez la scène, vous verrez le joli sol jaune de tout à l'heure, et un truc bizarre tout noir au milieu. o_O Pourquoi ?...
Parce que, comme le sol, la boîte est par défaut noire ! Donc, on va lui ajouter une couleur, tout comme on l'a fait pour le sol : en mettant une zone pigment.
Allez, on lui donne une belle couleur rouge. Voilà le code final :

box {
  <-0.5,0,-0.5>
  <0.5,1,0.5>
  pigment {
    rgb <1,0,0>
  }
}

Et le tour est joué ! Vous devriez obtenir quelque chose comme ça :

Image utilisateur

Bon, c'est toujours pas top, on ne voit pas bien le cube, seulement une face. Et si on réfléchit, c'est normal : la camera est en <0,1,-3> : elle n'est pas plus haut que le cube qui va jusqu'en y = 1, elle n'est pas plus à gauche que le cube qui va jusqu'en x = -0.5, et n'est pas plus à droite du cube, qui va jusqu'en x = 0.5.
Résultat : on ne voit qu'une face.
Donc, on va se mettre un peu plus haut et un peu plus à droite. Et plus précisément... en <1,1.5,-3>, comme ça on pourra voir 3 faces.

Bon, voilà un petit rappel du code entier de la scène :

camera {
    location <1,1.5,-3>
    look_at <0,0,0>
}

light_source {
    <0,4,-3>
    rgb <1,1,1>
}

plane {
    y
    0
    pigment {
        rgb <1,1,0>
    }
}

box {
    <-0.5,0,-0.5>
    <0.5,1,0.5>
    pigment {
        rgb <1,0,0> 
    }
}

Et vous devriez obtenir ça :Image utilisateur

Et voilà ! Vous avez réussi à faire votre propre boîte !
Essayez de changer les couleurs pour voir ce que ça fait, de changer un peu les coordonnées de la boîte, etc.

Prochaine étape : on va faire une grosse boule !


Premier objet : un sol Troisième objet : la sphère

Troisième objet : la sphère

Deuxième objet : une boîte Ma première scène ! (2/2)

Troisième objet : la sphère

Bon, on a un sol et une boîte, ça vous dirait d'ajouter une sphère ? (Comment ça, non ??? C'est moi qui commande ici !)
Le mot-clé pour ajouter une sphère, c'est sphere. Elle prend 2 paramètres : le vecteur de position du centre de la sphère, et le rayon de la sphère.
C'est tout simple, et il n'y a même pas de piège ( :( )...
Mais on va essayer de faire un truc rigolo : on va placer le centre de la sphère juste sur le centre de la surface de la boîte, comme ça, on ne verra que la moitié de la sphère.
Bon, ok, ok, c'est pas super rigolo, mais... mais...
...

La boîte va jusqu'à y = 1, et centrée en 0 pour les x et les z. Donc, le centre de la sphère n'a qu'à être en <0,1,0>, compris ?
On va mettre un rayon de 0.3, donc le code devrait être comme cela :

sphere {
  <0,1,0>
  0.3
}

Et on n'oublie pas les couleurs, cette fois (eh oui, il faut faire ça à chaque objet !), on va faire une sphère bleue (le bleu = rgb <0,0,1>).
Donc, le code de la sphère bleue :

sphere {
  <0,1,0>
  0.3
  pigment { 
     rgb <0,0,1>
  }
}

Et voilà le résultat :Image utilisateur

Sympa hein ?

Allez, deuxième exercice de placement : on va essayer de changer le centre de la sphère (mais que le centre) pour que le bas de la sphère touche, mais à la limite, le haut de la boîte. Pour faire ça, on va juste monter le centre, mais de combien exactement ?...
Allez, un petit dessin, et on va comprendre tout de suite ce qu'il faut faire :
Image utilisateur
Comme vous le voyez, la hauteur du centre doit être de 1 + 0.3, ce qui fait 1.3.
Et voilà, le tour est joué !
Le code devrait alors ressembler à ceci (pour la sphère) :

sphere {
  <0,1.3,0>
  0.3
  pigment { 
     rgb <0,0,1>
  }
}

Et voilà le résultat :
Image utilisateur
Bon, on voit pas grand chose, la sphère est trop haute. Un problème ? Mais non ! On n'a qu'à regarder plus haut. Vous vous souvenez comment régler le point que l'on regarde ?
(psst, dans la camera, le look_at !!)
Allez, on regarde plus en <0,0,0>, mais en <0,1,0>. Je vous laisse modifier !

Voilà un bref résumé du code jusque là :

camera {
    location <1,1.5,-3>
    look_at <0,1,0>
}

light_source {
    <0,4,-3>
    rgb <1,1,1>
}

plane {
    y
    0
    pigment {
        rgb <1,1,0>
    }
}

box {
    <-0.5,0,-0.5>
    <0.5,1,0.5>
    pigment {
        rgb <1,0,0> 
    }

}

sphere {
    <0,1.3,0>
    0.3
    pigment { 
        rgb <0,0,1>
    }
}

C'est tout pour la sphère !
Entraînez-vous à en faire, ce n'est vraiment pas difficile.

Bon, voilà, vous savez maintenant commencer vos propres scènes, y ajouter un sol, des boîtes et des sphères. C'est déjà pas mal !
Entraînez-vous bien avec cela, c'est en pratiquant que l'on progresse. N'hésitez pas à employer plusieurs lumières, boîtes ou sphères dans vos scènes !

Dans le prochain chapitre, nous verrons les derniers objets basiques que nous pourrons placer...


Deuxième objet : une boîte Ma première scène ! (2/2)

Ma première scène ! (2/2)

Troisième objet : la sphère Un cylindre...

Vous savez déjà utiliser les bases de POV-Ray, voici maintenant les derniers objets basiques que vous pourrez utiliser.

Un cylindre...

Ma première scène ! (2/2) ...et un cône.

Un cylindre...

Bon, après la boîte et la sphère, voilà le cylindre :D ...
Très simple, le cylindre emploie le mot-clé cylinder, et a 3 paramètres : les deux premiers sont des vecteurs-positions, indiquant les 2 extrémités du cylindre ; le troisième est le rayon du cylindre.

On va essayer de faire un autre truc rigolo (hey, ne vous moquez pas de moi !) : on va faire passer le cylindre à travers la boîte... Voilà l'image que ça donnera :
Image utilisateur
Vous voyez le genre ? Le cylindre est symétrique par rapport au centre de la boîte, a une longueur de 3, et un rayon de 0.3.
Alors, à votre avis, comment situer les deux extrémités ?
Bon, je suis gentil, je vous le dis :

cylinder {
    <-1.5,0.5,0>
    <1.5,0.5,0>
    0.3
    pigment { rgb <0,1,0> }
}

Vous voyez pourquoi ? Le cylindre est "centré en 0" pour les x, donc les deux extrémités ont des valeurs de x opposées. Pour que le cylindre passe au milieu de la boîte, la hauteur doit être la moitié de celle de la boîte, c'est-à-dire 0.5. Enfin, le centre de la boîte est en z = 0, donc...
J'ai mis une couleur verte, mais j'imagine que maintenant vous savez mettre la couleur vous-mêmes...

Allez-y, essayez ! Alors ?


Ma première scène ! (2/2) ...et un cône.

...et un cône.

Un cylindre... Et enfin un anneau

...et un cône.

Bon, on a ajouté un cylindre, maintenant on va mettre un cône...
Dans POV-Ray, les cônes ne sont pas forcément pointus ! o_O En fait, un cône, c'est juste un cylindre, où les deux extrémités ont des rayons différents. Si l'un des rayons est de 0, il est pointu ^^ .
Le mot-clé pour un cône est cone... Je vous l'avais dit, les noms sont assez simples à retenir.
Le cône prend 4 paramètres (oui, tout ça !) :

Tenez, voilà comment on va mettre notre cône :
Image utilisateur
La première extrémité sera donc au milieu de la première face de la boîte, avec un rayon de 0.3, l'autre un peu plus loin, avec un rayon de 0.

Le centre de la face avant ? Pas trop dur à calculer ! x = 0, y = 0.5 et z = -0.5 (vérifiez si vous voulez, c'est ça !)
Donc, la première extrémité sera en <0,0.5,-0.5> avec un rayon de 0.3. La seconde sera un peu plus loin, disons en <0,0.5,-1>, avec un rayon de 0. Voilà donc le code :

cone {
    <0,0.5,-0.5>
    0.3
    <0,0.5,-1>
    0
    pigment { rgb <1,0,1> }
}

Et voilà pour le cône !
Surtout, comme pour le cylindre, n'oubliez pas de mettre des valeurs différentes aux deux extrémités. C'est une erreur très fréquente...


Un cylindre... Et enfin un anneau

Et enfin un anneau

...et un cône. TP : une tour du futur...

Et enfin un anneau

Bon, pour finir notre jolie scène, on va ajouter un anneau. Un donut, si on veut.
Le mot-clé est torus (tore en anglais).
Le torus prend 2 paramètres : deux valeurs de rayon : r1 et r2.

Quoi ?? Et comment je lui dis où il est ?? Y a pas de position ??

Eh non ! Je sais, cela peut paraître étrange... Je ne sais pas exactement pourquoi on ne peut pas spécifier de position, mais c'est comme ça !
Ne vous inquiétez pas pour autant, nous verrons dans le prochain chapitre comment résoudre ce problème, mais en attendant, on va le laisser où il est.

Et où il est au juste ?

Centré en 0 !
Tenez, voici un schéma rapide pour vous montrer comment POV-Ray construit le torus avec les 2 rayons r1 et r2 que vous lui donnez :
Image utilisateur
Vous comprenez à peu près ?... Super !

Bon, puisque l'anneau est par défaut centré en 0, et que nous, on a un sol en y = 0 justement, l'anneau sera coupé en deux par le sol. Tant pis !
Regardez ce qu'on va faire (l'anneau est en bas, à moitié coupé, en bleu-vert) :
Image utilisateur
J'ai utilisé pour rayons 1 et 0.1, et comme couleur rgb <0,1,1>.
Voilà le code de ce torus :

torus {
    1
    0.1
    pigment { rgb <0,1,1> }
}

Ce qui donne, au final, pour toute la scène,

camera {
    location <1,1.5,-3>
    look_at <0,1,0>
}

light_source {
    <0,4,-3>
    rgb <1,1,1>
}

plane {
    y
    0
    pigment {
        rgb <1,1,0>
    }
}

box {
    <-0.5,0,-0.5>
    <0.5,1,0.5>
    pigment {
      rgb <1,0,0>
    }
}

sphere {
    <0,1.3,0>
    0.3
    pigment {
        rgb <0,0,1>
    }
}

cylinder {
    <-1.5,0.5,0>
    <1.5,0.5,0>
    0.3
    pigment { rgb <0,1,0> }

}

cone {
    <0,0.5,-0.5>
    0.3
    <0,0.5,-1>
    0
    pigment { rgb <1,0,1> }
}

torus {
    1
    0.1
    pigment { rgb <0,1,1> }
}

Et voilà ! On a réussi !
Je sais, ça doit encore être le fouillis pour vous...

Le prochain cours nous apprendra à faire beaucoup de choses jusqu'alors impossibles, mais avant cela, on va faire un petit TP pour tout réviser !

Et voilà ! Boîtes, sphères, cylindres, anneaux et cônes vous permettront déjà de réaliser de nombreuses scènes. Je le répète, entraînez-vous, c'est le meilleur moyen pour progresser.
Comme vous l'avez sûrement déjà remarqué, la partie la plus difficile est de savoir ce que l'on veut faire, comment placer ses objets... Le mieux est encore de dessiner ce que l'on veut faire (sur papier, ou même sur un logiciel de dessin).


...et un cône. TP : une tour du futur...

TP : une tour du futur...

Et enfin un anneau Objectifs du TP

Je vous ai assez fait souffrir avec tout ce cours théorique...
Maintenant, on va faire un petit TP : vous allez réaliser une tour du futur (ou un truc qui y ressemblera... vous n'êtes pas encore des pros, tout de même !).
Pourquoi du futur ?...
Eh bien... ahem... parce qu'on ne peut faire que des formes assez simples, pures et arrondies... et que c'est justement comme ça qu'on imagine le futur !
Vous le verrez, chercher un look futuriste est bien plus facile que de s'attaquer à des modèles plus réalistes...

Objectifs du TP

TP : une tour du futur... Correction du TP

Objectifs du TP

Comme promis, attaquons-nous à cette fameuse tour. Voici à quoi elle ressemblera :

Vue globaleVue globale

Vue de l'entréeVue de l'entrée

Vue de hautVue de haut

Pas forcément aussi épique qu'on souhaiterait, mais ça devrait aller pour ce premier TP. Il faut bien en garder pour plus tard ! :p


TP : une tour du futur... Correction du TP

Correction du TP

Objectifs du TP Conclusion

Correction du TP

Bon, je vous l'accorde, réaliser cette tour tout seul n'est pas très facile...
Cependant, la grande difficulté n'est pas dans le langage, mais dans la conception de la scène !
Le plus difficile dans une scène en 3D est de bien positionner les objets, et non de savoir comment les coder...

Partie 1 : caméra et lumière

Cela ne faisait pas partie du plan donc c'était à vous de trouver comment les placer. Pas de règle à ce niveau là, à partir du moment où on arrive à reconnaître la tour sans soucis. Faites attention à ne pas placer la caméra à l'intérieur de l'objet, on n'y voit pas grand chose !

camera {
        location <0, 0.2, -13>
        look_at <0, 6, 0>
}
 
light_source {
        <30,30,-30>
        rgb <1,1,1>
}

Je ne détaille plus : à ce niveau, vous devriez comprendre.

Comme je me sens généreux aujourd'hui, je vais ajouter un plan :

plane {
    y,
    0
}
Partie 2 : Base, entrée et tronc

Maintenant, le base.
Vous avez probablement deviné qu'il s'agissait de deux cônes.

cone {
    0, 3
    y, 2
}
 
cone {
    y, 2
    3*y, 1
}

Pour l'entrée, il y a trois boîtes : une pour chaque mur, et une pour le toit :

box {
    <0.5, 0, 0>
    <0.45, 0.75, -4>
}
box {
    <-0.5, 0, 0>
    <-0.45, 0.75, -4>
}
box {
    <0.5, 0.7, 0>
    <-0.5, 0.75, -4>
}

Le tronc est un simple cylindre :

cylinder {
    3*y,
    8*y,
    1
}

Il reste bien entendu les couleurs à ajouter. À vous de jouer ! ;)

Partie 3 : passerelle et tour d'observation

On va dire que la petite tour annexe est une tour d'observation, ça fait plus sérieux. :-°

Pour la passerelle, toujours rien de bien compliqué : un simple cylindre qui part vers la droite.

cylinder {
    6.5*y,
    6.5*y + 4*x,
    0.5    
}

La tour d'observation est constituée d'un cylindre central, et d'une sphère à chaque bout pour avoir les extrémités arrondies. Il suffit alors de faire correspondre les rayons et les centres !

cylinder {
    <3.75, 5, 0>,
    <3.75, 8, 0>,
    0.75
}

sphere {
    <3.75, 5, 0>,
    0.75
}

sphere {
    <3.75, 8, 0>
    0.75
}
Partie 4 : l’ascenseur

Aaah, c'était ça le machin bleu ?!?
On ne critique pas, c'est de l'art ! :colere2:

Toujours rien de sorcier, une simple grande boîte :

box {
    <0, 0, -0.15>
    <1.3, 9, 0.15>
}
Partie 5 : tête de tour

Je suis à court de justification pour la partie gonflée en haut de la tour. Ça donne un air de contrôleur de trafic aérien, mais on a déjà utilisé le coup de la tour d'observation. On va donc juste l'appeler la tête de tour.

Un petit cône pour élargir, puis un cylindre.

cone {
    8*y, 1
    9*y, 2
}
 
cylinder {
    9*y,
    11*y,
    2
}

Il reste encore les quatre petits modules à ajouter de chaque côté. Ils ressemblent à la tour d'observation : un cylindre, et une sphère à chaque bout.

Voici un module :

cylinder {
    <2, 9.5, 0>
    <2, 10.5,0>
    0.25
}
sphere {
    <2, 9.5, 0>
    0.25
}
sphere {
    <2, 10.5, 0>
    0.25
}

Il reste à le copier en multipliant les x par -1 pour obtenir le symétrique. Puis copier les deux en échangeant les x et les z pour les deux derniers. Ça commence à prendre de la place, je vous fais confiance pour cette fois...

Partie 5 : le toit

Enfin, le toit de la tour. On va le séparer en trois parties : le sol, la sphère, et les deux tours.

On va commencer par les deux tours. Elles sont chacune divisées en 3 segments : un cylindre, puis deux cônes.
Voilà la plus grande :

cylinder {
    <0, 11, -1.25>
    <0, 12.5, -1.25>
    0.5
}
cone {
    <0, 12.5, -1.25>, 0.5
    <0, 13, -1.25>, 0.4
}
cone {
    <0, 13, -1.25>, 0.4
    <0, 13.5, -1.25>, 0
}

Et la plus petite :

cylinder {
    <0, 11, 1.25>
    <0, 11.5, 1.25>
    0.5
}
cone {
    <0, 11.5, 1.25>, 0.5
    <0, 12, 1.25>, 0.4
}
cone {
    <0, 12, 1.25>, 0.4
    <0, 12.5, 1.25>, 0
}

Pour le sol, il y a deux épaisseur, chacune de 0,05. La première est un cylindre :

cylinder {
    11*y,
    11.05*y,
    1.75
}

La deuxième une croix composée de deux boîtes et d'un cylindre à chaque bout. Deux bouts sont déjà occupés par les tours, donc il reste deux cylindres à ajouter.

box {
    <-1.25, 11.05, -0.5>
    <+1.25, 11.10, +0.5>
}
box {
    <-0.5, 11.05, -1.25>
    <+0.5, 11.10, +1.25>
}

cylinder {
    <-1.25, 11.05, 0>
    <-1.25, 11.10, 0>,
    0.5
}
cylinder {
    <+1.25, 11.05, 0>
    <+1.25, 11.10, 0>,
    0.5
}

Enfin, la sphère centrale n'a rien de particulier :

sphere {
    11.10 * y,
    0.25
}

Objectifs du TP Conclusion

Conclusion

Correction du TP Les transformations d'objets

Conclusion

Enfin ! Ça fait du bien quand c'est fini...

Vue de l'entrée
Vue de l'entrée
Vue de haut
Vue de haut

Et voilà une tour !

Bon, elle n'est clairement pas parfaite. Nos boîtes ont l'obligation d'être alignées avec les axes du repère. On ne peut pas placer d'anneau où l'on veut.

Et puis, ce n'est même pas tout ! Tout a l'air plastique, plat et triste. Les couleurs peu variées y sont peut-être pour quelque chose, mais pas uniquement.

Et enfin, je ne sais pas pour vous, mais j'ai trouvé ça bien fastidieux. Indiquer à chaque fois la même couleur pour tous les objets blancs était assez ennuyeux. Faire l'entrée avec les trois boîtes n'était pas très pratique. Bref, on avait l'impression de faire des choses compliquées, pour au final quelque chose d'assez simple. Pas très optimal tout ça.

Mais tout n'est pas si sombre : avec des éléments simples, on a réussi à avoir un résultat ma foi fort satisfaisant (comment ça, je me contente de peu ? :p ) ! Vous l'aurez compris, ces critiques servaient surtout de petite transition, vers des chapitres où tous ces défauts disparaîtront enfin. :)


Correction du TP Les transformations d'objets

Les transformations d'objets

Conclusion Translate

Vous aimeriez faire une espèce d'ovale, une sphère allongée ? Vous voulez ENFIN bouger votre torus ?? Vous voulez mettre vos boîtes comme vous le voulez ? No problemo !Translate, rotate et scale n'attendent que ça !

Translate

Les transformations d'objets Rotate

Translate

Tout d'abord, attaquons-nous au problème de l'anneau. On ne peut pas choisir sa position, qui est par défault <0,0,0>. Mais on va apprendre à le bouger !

D'abord, voyons un code habituel d'anneau :

torus {
  1.2
  0.2
  pigment { rgb <1,0,0> }
}

Cela nous donne un anneau, positionné en <0,0,0>.
Maintenant, on va ajouter, à la fin (après la zone pigment mais avant le "}" de la fin de l'anneau) le mot-clé translate suivit d'un vecteur, par exemple <0,1,0> :

torus {
  1.2
  0.2
  pigment { rgb <1,0,0> }
  translate <0,1,0>
}

Qu'est-ce que ça va nous faire ?
Ca va d'abord créer l'anneau, lui donner sa couleur, puis ça va le bouger de <0,1,0> !! Puisque le centre était à la base de <0,0,0>, le nouveau centre sera de <0,0,0> + <0,1,0> = <0,1,0> !
Il suffit donc de mettre dans le translate la position du torus pour le mettre où l'on veut !

Encore un exemple : pour placer le torus en <-1,1,3>, quel sera le code ?...

torus {
   1.2
   0.2
   pigment { rgb <1,0,0> }
   translate <-1,1,3>
}

Et voilà !

Evidement, cela marche aussi avec les autres objets, que ce soient des boîtes, des sphères, ...

Par exemple, bouger un cône se fera comme ça :

cone {
  <0,0,0>
  1
  <0,1,0.5>
  0.2
  pigment { rgb <0.2,1,0.4> }
  translate <1,-2,-1>
}

revient à faire

cone {
  <1,-2,-1>
  1
  <1,-1,-0.5>
  0.2
  pigment { rgb <0.2,1,0.4> }
  
}

C'est tout pour translate ! Amusez-vous, entraînez-vous... c'est le meilleur moyen de progresser !


Les transformations d'objets Rotate

Rotate

Translate Scale (1/2)

Rotate

Maintenant qu'on a vu comment bouger un objet, on va voir comment le tourner.
Voilà un petit problème :
Image utilisateur
Comment pourrait-on faire quelque chose comme ça ? La barre bleue du milieu ne pose pas trop de problème, mais comment faire une barre qui soit inclinée comme la rouge ?...
C'est là qu'on a besoin de rotate ! Ce mot-clé s'emploie exactement comme translate, mais rotate fait tourner l'objet au lieu de simplement le déplacer. Il est suivit d'un vecteur, mais ce n'est pas ici un vecteur de position, comme pour translate, mais un vecteur d'angle (en degrés). Vous pouvez ainsi faire tourner votre objet autour d'un axe de l'angle de votre choix...

Ca veut dire quoi, concrètement ?

On a une boîte, dont voici le code :

box {
  <-0.1,-0.1,-1>
  <0.1,0.1,1>
  pigment { rgb <0,0,1> }
}

Maintenant, on va la tourner autour de l'axe des y de 30° comme sur le schéma :
Image utilisateur
Attention à ne pas se tromper dans le sens ! Pour tourner la barre de 30° vers la droite, il faudrait la faire tourner de -30° !

On fait donc tourner la boîte de 30° autour de l'axe des y. Le vecteur angle sera donc <0,30,0> !

box {
  <-0.1,-0.1,-1>
  <0.1,0.1,1>
  pigment { rgb <1,0,0> }
  rotate <0,30,0>
}

Et le tour est joué !

Qu'est-ce que ça veut dire ? Regardez ce schéma :
Image utilisateur
Voilà le code de la boîte :

box {
    <-0.85,0.55,-0.01>
    <-0.55,0.45,0.01>
    
    pigment {        
        rgb <0,1,0>
    }
}

J'aimerai faire tourner cette boîte verte... (comment ça c'est pas une bonne idée ? :p ) ... de 45° autour de l'axe des z...

box {
    <-0.85,0.55,-0.01>
    <-0.55,0.45,0.01>
    
    pigment {        
        rgb <0,1,0>
    }
    rotate <0,0,45>
}

Et voilà ce que ça donne :Image utilisateur

Bah non, c'est normal ! En effet, la rotation a pour centre <0,0,0>. Voilà donc comment s'est passée la rotation :
Image utilisateur
Ca explique tout !

Mais alors, comment peut-on tourner la boîte sans la déplacer ??

Souvenez-vous, quand nous avons fait tourner la barre bleue sans changer son centre... Vous savez pourquoi ? Parce que son centre était <0,0,0> ! Et que ce point ne bouge jamais lors d'une rotation.
C'est donc ça la solution ! Pour faire tourner un objet sans le déplacer, il faut qu'il soit centré en 0...

Et si l'on veut qu'il soit ailleurs ?...
On n'a qu'à le bouger après la rotation ! Avec un translate situé après le rotate !

Voici donc ce qu'il aurait fallu faire pour tourner la boîte en la laissant où elle est :

box {
  <-0.15,-0.05,-0.01>
  <0.15,0.05,0.01>
  pigment { rgb <0,1,0> }
  rotate <0,0,45>
  translate <-0.7,0.5,0>
}

Et voilà le résultat :Image utilisateur


Translate Scale (1/2)

Scale (1/2)

Rotate Scale (2/2)

Scale (1/2)

Rotate et translate permettent de positionner un objet comme on le veut, en le déplaçant ou en le tournant.
Scale est un petit peu différent : il multiplie les distances. Il est suivit d'un vecteur de rapport.

Qu'est-ce que ça veut dire ?

Prenons une boîte cubique de 1 de côté, centrée sur 0. Le code est tout simple :

box {
  <-0.5,-0.5,-0.5>
  <0.5,0.5,0.5>
}

A présent, utilisons scale, avec le vecteur <2,2,2>, c'est à dire un rapport de 2 dans les 3 axes.

box {
  <-0.5,-0.5,-0.5>
  <0.5,0.5,0.5>
  scale <2,2,2>
}

Qu'est-ce que ça change ? :o
A gauche, la boîte normale. A droite, la boîte avec scale.
Image utilisateur
Vous voyez la différence ? scale a aggrandit la boîte en multipliant par le rapport (qui est ici 2) toutes les longueurs.

Pourquoi faut-il faire attention ?
Voilà un exemple : on retrouve notre chère boîte verte, que l'on veut cette fois aggrandir :
Image utilisateur
On ajoute un scale <2,2,2> à la boîte... et voilà le résultat :
Image utilisateur
o_O Mince, la boîte est partie en haut à gauche...
Normal ! C'est le même problème qu'avec rotate : scale multiplie TOUTES les distances, y comprit la distance origine - objet ! Notre scale <2,2,2> a donc doublé la distance qui séparait notre boîte de l'origine, en plus de l'avoir aggrandit !

Sacré problème ! Mais comment y remédier ? Exactement comme avec rotate ! Avec scale tout comme avec rotate, l'origine (le point <0,0,0>) est un point fixe : c'est à dire qu'il ne bouge pas. Pour ne pas déplacer l'objet, il suffit donc de placer son centre en <0,0,0>, d'utiliser scale, puis de le bouger avec translate !!

Et voilà le travail :

box {
  <-0.15,0.05,-0.01>
  <0.15,-0.05,0.01>
  pigment { rgb <0,1,0> }
  scale 2   
  translate <-0.7,0.5,0>
}

et le résultat :Image utilisateur


Rotate Scale (2/2)

Scale (2/2)

Scale (1/2) Les associations d'objets

Scale (2/2)

Bon, jusque là, scale n'a pas été vraiment très utile : on aurait pu agrandir la boîte dès le départ...

Cette fois-ci, on va l'utiliser un peu différement...

Voici d'abord un code d'une simple sphère de rayon 1, que l'on étire avec scale :

sphere {
  <0,0,0>
  1
  scale <2,2,2>
}

Le résultat est une sphère de rayon 2 ; le centre ne bouge pas puisque c'est <0,0,0>.

Voilà ce que ça donne :
Image utilisateur
Ca, on aurait pu le faire tout simplement en donnant un rayon de 2 au début, au lieu de 1... scale est donc un peu inutile.

Mais on va changer le vecteur de rapport : on va mettre <1,2,1>. Vous voyez ce que ça va faire ?... Ca va multiplier par 2 la hauteur de la sphère, et par 1 la largeur et la profondeur...
Et voilà le résultat :
Image utilisateur
Marrant, non ? :D scale permet d'étirer les objets de manière non uniforme, c'est à dire différement suivant les axes. Essayons avec un torus :
Image utilisateur
Ca nous donne une espèce de bague... ^^ Essayez avec les cylindres, les cônes, ... en variant le vecteur de rapport, on peut arriver à des choses plutôt sympa !

Surtout, n'oubliez pas que scale multiplie TOUTES les distances. C'est un peu comme si tout ce que vous avez mis dans la description de l'objet, que ce soit des vecteurs ou des rayons, est multiplié par le rapport.

C'est tout pour translate, rotate et scale !
Translate est très simple à utiliser, mais rotate et scale néscessitent une attention supplémentaire, du fait de leur centre... Aussi, il est toujours plus pratique de travailler avec des objets centrés en 0 dès leur création, puis de les positionner avec translate.

Grâce à ce chapitre, vous savez à présent comment combler beaucoup de ce qui vous manquait jusqu'alors...
Dans le chapitre suivant, vous allez apprendre les dernières bases néscessaires pour faire de vraies scènes !


Scale (1/2) Les associations d'objets

Les associations d'objets

Scale (2/2) Association - CSG...

Dernier de cette partie, ce chapitre vous apprendra à combiner plusieurs objets afin de faire de nouvelles formes, comme une demi-sphère, un cube aux arêtes arrondies, etc...

Association - CSG...

Les associations d'objets Union

Association - CSG...

Non, je ne vais pas vous parler d'une association de parents d'élèves :lol: mais d'associations d'objets, aussi appelées Opérations CSG (pour Constructive Solid Geometry). Ces choses permettent d'utiliser plusieurs objets afin d'en donner un nouveau. Elles sont au nombre de 4 :

A part l'union, qui se contente d'unir plusieurs objets, les 3 autres opérations tiennent compte de l'intérieur et de l'extérieur des objets. Pour tous les objets que nous avons vus jusque là, l'intérieur et l'extérieur sont bien définis.

Il est possible d'inverser l'intérieur de l'extérieur en ajoutant le mot-clé invert à la fin d'un objet. Ce n'est pas vraiment utile, je ne l'ai personnellement jamais utilisé... Ça n'a aucune influence sur l'apparence directe de l'objet, mais uniquement sur son comportement dans les différentes opérations.

Une association (ou opération) se déclare comme un objet, en écrivant son mot-clé suivi d'accolades, mais prend pour paramètres les différents objets la composant... vous comprendrez mieux dans les explications spécifiques à chaque opération.


Les associations d'objets Union

Union

Association - CSG... Différence

Union

L'association d'objets la plus couramment utilisée est l'union. Cette association sert uniquement à unir plusieurs objets en un seul...

Voici comment on s'en sert :

union {
box {
<-0.5,-0.5,-0.5>
<0.5,0.5,0.5>
}

sphere {
<0,0.5,0>
0.2
}

}

Cette union regroupe donc une boîte et une sphère ! :D

Mais... à quoi ça sert ? :o
A beaucoup de choses ! :p

Plus sérieusement, l'union a de nombreuses utilités : puisque l'union associe plusieurs objets, toute modification appliquée à l'union sera appliquée sur tous les objets de cette union !

Exemple :

cylinder {
  <0,0,0>
  <0,1,0>
  0.3
}

sphere {
  <0,1,0>
  0.3
}

Cela nous donne un cylindre, avec une sphère à une des extrémités. Supposons maintenant que l'on veuille déplacer cet ensemble de <0,0,1>. On pourrait utiliser un translate <0,0,1> pour le cylindre et pour la sphère, mais ce ne serait pas très pratique : à chaque modification, il faudrait modifier les deux...
On va donc utiliser une union regroupant le cylindre et la sphère ! Et, en appliquant un translate <0,0,1> à cette union, tout sera ainsi déplacé ! ^^

union {

cylinder {
  <0,0,0>
  <0,1,0>
  0.3
}

sphere {
  <0,1,0>
  0.3
}
translate <0,0,1>
}

De la même manière, rotate et scale fonctionne aussi sur les associations d'objets !

Il est également possible d'attribuer une couleur à une union, qui sera donc utilisée pour tous les objets la composant.

Utilisez union lorsque vous utilisez plusieurs formes afin de créer un objet. Même lorsque ce n'est pas directement utile, c'est un grand plus au niveau de la clarté !


Association - CSG... Différence

Différence

Union Intersection

Différence

Voilà une autre association d'objets que vous utiliserez énormément : c'est la différence, dont le mot-clé est difference.
Qu'a-t-elle de si magique ? :o Cette association prend le premier objet, puis lui enlève tout ce qui appartient aux autres.
Vous commencez à voir ?Image utilisateur

Par exemple, pour faire une demi-sphère, il suffit de faire ça :

difference {
sphere {
<0,0,0>
1
pigment { rgb <1,0,0> }
}
box {
<-2,-2,-2>
<2,0,2>
}
}

Et voilà ce que ça donne :
Image utilisateur
Super, non ? :D

Qu'est-ce que ça veut dire ?
Que si on regarde par en-dessous, pour voir la nouvelle face créée par la différence, elle sera noire !
Image utilisateur
Petit problème !
Il y a deux méthodes pour remédier à cela :

La deuxième solution est bien plus pratique si notre objet est de couleur uniforme, comme ici !

Voilà donc le résultat, avec ce code-là :

difference {
        sphere {
        <0,0,0>
        1 
        
    }
    box {
        <-2,-2,-2>
        <2,0,2>
    }  
    pigment { rgb <1,0,0> }
}

Image utilisateur

Mais si, maintenant, on remet la zone pigment dans la sphère, et que l'on donne un autre couleur à la boîte, comme bleu par exemple :

difference {
        sphere {
        <0,0,0>
        1 
        pigment { rgb <1,0,0> } 
    }
    box {
        <-2,-2,-2>
        <2,0,2>
        pigment { rgb <0,0,1> }
    }  
    
}

Image utilisateurSympa ^^ on a fait une demi-sphère mi-rouge, mi-bleue...

Maintenant, on va faire un quart de sphère. Comment faire ? Très simple ! Il suffit d'ajouter une autre boîte !

On va donc soustraire à notre sphère une union, composée des deux boîtes !
Et voilà le travail :

difference {
        sphere {
        <0,0,0>
        1 
        pigment { rgb <1,0,0> } 
    }
    union {
        box {
            <-2,-2,-2>
            <2,0,2>
            pigment { rgb <0,0,1> }
        }  
        box {
            <-2,-2,-2>
            <0,2,2>
            pigment { rgb <0,1,0> }
        }  

    }    
}

Et le résultat :Image utilisateur

Voilà tout pour la différence !
Évidemment, comme pour l'union, on peut appliquer des rotations, des translations, etc... directement à la différence !


Union Intersection

Intersection

Différence Fusion

Intersection

L'intersection, dont le mot-clé est intersection, est un petit peu moins employée que l'union et que la différence, mais peut s'avérer bien pratique dans certains cas.
Elle prend le premier objet, puis lui enlève tout ce qui n'appartient PAS au second, puis tout ce qui n'appartient pas au troisième, et ainsi de suite.
L'objet final est donc l'intersection de tous les objets.
Voilà un simple exemple : à gauche, l'intersection ; à droite, les deux sphères.Image utilisateur

Et voilà le code :

intersection {
    sphere {
        <0,-0.5,0>
        1 
        pigment { rgb <1,0,0> } 
    }
     sphere {
        <0,0.5,0>
        1 
        pigment { rgb <1,0,0> } 
    }
}

Tout comme la différence, la couleur d'une face est celle de l'objet l'ayant créée... Donc, avec un code comme celui-ci :

intersection {
    sphere {
        <0,-0.5,0>
        1 
        pigment { rgb <1,0,0> } 
    }
     sphere {
        <0,0.5,0>
        1 
        pigment { rgb <0,1,0> } 
    }
}

... on obtiendra :Image utilisateur

De plus, il est possible d'assigner une couleur globale à toute l'intersection, et de lui appliquer des modifications (translate, rotate, scale.... )

C'est tout pour l'intersection !


Différence Fusion

Fusion

Intersection La puissance de pigment

Fusion

Le mot-clé de la fusion est merge. La fusion est comme une union, sauf que les bords intérieurs de l'objet sont supprimés... Pour l'instant, ça n'a aucune influence sur ce que vous ferez, mais ce sera très utile plus tard, lorsque l'on utilisera des objets transparents.
Voilà un exemple de ce que vous pourrez faire plus tard, afin de vous expliquer le fonctionnement de merge : à gauche, deux sphères unies par union ; à droite, les même fusionnées avec merge :Image utilisateur

Vous n'êtes pas obligés de retenir ça, on ne l'utilisera que dans la prochaine partie...

C'est tout pour les opérations de CSG !
Évidemment, il est possible de les imbriquer : nous avons déjà vu la différence d'un objet et d'une union, il est aussi possible de faire l'intersection d'une union et de la différence d'une intersection et d'une fusion... o_O

Vous connaissez maintenant toutes les bases de POV-Ray ! Avant de finir cette partie, on va faire un petit TP pour faire... un luth !

Bon, voilà... maintenant, vous savez faire la plupart des objets dont vous vous servirez dans POV-Ray, même plus tard. A ce stade, vous pouvez déjà créer vos premières scènes, plus ou moins basiques...
:D


Intersection La puissance de pigment

La puissance de pigment

Fusion La nature cachée de pigment...

Vous pensiez que pigment ne pouvait vous donner qu'une bête couleur ? Vous vous trompiez ! :lol: Pigment peut bien plus que ça...

La nature cachée de pigment...

La puissance de pigment rgb, rgbf, rgbt, rgbft...

La nature cachée de pigment...

Tout d'abord, pigment, il fait quoi en fait ?...

Il donne la couleur de l'objet...
o_O Et en quoi c'est différent de ce qu'on sait dans ce cas ?...
Et bien, pigment ne se limite pas à une simple couleur unie... on peut, bien sûr, l'employer comme on l'a fait jusque là, mais on peut faire tellement plus de choses : des motifs, des objets transparents, ... vous verrez, on va mettre bien plus dans notre zone pigment que le simple rgb...


La puissance de pigment rgb, rgbf, rgbt, rgbft...

rgb, rgbf, rgbt, rgbft...

La nature cachée de pigment... Les motifs

rgb, rgbf, rgbt, rgbft...

Commençons par la couleur elle-même : jusqu'ici, elle se limitait à quelque chose du genre :
rgb <1,0.3,0>.
Les valeurs étaient comprises entre 0 et 1, pour commencer. Ça peut paraître normal, mais on peut les dépasser !
Une valeur supérieure à 1 commence à "créer" sa propre lumière : si vous mettez un objet de couleur rgb <4,0,0> dans le noir, vous le verrez...
De même, mettre une couleur négative aura tendance à supprimer les couleurs...

Les valeurs négatives trouvent peu d'utilité dans les objets, en revanche, elles peuvent obtenir des effets très sympathiques dans les sources de lumière ! Une source de lumière de couleur rgb <-1,-1,-1> aura tendance à absorber la couleur... Bien qu'étant totalement irréaliste, cela peut être utile pour certains effets spéciaux... A l'inverse, donner des valeurs supérieures à 1 à une lumière aura un effet dynamique sur la scène... Essayez, ça ne peut rien vous coûter !

Mais les valeurs de rouge, de vert et de bleu ne sont pas tout. La "couleur" d'un objet peut prendre 2 autres paramètres : transmit et filter.
Ces deux paramètres sont tous deux utilisés pour définir une certaine transparence, mais de deux types :

Comment utiliser ces paramètres ?...
Si on regarde bien, dans rgb <1,0.9,0.5>, r, g et b indiquent chacun le type de paramètre d'une valeur. r pour red, g pour green et b pour blue. Pour indiquer une valeur de filter ou de transmit, il suffit d'ajouter f ou t, selon le paramètre à régler, ou les deux. Ainsi, ce n'est plus 1, mais 4 mots-clés possibles que l'on peut mettre devant un vecteur :

Par exemple, rgbt <1,0,0,0.5> sera un rouge un peu transparent mais n'influençant pas la lumière le traversant.

Autre chose : lorsque la somme transmit + filter dépasse 1, l'objet laisse passer plus de lumière qu'il n'en reçoit, conduisant la plupart du temps à des résultats étranges...

Voilà un simple exemple d'utilisation de transmit :

camera {
    location <0,1.5,-2.3>
    look_at <0,0.5,0>
}


light_source {
    <2,3,-3>
    rgb <1,1,1>           
}  
                                
plane { 
    y
    0
    pigment { rgb <0.6,0.2,0.5> }
}                                
  
box {
    <-0.5,0,-0.5>
    <0.5,1,0.5>
    pigment { rgbt <1,1,1,0.6> }
}

Ceci aura pour résultat :Image utilisateur

Vous allez maintenant comprendre l'utilité du merge dans le code suivant :
Prenons deux sphères à moitié transparentes, unies par une union :

union {
    sphere {
        <-0.3,0.5,0>
        0.5
        pigment { rgbt <1,1,1,0.7> }
    }
    sphere {
        <0.3,0.5,0>
        0.5
        pigment { rgbt <1,1,1,0.7> }
    }
}

Voici le résultat :
Image utilisateur
On distingue bien les bords intérieurs des sphères... et cela peut souvent être gênant !
Utilisons merge :

merge {
    sphere {
        <-0.3,0.5,0>
        0.5
        pigment { rgbt <1,1,1,0.7> }
    }
    sphere {
        <0.3,0.5,0>
        0.5
        pigment { rgbt <1,1,1,0.7> }
    }
}

Et voilà le résultat :
Image utilisateur
Plus satisfaisant, n'est-ce pas ? ^^


La nature cachée de pigment... Les motifs

Les motifs

rgb, rgbf, rgbt, rgbft... Liste des motifs

Les motifs

Voici la meilleure partie de pigment : la possibilité d'indiquer non pas une valeur unie, mais un motif de couleurs (pouvant être transparentes, évidemment).

Pour comprendre ce qu'est un motif, il faut savoir exactement ce qu'est un pigment : c'est un système qui donne à chaque point de l'espace une couleur (qui peut éventuellement être transparente).
Oui, vous avez bien lu, à chaque point de l'espace, et non simplement de la surface.
Ainsi, lorsque l'objet est opaque, vous n'en voyez que la surface. La couleur de cette surface est obtenue en prenant la couleur que lui attribue le pigment en ce point...
o_O
Bon, quand la couleur est unie, la couleur est la même dans tout l'espace, donc sur tout l'objet. Mais imaginez qu'il existe un moyen de donner une couleur différente à chaque point en fonction de sa position dans l'espace...
Eh bien c'est exactement ce que font les motifs. Les motifs permettent de donner une "règle" à pigment, pour lui indiquer comment positionner les couleurs dans l'espace. La surface de l'objet aura donc la couleur des points dont elle est constituée...
:waw:
Vous avez compris ?...
En gros, pigment donne à chaque point une couleur. Motif permet de faire varier cette couleur, donc de dessiner des espèces de motifs sur les surfaces ^^ , et non de simples couleurs unies.

Pour cela, on commence par vider notre zone pigment :

pigment {

}

Ensuite, on met le type de motif que l'on souhaite utiliser. Il y en a pas mal, je vous les décrirai plus tard.
Deux types de motifs sont disponibles :

o_O Tout ça ne doit pas vous dire grand-chose...
Mais ça ira mieux quand je vous aurai expliqué !

Les motifs "à liste"

Ces motifs sont en fait les plus simples à comprendre et à utiliser. Imaginez que vous donniez une liste de couleurs, par exemple rouge (rgb <1,0,0>) et vert (rgb <0,1,0>). Le motif va créer des zones, et en remplir certaines de rouge, et d'autres de vert. C'est aussi simple que ça !
Prenons par exemple le motif checker (vous verrez la liste complète des motifs dans le prochain chapitre), qui prend une liste de 2 couleurs. Ce motif crée un échiquier, et donne alternativement aux cases les deux valeurs de la liste.
Comment l'écrire, cette liste ? :o Tout simplement en écrivant à la suite les couleurs, juste après le type du motif !
Ainsi,

pigment {
  checker 
    rgb <1,0,0>
    rgb <0,1,0>
}

donnera un quadrillage rouge et vert : utilisé dans un plan, voilà le résultat :Image utilisateur

Les motifs "à carte"

Les motifs "à carte" (colormap en anglais) assignent à chaque point une valeur allant de 0 à 1, et donne à ce point la couleur correspondante à cette valeur. La "carte des couleurs" permet d'indiquer la couleur en fonction du nombre. Les différents motifs répartissent différemment ces valeurs de 0 à 1...

Par exemple, le motif onion déploie les valeurs de 0 à 1 de manière circulaire et répétée, comme sur le schéma :
Image utilisateur
Ici, blanc = 0 et noir = 1.
Là encore, je détaillerai tous les motifs à carte dans le prochain chapitre.

Maintenant, parlons de ce colormap (j'utiliserai ce terme plutôt que "carte des couleurs"). Faut-il définir pour chaque décimale la valeur de la couleur ?... :( Ce serait bien long et fastidieux !
Heureusement, il y a bien plus simple. Pour définir un colormap, il suffit de donner à certaines valeur une couleur spécifique, POV-Ray se chargera alors de compléter le reste en dégradant les couleurs !

Pour bien comprendre comment marche le color_map, voilà un schéma :Image utilisateur

Par exemple, sur le plan avec l'onion au-dessus, on avait mis la couleur blanche à la valeur 0, et la couleur noire à la valeur 1 : le dégradé s'est alors fait tout seul !

Pour résumer,
Image utilisateur
On voit bien qu'au final, le pigment permet bien de donner à chaque point une couleur.

Maintenant que la théorie est passée, venons-en aux faits. Nous avons notre zone pigment, nous avons choisi le motif onion. Voici le code jusque là :

pigment {
  onion
}

A présent, il est temps de définir le colormap. Pour cela, nous allons mettre une zone color_mapà l'intérieur de la zone pigment :

pigment {
  onion
  color_map {

  }
}

Pour donner la couleur en fonction du nombre, il suffit d'écrire le nombre en question, suivi de la couleur, et cela entre crochets. Ainsi, assigner "blanc" à la valeur 0 se fera ainsi :

pigment {
  onion
  color_map {
    [0 rgb <1,1,1>]
  }
}

Vous comprenez ? Et si l'on veut mettre plusieurs couleurs, il suffit d'en ajouter d'autres : voilà donc le code entier du plan que nous avons vu :

plane {
    y
    0
    pigment {
        onion     
        color_map { 
            [0 rgb <1,1,1>]
            [1 rgb <0,0,0>] 
        }            
    }
}

Image utilisateur

C'est tout pour le fonctionnement des motifs à carte !

Assez compliqué ce chapitre, n'est-ce pas ? Tout ça ne peut pas encore vous servir, il vous faut maintenant connaître les différents types de motifs. Malgré tout, un chapitre essentiel... Vraiment !


rgb, rgbf, rgbt, rgbft... Liste des motifs

Liste des motifs

Les motifs Les motifs à liste

Dans le dernier chapitre, vous avez appris à vous servir de motifs. A présent, voilà la liste de tous les motifs que vous pourrez utiliser.
Ils sont classés en deux catégories : les motifs à liste, et les motifs à colormap.

Les motifs à liste

Liste des motifs Les motifs à color_map (1/2)

Les motifs à liste

Voilà la liste de tous les motifs à liste ( :-° ).
Vous vous souvenez ?... Les motifs à liste n'emploient qu'un nombre limité de couleurs (souvent 2) et sont donc souvent assez simples.

Checker

Le premier, le plus simple, checker fait un échiquier. Il est très souvent utilisé dans les plans pour bien évaluer les distances.
Il ne prend que 2 couleurs.

plane {
  y
  0
  pigment {
    checker
    rgb <0,0,0>
    rgb <1,1,1>
  }
}

Image utilisateur

brick

Encore un autre motif à 2 couleurs, brick donne un effet de briques entourées de ciment :
Image utilisateur
Attention : brick simule un mur de briques empilées, donc aura de meilleurs effets sur des surfaces verticales.

brick est un petit peu particulier : on peut lui attribuer (si on le souhaite) 2 paramètres : mortar et brick_size.
mortar, suivi d'un nombre décimal, donne l'épaisseur du joint entre les briques. Sa valeur par défaut est 0.2.
brick_size donne les dimensions de la brique en 3D, grâce à un vecteur. Sa valeur par défaut est <8,3,4.5>.
Ces deux paramètres doivent être donnés après les couleurs.

plane {
  z
  0
  pigment {
    brick
    rgb <0,0,0>
    rgb <1,1,1>
    mortar 0.1
    brick_size <4,1.5,2.25>
  }
}
hexagon

hexagon crée un pavage d'hexagones, sur le plan horizontal XZ. Ces hexagones s'étendent indéfiniment sur l'axe Y, donc il est conseillé d'utiliser hexagon sur des surfaces horizontales (comme un plan). Pour utiliser hexagon sur une surface verticale, il suffit de créer la surface horizontalement avant de lui appliquer un rotate approprié ;) .
Image utilisateur
hexagon prend 3 couleurs, et la première correspond à l'hexagone situé en <0,0,0> (même si ce n'est pas super utile à savoir).

plane {
  y
  0
  pigment {
    hexagon
    rgb <0,0,0>
    rgb <0.5,0.5,0.5>
    rgb <1,1,1>    
  }
}
Object

object, le dernier motif à liste, est un peu plus compliqué que les autres : il prend 2 couleurs, et un objet en 3D. Il donne une couleur à tout ce qui est dans l'objet, et donne l'autre à tout ce qui est à l'extérieur...
En plus, object prend une zone à lui tout seul...
Voilà comment s'en servir :

plane {
  y
  0
  pigment {
    object {
      box {
        <-1,-1,-1>
        <1,1,1>
      }
      rgb <0.5,0.5,0.5>
      rgb <1,1,1>
    }
  }
}

Image utilisateur

On peut aussi utiliser d'autres objets que des boîtes, des unions, etc...

Ça y est, vous connaissez maintenant tous les motifs à liste ^^ .
Bon, c'est vrai, puisqu'ils n'utilisent que 2 ou 3 couleurs, ils sont souvent assez moches, et vous ne les utiliserez que très rarement (à part peut-être checker).


Liste des motifs Les motifs à color_map (1/2)

Les motifs à color_map (1/2)

Les motifs à liste Les motifs à color_map (2/2)

Les motifs à color_map (1/2)

Voici à présent la liste des motifs à "carte", ou colormap. Ces motifs sont très utilisés, et la liste en est très longue.
Petit rappel : ces motifs assignent à chaque point de l'espace une valeur allant de 0 à 1, et donne à ces points la couleur correspondante à cette valeur.
La carte des valeurs se définit en donnant des couleurs précises à certaines valeurs, les autres étant obtenues en dégradant les couleurs données. On peut donc donner autant de couleurs qu'on le souhaite.
Dans tous les exemples, on utilisera la carte allant de noir (0) à blanc (1), c'est-à-dire ayant une colormap comme celle-ci :

color_map {
  [0 rgb <0,0,0>]
  [1 rgb <1,1,1>]
}

Pour savoir comment utiliser ces motifs, lisez le chapitre précédent.

onion

Le motif à liste le plus simple est onion : la valeur de chaque point correspond à la valeur décimale de la distance entre l'origine et ce point. o_O
Concrètement, ce motif déploie les valeurs de 0 à 1 en sphères concentriques, de manière linéaire.Image utilisateur

gradient

gradient est un autre motif à liste assez simple. Il prend pour paramètre un vecteur, et déploie les valeurs de 0 à 1 parallèlement à ce vecteur, un peu comme s'il traçait une infinité de plans perpendiculaires à ce vecteur.
Voilà un exemple avec un vecteur z sur un plan :Image utilisateur

pigment {
  gradient z
  color_map {
    [0 rgb <0,0,0>]
    [1 rgb <1,1,1>]
  }
}
marble

marble est un peu comme un gradient x : il déploie, de gauche à droite, les valeurs de 0 à 1, puis de 1 à 0, puis de 0 à 1, ...
Voilà ce que ça donne :Image utilisateur

leopard

leopard est utilisé pour représenter... des taches de léopard ! :p
Image utilisateur
Cela crée des sphères régulièrement espacées, où les centres ont la valeur 1.

quilted

quilted fait des carrés en dégradé :
Image utilisateur
Deux paramètres permettent de régler ce dégradé : control0 et control1, tous deux suivis d'un nombre décimal.
Je pourrais vous expliquer le fonctionnement de ces deux paramètres, mais ni moi ni vous n'y comprendrait rien. Voici donc un joli schéma (honteusement pompé de la doc française de POV-Ray) expliquant l'influence de ces deux paramètres, control0 (c0) et control1 (c1):
Lien vers l'image
Par exemple,

pigment {
  quilted
  control0 0.3
  control1 0.7
  color_map {
    [0 rgb <0,0,0>]
    [1 rgb <1,1,1>]
  }
}

donneraImage utilisateur

radial

Image utilisateurComme vous pouvez le voir, radial déploie les valeurs de 0 à 1 de manière circulaire autour de l'axe y (il sera donc conseillé de l'utiliser sur des surfaces horizontales).
On pourra ajouter le paramètre frequency, suivi d'un nombre, afin de spécifier combien de dégradés seront effectués en 1 tour (par défaut, c'est 1).
Voici un exemple, avec frequency 8 :Image utilisateur

pigment {
  radial
  frequency 8
  color_map {
    [0 rgb <0,0,0]
    [1 rgb <1,1,1]
  }
}
spiral...

Il existe deux méthodes pour faire des spirales : spiral1 et spiral2...

spiral1

spiral1 donne... des spirales, tournant autour de l'axe Z (il faudra donc un plan normal à Z pour bien voir ces spirales...).
Il est suivi d'un nombre, c'est le nombre de spirales mises en jeu.
Voici un exemple avec 2 spirales :

plane {
  z
  0
  pigment {
    spiral1
    2
    color_map {
      [0 rgb <0,0,0>]
      [1 rgb <1,1,1>]
    }
  }
}

Image utilisateur

spiral2

spiral2 est assez spécial... lui aussi est suivi d'un nombre, correspondant au nombre de spirales utilisées, ces dernières tournant autour de l'axe Z...

Mais alors, quelle différence avec spiral1 ???

:D Regardez :
Image utilisateur
Marrant, non ?... Les effets blancs et noirs ne sont pas des reflets, c'est la couleur naturelle de la spirale !
En fait, spiral2 utilise des doubles spirales, partant dans des sens opposés... d'où le résultat assez surprenant...
Je vous l'accorde, spiral2, même s'il est assez amusant, n'est pas vraiment très utilisé...

wood

wood crée des cylindres concentriques d'axe Z, dont les valeurs passent de 0 à 1 puis de 1 à 0... comme marble.
L'axe des cylindres est l'axe Z, il faudra donc, pour bien les voir, une surface verticale :

plane {
  z
  0
  pigment {
    wood
    color_map {
      [0 rgb <0,0,0>]
      [1 rgb <1,1,1>]
    }
  }
}

Image utilisateur

Bon, vous avez déjà vu la moitié des motifs à carte de couleur, ou colormap. Ces motifs se basaient sur des représentations géométriques, facilement prévisibles... Mais ça va changer !


Les motifs à liste Les motifs à color_map (2/2)

Les motifs à color_map (2/2)

Les motifs à color_map (1/2) Jouer avec les motifs

Les motifs à color_map (2/2)

En effet, à présent, il ne reste plus que les motifs à colormap dits "fractals", c'est-à-dire qu'ils utilisent des fonctions mathématiques récurrentes complexes...
o_O
Bon, ce qu'il faut savoir, c'est que c'est plus joli ! :lol: (En tout cas, plus réaliste.)
Ces motifs, pour la plupart, ne présentent pas de "discontinuité" : les valeurs ne passeront pas de 0 à 1 d'un point à un autre.

bozo

bozo est en quelque sorte l'archétype du motif à color_map fractal...
Image utilisateur
C'est une alternance de valeurs 0 et 1, à peu près aléatoires, et assez douces...

wrinkles

Image utilisateurwrinkles ressemble à bozo, mais un peu plus troublé... Il peut donner des nuages sympathiques, avec du bleu et du blanc.

agate

agate ressemble un peu à marble, mais en bien plus troublé :
Image utilisateur
Pratique pour faire certaines roches...

dents

dents produit des espèces de pics de valeurs élevées (1) au milieu de beaucoup de valeurs basses (0) :Image utilisateur

ripples

ripples est utilisé pour faire des vagues : il donne plusieurs ondes presque concentriques, dont les milieux sont proches de l'origine.Image utilisateur

waves

waves ressemble beaucoup à ripples, mais avec des vagues plus grandes :Image utilisateur

granite

granite est utilisé pour donner... du granit ! :lol:Image utilisateur

crackle

crackle donne un effet craquelé (sans blagues...).
Image utilisateur
Il peut prendre plusieurs paramètres, afin de régler l'apparence :

Voici un exemple avec solid :

plane {
  y
  0
  pigment {
    crackle
    solid
    color_map {
      [0 rgb <0,0,0>]
      [1 rgb <1,1,1>]
    }
  }
}

Image utilisateurCela peut donner de beaux granits.

cells

Ce motif produit des cubes de 1 de côté, et donne à chaque cube une valeur aléatoire. Cela donne des cases...Image utilisateur

Ça y est, vous avez vu tous les motifs à color_map !

Voilà, vous connaissez maintenant tous les motifs...
Rassurez-vous, vous n'êtes pas obligés de les apprendre tous par coeur !
Tant que vous savez les utiliser, tout va bien. Essayez d'en retenir certains, comme checker, wrinkles, bozo, gradient...

Dans le prochain chapitre, vous apprendrez à modifier, à moduler, et à mélanger ces motifs... ^^


Les motifs à color_map (1/2) Jouer avec les motifs

Jouer avec les motifs

Les motifs à color_map (2/2) Des modifications simples...

Vous savez déjà utiliser des motifs à la place d'une couleur unie...
Mais vous ne savez pas encore les modifier, ces motifs !
La plupart des motifs sont assez basiques (et donc moches)...
Mais il est possible de les améliorer ! En leur appliquant quelques modifications, on peut arriver à de très beaux résultats !

Des modifications simples...

Jouer avec les motifs Warp (1/2)

Des modifications simples...

Les motifs répartissent les couleurs dans l'espace selon des lois... ça, vous savez déjà.
Maintenant, on va modifier un petit peu ces lois. :D
Prenons une onde à color_map assez simple, gradient x par exemple, que l'on assigne à un plan :

plane {
    y
    0
    pigment {
        gradient x
        color_map {
            [0 rgb <0,0,0>]
            [1 rgb <1,1,1>]
        }
    }
}
frequency

Placé juste après le type de motif, le mot-clé frequency (fréquence en anglais), suivi d'un nombre, permet de définir combien de fois le motif doit se répéter dans tout l'espace. La valeur par défaut est 1.
:o Ça sert à quoi ??
Eh bien, si l'on répète plus de fois le motif... alors il sera plus serré !

Essayons avec un frequency 2 :

plane {
    y
    0
    pigment {
        gradient x
        frequency 2
        color_map {
            [0 rgb <0,0,0>]
            [1 rgb <1,1,1>]
        }
    }
}

Comparons les deux résultats : en haut, sans le frequency :
Image utilisateur
Comme vous le voyez, avec le frequency 2, les bandes sont exactement deux fois plus serrées.

Essayez d'utiliser frequency avec d'autres motifs... le résultat n'est pas le même à chaque fois (surtout pour les spirales...).

phase

Voilà un autre mot-clé à placer après le type du motif : phase, suivi d'un nombre décimal (souvent de 0 à 1) permet de commencer le motif à une certaine valeur, et non à 0 comme par défaut.

Cela permet de le décaler un petit peu.

plane {
  y
  0
  pigment {
    gradient x
    phase 0.5
    pigment_map {
      [0 rgb <0,0,0>]
      [1 rgb <1,1,1>]
    }

  }
}

Image utilisateur

En fait, il décale la valeur de chaque point du motif d'autant que spécifié.

phase aura surtout un intérêt plus tard, avec les animations : faire bouger phase d'un petit peu à chaque fois donne l'impression d'une onde qui avance...


Jouer avec les motifs Warp (1/2)

Warp (1/2)

Des modifications simples... Warp (2/2)

Warp (1/2)

warp permet de modifier un peu les motifs, pour les rendre plus jolis, moins linéaires.
warp est une zone à part entière à l'intérieur de pigment, tout comme color_map :

pigment {
    ...
    color_map {
        ...
    }
    warp {
        ...
    }
}
turbulence

turbulence est l'outil principal de warp. Il permet de... troubler le motif. o_O
Imaginez que le motif est en fait constitué de fluides colorés... turbulence permet de "souffler" dessus, pour créer des courants, et tout mélanger un peu.
turbulence est suivi d'un vecteur, donnant la direction du "souffle". La longueur du vecteur donne la force. o_O
Regarder ces deux vecteurs :

<0,1,2>
<0,0.5,1>

Qu'ont-ils de particulier ?

Ils sont proportionnels ! :p (Bah oui, les maths ça sert !)

En fait, on dit qu'ils sont colinéaires. Ça veut dire quoi ? Qu'ils vont dans la même direction !
Seulement, l'un des deux est deux fois plus court.
Placés dans turbulence, ces deux vecteurs donneraient des souffles dans la même direction, mais de puissances différentes...

Prenons un exemple simple : un plan avec un échiquier.

camera {
        location <0,2,-3>
        look_at <0,0,0>
}

light_source {
        <2,5,-4>
        rgb <1,1,1>
}

plane {
        y,
        0
        pigment {
                checker
                rgb <0,0,0>
                rgb <1,1,1>
        }
}

Cela devrait donner ceci :Image utilisateur

Maintenant, ajoutons une zone warp, avec une turbulence de <0.2,0,0>...

camera {
        location <0,2,-3>
        look_at <0,0,0>
}

light_source {
        <2,5,-4>
        rgb <1,1,1>
}

plane {
        y,
        0
        pigment {
                checker
                rgb <0,0,0>
                rgb <1,1,1>
                warp {
                        turbulence <0.2,0,0>
                }
        }
}

Voilà le résultat :Image utilisateur

Comme vous pouvez le voir, turbulence a modifié les bords des cases, mais uniquement dans le sens des "x". En mettant un vecteur plus fort, comme <0.5,0,0>, on obtient :Image utilisateur

Et voici le même plan, troublé grâce au vecteur <0.2,0,0.1> :
Image utilisateur
Ici, les cases sont déformées dans tous les sens...

Bon, j'imagine que vous avez compris comment fonctionne turbulence. Essayez avec d'autres motifs, vous verrez qu'on peut arriver à des trucs sympas. ^^

octaves

Vous vous demandez peut-être pourquoi je viens vous parler d'octaves ici ?... :o
Non, je ne parle pas des octaves de musiques ! :lol: (bien que les musiciens pourront voir quelques rapports)

En fait, turbulence fait "bouger" des points, dans une direction qui est à peu près celle du "souffle". octaves permet de définir combien de ces déplacements on fait pour chaque point. Par défaut, octaves vaut 6, ce qui veut dire que chaque point subit 6 déplacements avant de trouver sa place finale. La valeur maximale est 10.
Plus la valeur d'octaves est élevée, plus la turbulence est précise, tandis qu'une valeur faible donne des modifications plus douces ; cependant, puisqu'il y a plus de déplacements à calculer, ça peut prendre plus de temps.

Voila des exemples avec turbulence <0.2,0,0.1> :

octaves 1Image utilisateur

octaves 4Image utilisateur

octaves 10Image utilisateur

Comme vous pouvez le voir, une valeur de 4 ou 5 suffit très souvent, et permet d'obtenir un rendu plus rapide qu'avec la valeur par défaut (qui est 6). Une valeur de 1 donne un effet qui peut être intéressant...

lambda

Le paramètre lambda permet de spécifier statistiquement la différence entre un déplacement et le suivant...
Voici des exemples, pour turbulence <0.2,0,0.1> et octaves 4 :

lambda 1 :Image utilisateur

lambda 2 :Image utilisateur

lambda 4 :Image utilisateur

Des valeurs basses donnent des modifications douces, tandis que des valeurs plus hautes donnent des modifications plus agitées...

omega

Et voici le dernier paramètre de warp : omega. La valeur d'omega permet de donner le rapport de distance entre un déplacement et le suivant : la valeur par défaut, de 0.5, fait en sorte que chaque déplacement soit moitié moins grand que celui d'avant.

Voici trois exemples, utilisant :
turbulence <0.2,0,0.1>
octaves 6
lambda 2

omega 0.1Image utilisateur

omega 0.4Image utilisateur

omega 0.8Image utilisateur

Et voilà ! Ce n'était pas si dur, hein ?
warp est vraiment vraiment super utile, il permet de transformer les motifs tout pas beaux en motifs super-top... Je vous laisse essayer ;) .
Bon, c'est pas encore fini pour warp, il reste 2-3 petits trucs, mais le plus important est passé !


Des modifications simples... Warp (2/2)

Warp (2/2)

Warp (1/2) Les formes d'onde

Warp (2/2)

Bon, ces deux derniers trucs ne vous seront pas vraiment très utiles, mais ça peut toujours servir de les connaître.
En fait, ils n'ont même pas besoin de turbulence pour fonctionner...

repeat

repeat permet de prendre une tranche du motif, et de la répéter sur tout le motif (à la place du motif)...
A quoi ça sert ? A pas grand chose...
Enfin si, on pourrait trouver une utilité : un mur constitué de planches de bois toutes identiques, ou un truc dans ce genre là... Avec un peu de chance, vous trouverez un jour une utilité à ce machin ^^ .

repeat est suivi d'un vecteur, qui doit être le long d'un des axes x, y ou z (une seule coordonnée ne sera pas nulle).
Ce vecteur représente la largeur d'une des "tranches".

Exemple avec un motif agate et repeat <0.5,0,0> :Image utilisateur

Comme vous le voyez, le résultat est assez spécial...

On peut ajouter le mot-clé offset, suivi d'un vecteur, pour décaler à chaque fois la tranche utilisée. Chaque bande sera alors prise dans le motif original à un endroit un peu décalé du précédent...
Cela permet d'éviter un aspect trop répétitif... enfin, c'est l'objectif.

Exemple avec offset <0,0,0.3> :Image utilisateur

Évidemment, si on met le même vecteur après offset et repeat, alors on obtiendra le motif d'origine...

Enfin, flip permet de faire subir au motif une symétrie entre chaque bande. Il est également suivi d'un vecteur, et les coordonnées non nulles de ce vecteur correspondent aux axes suivant lesquels on effectue la symétrie...

Par exemple, flip <1,0,0> fera une symétrie suivant l'axe des x à chaque bande. Encore un truc pas vraiment utile...

black hole

Un peu plus marrant dans le principe, mais toujours assez rarement utilisé, black_hole permet d'ajouter une espèce de "trou noir" dans le motif : une zone où le motif sera comme "attiré" par un point.
black_hole est suivi d'un vecteur de position, déterminant le centre du trou noir, puis du rayon. Voici un exemple assez simple :

plane {
        y,
        0
        pigment {
                checker
                rgb <0,0,0>
                rgb <1,1,1>
                warp {
                        black_hole <0,0,0> 10
                }
        }
}

Cela donnera un trou noir située en 0, de rayon 10...
Image utilisateur
On voit bien qu'au milieu, les cases semblent attirées vers un point...

Plusieurs paramètres optionnels permettent de paramétrer ce trou noir :

strength

Ajouter strength, suivi d'un nombre décimal, permet de faire varier l'intensité du trou noir. La valeur par défaut est 1.

falloff

Le mot-clé falloff, suivi d'un nombre décimal, permet de donner la puissance à laquelle la vitesse diminuera en approchant du bord du trou noir.
Une valeur de 1 donne une diminution linéaire. Une valeur de 2 (par défaut) donne une diminution rapide autour du centre, et plus lente près du bord du trou. A l'inverse, une valeur inférieure à 1 donne une diminution lente autour du centre, et plus brutale près des bords.

inverse

Ajouter simplement le mot-clé inverse permet d'inverser l'effet du trou noir : au lieu d'attirer le motif, il le repoussera.

C'est à peu près tout pour les trous noirs... d'autres paramètres permettent de faire une répétition de trous noirs, mais ils sont complexes à comprendre et redoutablement inutiles... Si vous voulez plus d'informations à ce sujet, vous pouvez aller voir ici.

Ça y est, on a fini avec warp... pfiou !
C'était la partie la plus compliquée sur les modificateurs de motifs. La suite est bien plus simple, vous verrez ^^ .