Aller au menu - Aller au contenu

Icône Formes avancées (1/2)

Mise à jour : 01/07/2010
Difficulté : Intermédiaire Intermédiaire Creative Commons BY-NC-SA
525 visites depuis 7 jours, dont 6 sur ce chapitre classé 218/786
Bon, vous vous êtes bien reposés ? J'espère pour vous !
On va apprendre ici pas mal d'objets, un peu plus compliqués que ceux qu'on a vus avant...
Préparez-vous bien, on va chauffer du neurone...

Ces objets pourront s'utiliser exactement comme ceux que l'on connaît déjà. C'est juste qu'ils permettent de faire des trucs plus jolis, et qu'ils sont plus durs à maîtriser.
Sommaire du chapitre :
Icône du chapitre
Chapitre précédent Sommaire Chapitre suivant

Le mesh

Vous l'attendiez, celui-là ? :D
Un mesh permet de créer un objet à partir de triangles.
A l'origine, les mesh ne sont pas vraiment prévus pour être faits à la main. Ils servent surtout à pouvoir importer des objets depuis des modeleurs (qui ne font que des mesh, justement). Cependant, quand on sait bien ce que l'on veut faire, on peut parfois les utiliser directement.

Comment utiliser un mesh ? C'est encore assez simple : exactement comme une union, dans laquelle on ne peut mettre QUE des triangles :
Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
mesh {
        triangle {
                <0.5,0,0>
                <-0.5,0,0>
                <0,0,0.7>
        }
        triangle {
                <0.5,0,0>
                <0,0,0.7>
                <0,0.7,0>
        }
        triangle {
                <-0.5,0,0>
                <0,0,0.7>
                <0,0.7,0>
        }
        triangle {
                <0.5,0,0>
                <-0.5,0,0>
                <0,0.7,0>
        }
        pigment { rgb <1,0,0> }
}


Image utilisateur

Le seul problème du mesh, c'est que l'on ne peut pas donner de texture (ni de pigment, ni rien) aux triangles séparément...
Par contre, l'avantage, c'est qu'un mesh PEUT être utilisé dans des différences (alors qu'une union ne le peut pas car les triangles n'ont pas d'intérieur)... à deux conditions :
  • être totalement fermé. Le mesh doit n'avoir aucun trou, sinon cela ne marchera pas.
  • Il faut aussi mettre le mot-clé inside_vector, suivi d'un vecteur (n'importe lequel marchera !) dans le mesh, juste après le dernier triangle.

Regardez bien cet exemple :
Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
difference {
        mesh {
                triangle {
                        <0.5,0,0>
                        <-0.5,0,0>
                        <0,0,0.7>
                }
                triangle {
                        <0.5,0,0>
                        <0,0,0.7>
                        <0,0.7,0>
                }
                triangle {
                        <-0.5,0,0>
                        <0,0,0.7>
                        <0,0.7,0>
                }
                triangle {
                        <0.5,0,0>
                        <-0.5,0,0>
                        <0,0.7,0>
                }
                inside_vector <1,0,0>
                
        }
        box {
                <5,5,5>
                <-5,0.2,-5>
        }
        pigment { rgb <1,0,0> }
}

Image utilisateur

Le SuperEllipsoide

En réalité, le nom de cet objet est plutôt l'ellipsoïde super quadrique. o_O Mais superellipsoïde fera l'affaire, non ?.. :lol:

Un superellipsoïde, c'est un truc assez bizarre. Déjà la manière de le faire : on n'a besoin que d'un vecteur à deux dimensions, c'est tout. :o
Pour répondre brièvement, je pourrais vous dire qu'un superellipsoïde, c'est le mélange entre un cube, un cylindre et une sphère. Mais là, vous ne comprendriez plus rien Image utilisateur
En fait, c'est tout simplement un cube, dont on a arrondi certaines arêtes.
Et le vecteur à deux dimensions sert à paramétrer ces arrondissements ^^ .

Ce vecteur ne donne pas une position, mais simplement un couple de valeurs : e et n. Ces deux valeurs doivent être strictement supérieures à 0...
Pour des valeurs très basses (<0.01,0.01>) le superellipsoïde se rapproche du cube qui va de <-1,-1,-1> à <1,1,1>.

