Il y a six objets finis, fins, qui n'ont pas d'intérieur bien défini. Ce sont la surface bicubique, le disque, le triangle lissé, le triangle, le polygone et le réseau. Ils peuvent être combinés dans des unions CSG, mais dans aucun autre type de CSG (ou dans une déclaration clipped_by). Parce que ce sont des types finis, POV-Ray peut utiliser l'encapsulage automatique pour accélérer les temps de rendu. Comme toutes les autres formes, ils peuvent être déplacés, tournés et retaillés.
Une surface bicubique est une surface courbe en 3D créée à partir d'un maillage de triangles. POV-Ray supporte un type de surface bicubique appelée surface de Bezier. Une surface bicubique est définie comme suit :
BICUBIC_PATCH: bicubic_patch { PATCH_ITEMS... <Point_1>,<Point_2>,<Point_3>,<Point_4>, <Point_5>,<Point_6>,<Point_7>,<Point_8>, <Point_9>,<Point_10>,<Point_11>,<Point_12>, <Point_13>,<Point_14>,<Point_15>,<Point_16> [OBJECT_MODIFIERS...] } PATCH_ITEMS: type Patch_Type | u_steps Num_U_Steps | v_steps Num_V_Steps | flatness Flatness
Les valeurs par défaut sont :
flatness : 0.0 u_steps : 0 v_steps : 0
Le mot clé type est suivi par un numérique Patch_Type qui doit être entre 0 et 1. Pour le type 0, seuls les points de contrôle sont retenus dans POV-Ray. Cela signifie qu'une quantité minimale de mémoire est utilisée, mais POV-Ray devra exécuter de nombreux calculs supplémentaires pour rendre la surface. Type 1 découpe la surface en de multiples sous-surfaces. Cela donne une accélération du rendu, au prix d'un accroissement de la mémoire consommée.
Les quatre paramètres type, flatness, u_steps et v_steps peuvent apparaître dans n'importe quel ordre. Seul type est requis. Ils sont suivis de 16 vecteurs (4 colonnes de 4) qui donnent les coordonnées x, y, z des 16 points de contrôle qui définissent la surface. La surface touche les quatre points des coins <Point_1>, <Point_4>, <Point_13> et <Point_16>, tandis que les 12 autres poussent et tirent la surface dans la forme. La surface de Bezier est enfermée par la coque convexe formée par les 16 points de contrôle, ceci est connu comme la propriété de coquille convexe.
Les mots clés u_steps et v_steps sont suivis par des valeurs numériques qui donnent le nombre minimum de lignes et de colonnes de triangles pour créer la surface. Le nombre maximum de pièces individuelles de la surface qui doivent être testées par POV-Ray, peut être calculé comme ceci : pieces = 2^u_steps * 2^v_steps.
Cela signifie que vous devez réellement garder u_steps et v_steps sous 4. La plupart des formes paraissent correctes avec u_steps 3 et v_steps 3, qui donnent 64 sous-surfaces (128 triangles lissés).
Lorsque POV-Ray traite la surface de Bezier, il fait un test de la pièce courante de la surface pour voir si elle est suffisamment plate pour prétendre être un rectangle. La déclaration qui contrôle ce test est le mot clé flatness, suivi d'un numérique. La valeur est typiquement entre 0 et 1 (le plus bas est le plus lent). Le défaut est 0.0.
Si la valeur de flatness est 0 POV-Ray subdivisera toujours la surface aux extensions spécifiées par u_steps et v_steps. Si cette valeur est supérieure à 0, alors, chaque fois que la surface est découpée, POV-Ray vérifiera s'il est nécessaire de la découper plus.
Il y a des avantages et des inconvénients aux flatness non nuls. Les avantages incluent :
- Si la surface n'est pas très courbée, cela est détecté, et POV-Ray ne perd pas de temps sur les mauvaises pièces.
- Si la surface est seulement fortement courbée sur quelques endroits, POV-Ray gardera la subdivision à ce niveau, et concentrera ses efforts sur ces endroits délicats.
Le principal inconvénient est que POV-Ray arrête ses subdivisions à un certain niveau sur une partie, et à un autre niveau sur d'autres morceaux adjacents, laissant une possibilité de craquelage. Cela est particulièrement visible sur les points éclairés où vous pouvez voir au travers. L'apparence des défauts dépend fortement de l'angle de vue.
Comme les triangles, les surfaces bicubiques ne sont pas faites pour être générées à la main. Elles doivent être créées par un utilitaire spécial. Vous pouvez trouver ces utilitaires à la même source que POV-Ray. Voici un exemple :
bicubic_patch { type 0 flatness 0.01 u_steps 4 v_steps 4 <0, 0, 2>, <1, 0, 0>, <2, 0, 0>, <3, 0,-2>, <0, 1 0>, <1, 1, 0>, <2, 1, 0>, <3, 1, 0>, <0, 2, 0>, <1, 2, 0>, <2, 2, 0>, <3, 2, 0>, <0, 3, 2>, <1, 3, 0>, <2, 3, 0>, <3, 3,-2> }
Les triangles dans une surface bicubique sont automatiquement lissés en utilisant une interpolation de la normale, mais c'est du domaine de l'utilisateur (ou de son utilitaire de génération) de créer les points de contrôle qui lisseront ensemble des groupes de surfaces.
Un autre objet plat et fini, disponible avec POV-Ray, est le disque. Il est infiniment fin, sans épaisseur. Si vous voulez un disque avec une vraie épaisseur, vous devez utiliser un cylindre court. Un disque peut être défini par :
DISC: disc { <Center>, <Normal>, Radius [, Hole_Radius] [OBJECT_MODIFIERS...] }
Les valeurs par défaut sont :
HOLE RADIUS : 0.0
Le vecteur <Center> définit les coordonnées x, y, z du centre du disque. Le vecteur <Normal> décrit l'orientation par la définition du vecteur de normale de surface. C'est suivi par un numérique donnant le Radius. Cela peut être optionnellement suivi par un autre numérique spécifiant le rayon d'un trou à faire dans le disque, en son centre.
Note : l'intérieur d'un disque est l'intérieur du plan qui le contient. Notez aussi que cela n'est pas contraint par le rayon du disque.
L'objet réseau peut être utilisé pour contenir efficacement de nombreux triangles. Sa syntaxe est :
MESH: mesh { MESH_TRIANGLE... [MESH_MODIFIER...] } MESH_TRIANGLE: triangle { <Corner_1>, <Corner_2>, <Corner_3> [uv_vectors <uv_Corner_1>, <uv_Corner_2>, <uv_Corner_3>] [MESH_TEXTURE] } | smooth_triangle { <Corner_1>, <Normal_1>, <Corner_2>, <Normal_2>, <Corner_3>, <Normal_3> [uv_vectors <uv_Corner_1>, <uv_Corner_2>, <uv_Corner_3>] [MESH_TEXTURE] } MESH_TEXTURE: texture { TEXTURE_IDENTIFIER } MESH_MODIFIER: inside_vector <direction> | hierarchy [ Boolean ] | OBJECT_MODIFIER
Les valeurs par défaut sont :
hierarchy : on
Tout nombre de triangle et/ou smooth_triangle peut être utilisé, et chacun d'eux peut être individuellement texturé par assignation d'un nom de texture. La texture doit être déclarée avant l'analyse du réseau. Il n'est pas possible d'utiliser des définitions de texture dans les déclarations des triangles. C'est une restriction nécessaire pour un stockage efficace des textures assignées. Voir "Les triangles et les triangles lissés" pour plus d'informations sur les triangles.
L'objet mesh peut supporter uv_mapping. Pour cela, pour chaque triangle, le mot clé uv_vectors doit être donné, avec trois vecteurs UV en 2D. Chaque vecteur spécifie une position dans le plan xy à partir d'où la texture doit être appliquée pour les points cibles du triangle. Voir aussi la section uv_mapping.
Les composants du réseau sont encapsulés en interne par une hiérarchie de boîtes, pour accélérer les test d'intersection. La hiérarchie encapsulante peut être désactivée avec le mot clé hierarchy off. Cela ne doit être fait que si la mémoire est insuffisante, ou si le réseau ne contient que quelques triangles. Le défaut est hierarchy on.
Les copies de réseau se réfèrent à la même série de triangles, et consomment donc très peu de mémoire. Vous pouvez facilement tracer des centaines de copies d'un réseau de 10000 triangles, sans dépasser en capacité de mémoire (si le premier réseau entre dans la mémoire). Le réseau a deux avantages sur l'union de triangles : il a besoin de moins de mémoire, et est transformé plus rapidement. Les besoins en mémoire sont réduits par la gestion efficace des sommets et des normales des triangles. Le temps d'analyse pour des réseaux transformés est réduit, car seul l'objet réseau est modifié, et non chacun des triangles, comme c'est le cas dans les unions.
Les réseaux ne peuvent, actuellement, contenir que des composants triangles, ou triangles lissés. Cette restriction peut changer, autorisant les composants polygonaux, dans le futur.
Les objets réseau de triangles (mesh et mesh2) peuvent maintenant être utilisés dans des objets CSG comme la différence et l'intersection, parce que, après l'ajout de inside_vector, ils ont un intérieur défini. Cela ne fonctionnera que pour les réseaux qui sont des volumes complètement fermés. Si les réseaux ont des trous, cela peut fonctionner, mais le résultat n'est pas garanti.
Pour déterminer si un point est dans un réseau de triangles, POV-Ray lance un rayon depuis ce point dans une direction arbitraire. Si ce vecteur coupe un nombre impair de triangles, le point est dans le réseau. Sinon, il est en-dehors du réseau. Vous pouvez spécifier la direction de ce vecteur. Par exemple, pour utiliser +z comme direction, vous devez ajouter la ligne suivante à la description du réseau (à la suite des données du réseau, mais avant les modificateurs d'objet).
inside_vector <0, 0, 1>
Cette modification n'a pas d'effet sur les unions de triangles... elles seront toujours creuses.
La nouvelle syntaxe de réseau est désignée pour une utilisation dans la conversion depuis d'autres formats de fichier.
MESH2 : mesh2 { VECTORS... LISTS... | INDICES... | MESH_MODIFIERS } VECTORS : vertex_vectors { number_of_vertices, <vertex1>, <vertex2>, ... }| normal_vectors { number_of_normals, <normal1>, <normal2>, ... }| uv_vectors { number_of_uv_vectors, <uv_vect1>, <uv_vect2>, ... } LISTS : texture_list { number_of_textures, texture { Texture1 }, texture { Texture2 }, ... }| INDICES : face_indices { number_of_faces, <index_a, index_b, index_c> [, texture_index [, texture_index, texture_index]], <index_d, index_e, index_f> [, texture_index [, texture_index, texture_index]], ... }| normal_indices { number_of_faces, <index_a, index_b, index_c>, <index_d, index_e, index_f>, ... }| uv_indices { number_of_faces, <index_a, index_b, index_c>, <index_d, index_e, index_f>, ... } MESH_MODIFIER : inside_vector <direction> | object_modifiers
mesh2 doit être spécifié avec l'ordre VECTORS..., LISTS..., INDICES.... Les sections normal_vectors, uv_vectors et texture_list sont optionnelles. Si le nombre de normales est égal au nombre de sommets alors la section normal_indices est optionnelle et les index de la section face_indices sont utilisés à la place. Même chose pour la section uv_indices.
Note : le nombre de uv_indices doit égaler le nombre de faces.
Les index sont de base zéro ! Donc le premier élément de chaque liste a l'index zéro.
Vous pouvez spécifier à la fois des triangles plats et adoucis dans le même réseau. Pour cela, spécifiez d'abord les triangles adoucis dans la section face_indices, suivis des triangles plats. Puis, spécifiez les indices de normale (dans la section normal_indices) pour seulement les triangles adoucis. Tout triangle restant sans indice de normale associé sera considéré comme un triangle plat.
Pour spécifier une texture pour un triangle individuel d'un réseau, spécifiez un index unique de texture suivi de l'index du vecteur de la face de ce triangle.
Pour spécifier trois textures pour l'interpolation de textures aux sommets, donnez trois index de texture (séparés par des virgules) suivis du vecteur de la face de ce triangle.
L'interpolation de textures aux sommets et les textures pour un triangle individuel peuvent être mélangées dans le même réseau.
Les polygones sont utiles pour créer des rectangles, des carrés et d'autres formes planes avec plus de trois angles. Leur syntaxe est :
POLYGON: polygon { Number_Of_Points, <Point_1> <Point_2>... <Point_n> [OBJECT_MODIFIER...] }
Le numérique Number_Of_Points donne le nombre de points utilisés pour définir le polygone. Les points <Point_1> à <Point_n> décrivent le polygone ou les polygones. Un polygone peut contenir tout nombre de sous-polygones, se chevauchant ou non. Si un nombre pair de polygones se chevauchent, un trou apparaît. Quand vous répétez le premier point d'un sous-polygone, il est fermé et un nouveau sous-polygone commence. Cela implique que tous les points d'un sous-polygone sont différents.
Si le dernier sous-polygone n'est pas fermé, un message d'alerte est affiché, et le programme le ferme automatiquement. Cela est pratique, car les polygones importés d'autres programmes ne sont pas toujours fermés, c'est-à-dire que le premier et le dernier point ne sont pas identiques.
Tous les points des sous-polygones sont des vecteurs à trois dimensions, qui doivent rester sur un plan. Si ce n'est pas le cas, une erreur est générée. Il est habituel d'utiliser des vecteurs bidimensionnels pour décrire le polygone. POV-Ray assumera que la valeur z est à zéro, dans ce cas.
Un polygone carré qui concorde avec l'image plane par défaut, est simplement :
polygon { 4, <0, 0>, <0, 1>, <1, 1>, <1, 0> texture { finish {ambient 1 diffuse 0} pigment {image_map {gif "test.gif"}} } //retaillez et faites pivoter si besoin est, ici }
La caractéristique sous-polygone peut être utilisée pour générer des formes complexes comme la lettre "P", où un trou est fait dans un autre polygone :
#declare P = polygon { 12, <0, 0>, <0, 6>, <4, 6>, <4, 3>, <1, 3>, <1, 0>, <0, 0>, <1, 4>, <1, 5>, <3, 5>, <3, 4>, <1, 4> }
Le premier sous-polygone (sur la première ligne) décrit la forme extérieure de la lettre "P". Le second sous-polygone (sur la seconde ligne) décrit le trou rectangulaire découpé dans la tête du "P". Les deux rectangles sont fermés, c'est-à-dire que leurs premiers et derniers points sont identiques.
La possibilité de découper des trous dans les polygones est basée sur l'utilisation des tests dedans/dehors des polygones. Un point est interne à un polygone si une ligne tirée de ce point dans une direction arbitraire, croise un nombre impair de bords (ceci est connu comme le théorème de la courbe de Jordan).
Un autre exemple très complexe qui montre un grand triangle avec trois petits trous, et trois petits triangles séparés, est donné ci-dessous :
polygon {
28,
<0, 0> <1, 0> <0, 1> <0, 0> // grand triangle extérieur
<.3, .7> <.4, .7> <.3, .8> <.3, .7> // petit triangle extérieur #1
<.5, .5> <.6, .5> <.5, .6> <.5, .5> // petit triangle extérieur #2
<.7, .3> <.8, .3> <.7, .4> <.7, .3> // petit triangle extérieur #3
<.5, .2> <.6, .2> <.5, .3> <.5, .2> // triangle interne #1
<.2, .5> <.3, .5> <.2, .6> <.2, .5> // triangle interne #2
<.1, .1> <.2, .1> <.1, .2> <.1, .1> // triangle interne #3
}
La primitive triangle est disponible pour permettre la création d'objets plus complexes que ce qu'autorisent les formes programmées. Ils ne sont pas fabriqués à la main, mais sont convertis depuis d'autres fichiers, ou générés par des utilitaires. Un triangle est défini par :
TRIANGLE: triangle { <Corner_1>, <Corner_2>, <Corner_3> [OBJECT_MODIFIER...] }
où <Corner_n> est un vecteur définissant les coordonnées x, y, z de chaque coin du triangle.
Parce que les triangles sont des surfaces parfaitement planes, il est nécessaire d'avoir un très grand nombre de très petits triangles pour représenter un surface courbe, lissée. Toutefois, la majorité de notre perception des surfaces lissées est dépendante de l'éclairage et de l'ombrage. Par une modification artificielle des normales de surface, nous pouvons simuler ces surfaces, et cacher l'aspect anguleux entre les triangles.
La primitive smooth_triangle est utilisée justement dans cette optique. Les triangles lissés utilisent une formule appelée l'interpolation de normale 'Phong', pour calculer la normale de surface en tout point du triangle, basé sur les vecteurs de normale définis aux trois coins. Cela fait apparaître le triangle comme une surface courbe lissée. Un triangle lissé est défini par :
SMOOTH_TRIANGLE: smooth_triangle { <Corner_1>, <Normal_1>, <Corner_2>, <Normal_2>, <Corner_3>, <Normal_3> [OBJECT_MODIFIER...] }
où les coins sont définis comme dans un triangle régulier, et <Normal_n> est un vecteur décrivant la direction de la normale à chaque coin.
Ces vecteurs de normale sont extrêmement difficiles à calculer à la main. C'est pourquoi les triangles lissés sont toujours générés par des programmes utilitaires. Pour finir les résultats du lissage, tous les triangles qui ont un sommet commun, doivent avoir le même vecteur de normale à ce sommet. Généralement, les normales lissées doivent avoir la moyenne des normales actuelles des triangles qui rejoignent ce point.
L'objet mesh est une façon de combiner plusieurs objets triangle et smooth_triangle de manière efficace. Voir "Le réseau" pour les détails.
| 3.3.3 Les primitives solides infinies |