TP1 : Animation de tissu

Rappels

Le but de ces séances d'animation est d'animer un personnage habillé. La première étape est l'animation du vêtement. Pour cela, nous allons appliquer ce qui a été vu en cours et utiliser un système masse-ressort.

L'an dernier, vous avez implémenté un tel système pour animer des chaînes articulées. Les sources mises à votre disposition correspondent au travail que vous avez effectué en cours de Graphique 3D :

N'hésitez pas à parcourir le code pour vous remettre dans le bain.

Modèle mécanique

Réglez character dans main.cpp à 1. Vous pouvez maintenant voir les maillages du personnage et du vêtement que nous allons animer. Ce sont les modèles visuels des objets.

Complétez Dynamics::setFromMesh pour créer le système masse-ressort qui correspond au maillage. Quand vous lancez l'application, vous voyez maintenant les modèles visuels ainsi que le système masse-ressort animé. Ce système masse-ressort est appelé modèle mécanique du vêtement.

Couplage modèle visuel/modèle mécanique

Comme vous l'avez constaté, le modèle mécanique est animé mais pas le modèle visuel. On veut pourtant que le maillage suive le système masse-ressort. On appelle cela le couplage modèle mécanique/modèle visuel.

Remplissez Mesh::updateMesh pour que les deux modèles soient couplés. Vous obtenez une animation du modèle mécanique et du modèle visuel.

Modèle de collision

Le vêtement est maintenant animé par un système masse-ressort mais il n'a aucune interaction avec le corps du personnage. Vous avez pourtant vu l'an dernier comment détecter et répondre à des collisions. Vous avez en particulier codé la détection de collision sphère/sphère. Nous allons pour ce TP nous servir de ces connaissances pour faire interagir le vêtement et le corps.

Le modèle visuel du corps est un maillage. Or nous n'avons pas encore implémenté la détection de collision entre maillages. Puisque nous savons traiter les collision de sphères, nous allons créer une approximation du modèle visuel composée de sphères. Ce modèle est chargé par le programme dans Dynamics::addSphereModel. Décommentez l'appel à cette méthode dans setDynamics et complétez cette méthode en ajoutant pour chaque sphère une masse statique de rayon r à la position (x,y,z).

Vous pouvez maintenant voir le modèle de sphères qui approxime le personnage. On appelle ce modèle le modèle de collision du personnage. Le modèle de collision du vêtement est le même que son modèle mécanique. Ces deux modèles intéragissent donc pour faire interagir le corps et le vêtement.

Résultats et améliorations

Le résultat qui nous intéresse est l'animation des modèles visuels. Pour voir cette animation, dans animation.cpp, passez drawMass drawCollisionModel à 0.

Comme vous pouvez le constater, il existe toujours des interpénétrations entre les 2 modèles et le vêtement se détend. Quelles solutions rapides pouvez-vous proposer à ces problèmes? (Réfléchissez plus à des modifications de paramètres qu'à des nouveaux algorithmes de collision ou d'animation.)