Influence du premier paramètre : e



On va faire changer le premier paramètre, en laissant le second à 0.01.
Voici 9 exemples, avec la valeur de e indiquée :
Image utilisateur
On voit bien que la valeur de e permet d'indiquer l'arrondissement des arêtes parallèles à l'axe des z.

Voici 9 autres exemples, cette fois en faisant varier le paramètre n, et en laissant e à 0.01 :
Image utilisateur
Ici, on voit bien que les arêtes qui sont touchées sont les arêtes parallèles aux axes x et y.

En combinant e et n, on peut arriver à des trucs sympas :
Image utilisateur
Le cube aux arêtes arrondies est obtenu avec un vecteur <0.2,0.2> (par exemple !)

Bon, bon, vous voulez peut-être savoir comment l'utiliser dans votre scène ? Le mot-clé est superellipsoid, et, comme je vous l'ai dit, il ne prend qu'un vecteur en paramètres :
Code : C
1
2
3
4
superellipsoid {
        <0.2,0.2>
        pigment { rgb <1,0,0> }
}


Comme le superellipsoïde est automatiquement au centre, et a une largeur de 2, vous aurez certainement besoin de lui appliquer un scale et un translate ;) .

Du texte

Eh oui, il est possible de faire du texte en 3D !
Et très facilement, en plus... :D
Le mot-clé est text. La première chose à mettre est ttf, suivi du chemin vers une police de caractères TrueTypeFont. Attention, il faut mettre le chemin entre guillemets.
Les apostrophes (ou guillemets simples) ne fonctionnent PAS ! Utilisez des guillemets doubles.

Ensuite, il faut insérer le texte à écrire, lui aussi entre guillemets.

Ensuite, il faut mettre une valeur, qui sera l'épaisseur du texte.
Et enfin un vecteur, qui représente l'espacement supplémentaire entre les lettres... Si vous voulez du simple texte, mettez 0 (ou <0,0,0>), mais si vous voulez faire un texte en "escalier", vous pouvez mettre des valeurs comme <0,-0.2,0>... Attention : tout décalage sur l'axe des z sera ignoré.

Le texte commence à l'origine (le coin inférieur gauche du texte est <0,0,0>). Le texte s'étend vers les X, et l'épaisseur se fait vers les Z.
Pour mettre des guillemets dans le texte, il faut mettre un anti-slash \ juste avant :
Code : Autre
1
"du texte avec des \" guillemets \" dedans"

donnera
Code : Autre
1
du texte avec des " guillemets " dedans

De même, pour mettre un caractère anti-slash, il faudra en mettre un autre juste devant :
Code : Autre
1
"Voilà un \\. C'est un \"antislash\" !"

donnera
Code : Autre
1
Voilà un \. C'est un "antislash" !

Afin de pouvoir utiliser les accents, il faut ajouter ceci au début de la scène :
Code : Autre
1
global_settings { charset utf8 }


Voici une exemple complet :
Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
global_settings { charset utf8 }
 
camera {
        location <7,5,-13>
        look_at <7,0,0>
}
 
light_source {
        <7,5,-10>
        rgb <1,1,1>
}
 
 
text {
        ttf "arial.ttf"
        "Le texte avec POV-Ray, c'est facile !"
        01
        0
        pigment { rgb <1,0,0> }
}


(cela suppose que la police arial.ttf est dans le même dossier)
Image utilisateur

Le height_field

