Ce commit est un nettoyage de l'interaction d'auto contact de Metafor et l'utilisation de bounding box pour le MultiProjectionWire et le MultiProjectionSkin.
J'ai fait une modification pour pouvoir visualiser les contacts tools des interactions de contact défo-défo et d'auto-contact, car il y avait un bug d'affichage.
Sans grande surprise, le tests des bounding box des MultiProjectionWire et MultiProjectionSkin n'était pas utiliser pour l'opération de projection d'un point sur ces entités là. J'ai tout simplement ajouté ce test avant d'effectuer une quelconque opération de projection sur un segment du wire ou une face de la skin.
Dans le contexte de l'auto-contact, on doit spécifier l'entité géométrique sur laquelle on veut définir ce type d'interaction de contact : il n'y a plus de distinctions entre un corps dit maître et l'autre esclave dans ce type d'interaction.
Jusqu'à présent, on créait et assignait un outil spécifique pour chaque nœud de cette interaction, dans lequel on éliminait tout simplement les segments/faces adjacents/tes aux nœuds. Comme résultat, il y avait autant d'outils que de nœuds dans ce type d'interaction de contact.
Sous cette forme là, on pouvait utiliser les procédures de calcul de projection utilisée dans le contact défo-défo immédiatement puisque chaque nœud avait un outil bien particulier. C'était une manière de faire à l'époque !
Au lieu de procéder de cette manière là, j'ai modifié la structure de l'interaction d'auto-contact. Désormais, il existe un seul outil de contact et pour éviter d'accepter des projections triviales dans l'opération de projection, j'ai ajouté une liste de segments/faces à exclure à l'opération de projection.
Informatiquement parlant, avant chaque opération de projection (fonction initialise(), initIteration(), updateStickingPoint() et computeTangentValues()), on doit construite cette liste d'exclusion et la passer à l'opérateur de projection fourni par l'outil de contact.
Pour chaque élément de contact, on passe directement par la méthode de contact stockée dans l'interaction de contact pour faire les quatre types d'opération pré-citée.
J'ai fait le choix de ne pas stocker l'information dans l'élément de contact et donc il faut à chaque fois recalculer ces listes d'exclusion avant les opérations précitées. Dans cette liste d'exclusion, je considère uniquement les segments/faces frontières du domaine (non celle à l'intérieur de la matière !). Ce-là évite de la stocker dans l'élément.
Cette liste d'exclusion est sous forme de table de hachage std::unordered_map pour pouvoir vérifier très rapidement si le segment/la face doit être exclue de la liste.
Pour transmettre cette liste d'exclusion à l'opérateur de projection, j'ai fait le choix d'ajouter une liste d'exclusion via une fonction setExclusionList() et ainsi je considère cela comme une option de l'opérateur de projection en général qu'il faut configurer au préalable avant de faire une projection d'un point. Une autre alternative serait de fournir un pointeur à la fonction projection() mais dans ce cas, il faut adapter l'interface de tous les opérateurs de projection. Évidemment, lors de l'instanciation de l'opérateur de projection, nous avons un pointeur NUL pour cette liste d'exclusion. Il y a un système de getExclusionList()/setExclusionList() intelligent qui crée l'objet si besoin et qu'il le vide aussi si nécessaire.
Attention, il est fort probable que la version proposée pour traiter plus proprement l'auto-contact puisse être améliorer informatiquement parlant.
Au niveau des performances, c'est assez aléatoire le gain obtenu pour le contact défo-défo, mais pour l'auto contact, il y a bel et bien un gain de performance. Voici les infos CPU sur Thorgal :
Cas Test | Old | New | Diff | Rel Diff |
---|---|---|---|---|
apps.bImp.laursenContact2D - User CPU Time [ .py][ .res] | 4.81 | 5.33 | 5.20E-01 | 10.8 |
apps.bImp.laursenContact2DAna - User CPU Time [ .py][ .res] | 4.56 | 4.84 | 2.80E-01 | 6.1 |
apps.bImp.laursenContact3D - User CPU Time [ .py][ .res] | 60.24 | 37.42 | -2.28E+01 | -37.9 |
apps.bImp.laursenContact3DAna - User CPU Time [ .py][ .res] | 56.08 | 53.03 | -3.05E+00 | -5.4 |
apps.imp.long - User CPU Time [ .py][ .res] | 901.18 | 204.59 | -6.97E+02 | -77.3 |
apps.imp.longCoarseMesh - User CPU Time [ .py][ .res] | 504.73 | 443.91 | -6.08E+01 | -12.1 |
apps.imp.longHoriz - User CPU Time [ .py][ .res] | 44.05 | 56.59 | 1.25E+01 | 28.5 |
snecma.tests.snecmaRup - User CPU Time [ .py][ .res] | 151.21 | 77 | -7.42E+01 | -49.1 |
[a]: [r]:
[a]: [r]: