TD8 : Surfaces de subdivision
L'objectif de ce TP est d'implémenter le schéma de subdivision de Loop ("Smooth Subdivision Surfaces Based on Triangles", 1987). Ce schéma ne s'applique qu'aux maillages triangulaires ; il subdivise chaque triangle en quatre. Il s'agit d'un schéma approximant qui converge vers une surface lisse de continuité $C^2$.




Les maillages utilisés dans ce TP sont téléchargeables ici :
curl -O https://www.labri.fr/perso/pbenard/teaching/simg/Ressources/modelsLoop.zip
1. Principe
L'algorithme est relativement simple :
1. insérer un nouveau sommet $u$ sur chaque arête de chaque triangle à la position : $$u_1 = \frac{3}{8} v_0 + \frac{3}{8} v_2 + \frac{1}{8} v_1 + \frac{1}{8} v_3$$
2. créer les 4 triangles : $$(v_0, u_5, u_1), (u_5, v_1, u_3), (u_3, v_2, u_1) \text{ et } (u_1, u_5, u_3)$$
2. Implémentation
Dans un premier temps, ne considérez que des maillages fermés sans bords ouverts. Il est possible d'implémenter la subdivision en place, sans dupliquer la structure en demi-arête. Pour cela, je vous conseille de commencer par l'étape 2 en stockant les positions mises-à-jour dans une nouvelle propriété des sommets, par exemple :
new_pos = _halfEdge.vertex_property<Point>("v:new_position")
Effectuez ensuite la subdivision de toutes les arêtes (Surface_mesh::insert_vertex
) en utilisant la position initiale des sommets :
old_pos = _halfEdge.vertex_property<Point>("v:point");
Assemblez les 4 nouveaux triangles. Je vous recommande d'utiliser les méthodes de bas-niveau de Surface_mesh (new_face
, new_edge
, set_halfedge
, set_next_halfedge
et set_face
à rendre public
) plutôt que la fonction add_triangle
qui peut modifier profondément la topologie du maillage.
Remplacez enfin les anciennes positions (old_pos
) par les nouvelles (new_pos
) et rechargez les buffers OpenGL (Mesh::load
).


Considérez maintenant le cas des maillages possédant des bords ouverts. La méthode Surface_mesh::is_boundary
vous permet de déterminer si un sommet, une arête ou un face est sur un tel bord.