Avec le height_field, on commence à entrer vers les trucs amusants - et utiles !
Un height_field transforme une image bitmap (c'est-à-dire pixelisée, et non vectorielle) en une surface, dont la hauteur de chaque point dépend de l'image de la couleur d'un pixel de l'image.
En fait, cette forme est composée de triangles, dont les hauteurs dépendent directement des pixels de l'image.
Si l'image est assez grande, beaucoup de triangles seront utilisés, et le résultat sera plus précis.
La taille de l'image (en pixels) donne donc la précision du height_field, tandis que le nombre de couleurs donne sa précision pour les hauteurs.
Il vaut mieux n'utiliser que des couleurs en noir et blanc. Les pixels blancs ont la plus haute valeur, donc la plus grande hauteur ; les pixels noirs la plus basse, donc la plus faible hauteur. Voilà comment ça marche :
Image utilisateur

Un height_field a donc besoin d'une image pour créer la surface. De nombreux formats d'images sont reconnus : gif, tga, pot, png, pgm, ppm, jpg, tiff et sys. Je vous conseille le format png, mais c'est à vous de choisir.

Pour créer un height_field, il faut écrire... height_field ! Le premier paramètre est le type d'image (gif, png, etc.). Le second est le nom de l'image, entre guillemets.
Il est ensuite possible d'ajouter smooth, qui permettra de lisser le height_field, pour de meilleurs rendus. Mais attention ! smooth fonctionne comme les pseudo-normales, c'est-à-dire qu'il donne l'impression de lisser le height_field, en n'agissant que sur les effets de lumière (ombre, etc.). De plus, il n'améliore pas véritablement la qualité, et ne donne de bons rendus qu'à bonne distance.
Mais alors, smooth, c'est nul ?

Pas du tout ! Il permet d'effacer l'effet angulaire des paysages. Mais il n'est pas si utile qu'il en a l'air, c'est tout.

Il est également possible de mettre water_level, suivi d'une valeur entre 0 et 1. Ceci permettra de ne prendre, dans le height_field, que ce qui se trouve au-dessus de cette valeur. Cela permet de donner le niveau de l'eau lors de la création de paysages, par exemple...

Voici un exemple assez simple :
D'abord, l'image de base :
Image utilisateur
Et le code :
Code : C
1
2
3
4
5
6
7
height_field {
        png
        "height_field.png"
        pigment { rgb <1,0,0> }
        translate <-0.5,0,-0.5>
        scale <10,3,10>
}

Qu'est-ce que ça fait ? Ça crée le height_field (qui est situé dans le cube qui va de <0,0,0> à <1,1,1>), puis un translate le place au centre, et scale lui donne les bonnes dimensions. Ici, vu que l'image est assez précise (400 * 400 pixels), et qu'on est trop loin pour voir la différence, on n'a pas besoin de smooth.

Voilà le résultat :
Image utilisateur
Pas mal, hein ? ^^

Le blob

Un blob, c'est... très dur à expliquer ! :lol:
Imaginez des points et des lignes, émettant tous une certaine force. Cette force, maximale dans le point ou la ligne, diminue en s'éloignant. Lorsque deux points sont proches, les forces des deux points s'ajoutent, etc.
Maintenant, imaginez qu'une surface est créée sur tous les points où la force est la même. C'est plus ou moins ce qu'est un blob...
o_O
Un blob est constitué de sphères et de cylindres, possédant tous une "force maximale". La force au centre de ces sphères (ou cylindres) est égale à cette force maximale, et nulle au bord de la sphère. Voilà un schéma explicatif :
Image utilisateur
Là, si on prend tous les points ayant la même force, on trouvera une sphère. Le blob n'a donc pas grand intérêt à ce stade.
En revanche, si l'on approche une autre sphère, les forces des deux sphères vont s'additionner à certains endroits, rendant le résultat bien plus intéressant !
Image utilisateur
Comme on peut le voir, les deux sphères se mélangent au milieu, et la surface liant tous les points de même valeur a donc une forme différente !

Alors, voilà comment faire un blob : le mot-clé est blob (...). La première chose à mettre est threshold, suivi de la valeur-seuil. C'est la valeur en-dessous de laquelle les points ne font plus partie du blob, c'est-à-dire la valeur de tous les points de la surface.

Ensuite, on peut mettre autant de sphères ou de cylindres que l'on veut. Mais attention, dans la définition de ces sphères et cylindres, il faut ajouter, après la valeur du rayon, la valeur de la force maximale.
Par exemple,
Code : C
1
2
3
4
5
sphere {
    <0,0,0>
    1
    3
}

...donnera une sphère de centre <0,0,0>, de rayon 1 et dont la force au centre vaudra 3.

Attention : les cylindres ne sont pas exactement des cylindres : une sphère de même rayon que le cylindre est ajouté à chaque extrémité du cylindre :
Image utilisateur

Bon, voilà un exemple assez simple de blob :

Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
blob  {
        threshold 1
        sphere {
                <-1,0,0>
                1.5
                2
        }
        sphere {
                <1,0,0>
                1.5
                2
        }
        pigment { rgb <1,0,0> }
}

Image utilisateur

Vous avez compris ?...
Pour que les forces se combinent, il faut que les sphères se chevauchent ;) .

Il est possible de mettre des forces négatives parmi les éléments de la forme. Dans ce cas, cela "repoussera" le blob... Mais il faudra alors mettre une virgule après le rayon :
Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
blob  {
        threshold 1
        sphere {
                <-1,0,0>
                1.5,
                -2
        }
        sphere {
                <1,0,0>
                1.5
                2
        }
        pigment { rgb <1,0,0> }
}

Sans cela, POV-Ray comprendrait que le -2 s'applique au 1.5 du rayon Image utilisateur

Les blob sont très efficaces pour des formes organiques, surtout parce qu'ils n'ont pas de coins, mais uniquement des arrondis.
Bon, vous avez fait le plus simple :p .

Ces objets, sans être nécessaires à vos scènes, se montreront quand même très utiles par moments (surtout le texte !).
Bon, dormez, reposez-vous, préparez-vous... le pire est encore à venir ! :-°
Chapitre précédent Sommaire Chapitre suivant

Partager

6 commentaires pour "Formes avancées (1/2)"
Note moyenne : 3.96 / 4 (24 votes)
Pseudo Commentaire
Hors ligne pacman74 # Posté le 14/09/2006 à 19:22:39

Un très bon début de tutos très utile et pratique;) .J'ai hate de lire la suite.
Si l'idée te venait de faire une liste des commandes je suis absolument pour :D .
Hors ligne Gyscos # Posté le 14/09/2006 à 21:52:25
Better burn out than fade away
Avatar

Ville : Palaiseau
Pays : France métropolitaine
Études : Polytechnique

Ca viendra ! Le prochain chapitre portera sur les dernières formes avancées, et la partie suivante sur le "simplifiage de vie", c'est à dire le langage non-descriptif et les lignes de commande...

Three Wise Droids
Currently working on Spirits Of Heaven, a T-RPG for Android (check the git page) :
http://www.spirits-of-heaven.com
 
Hors ligne titi.be # Posté le 25/11/2006 à 12:30:08
Avatar

Tout comme pacman74 vivement la suite :p en attendent on peut déjà s'entrainer avec ce que l'on à
19
Hors ligne Gyscos # Posté le 25/11/2006 à 20:35:34
Better burn out than fade away
Avatar

Ville : Palaiseau
Pays : France métropolitaine
Études : Polytechnique

Personnellement, je suis resté pendant 1-2 ans à ce niveau-là de POV-Ray... on peut très bien se passer du reste (bon, ok, la prochaine partie sera vachement super mega cool, mais...)
Avec les height_field, les blobs et les textures, vous pouvez déjà presque tout faire...

Des conseils pour s'entraîner : reproduisez des modèles, comme votre bureau, votre chambre, immeuble/maison, ... en mesurant les distances et en utilisant 1 unité = 1 mètre... ça ne devrait pas être trop compliqué (les boites et les cylindres suffisent généralement) et ça donne déjà des trucs sympa...

Sinon, l'autre point important est les textures... Tout est déjà dit, donc vous pouvez déjà créer celles que vous voulez... personnellement, les textures, c'est mon point faible, et ça ma manque vraiment...

Three Wise Droids
Currently working on Spirits Of Heaven, a T-RPG for Android (check the git page) :
http://www.spirits-of-heaven.com
 
Hors ligne Assiliza # Posté le 02/12/2006 à 21:53:38
Avatar

J'adore Pov-Ray et je trouve ce tutoriel très enrichissant (mon avatar est fait avec Pov-Ray)Continue je t'encourage ;) !!
Heu.. le blob ça marche pas très bien sur mon ordinateur !

Voir tous les commentaires