1 pièce(s) jointe(s)
Bug dans l'implémentation du skinning (basé sur des os, avec des poids etc).
Je ne sais pas comment mieux décrire les choses que ça.
Pour le contexte: j'essaie d'implémenter de l'animation keyframe-based, bone-based, bref, le truc simple :roll:
Je galère dessus depuis des jours, et après pas mal de crises de larme et d'états d’hébétements, j'ai décidé de venir demander sur un forum.
Pourquoi avoir autant attendu ? Parce que les rares fois où je viens poser une question, je n'obtiens jamais de réponse pertinente. Assez souvent je n'obtiens pas de réponse du tout, généralement j'obtiens une réponse hors-sujet et rapidement le fil s'arrête.
Là, en l'occurrence, je travail sur un projet en C, avec un format custom en import, un process de compilation fait main ... et déjà j'ai fait fuir tout le monde.
Posons les choses: ce que j'ai:
Pièce jointe 573734
Pour cette image j'ai volontairement limité le nombre d'os par vertex à 1. Ceci est juste pour dire que l'envoie des os fonctionne, l'envoie des poids fonctionne, le setup fonctionne de ce côté là. Notez aussi que lorsque j'envoie des os correspondant à des matrices identités l'objet s'affiche bien dans sa position au repos.
Maintenant la théorie (j'utilise le terme "position" comme un raccourci de "translation" + "rotation").
1/ calculer la position globale de chaque os en position "repos".
2/ pour chacune de ces position globale, calculer l'inverse de cette position.
3/ calculer la position globale de chaque os pour la keyframe concernée (celle qu'on veut afficher).
4/ multiplier chacun de ces positions (celles de la keyframe) par les inverse correspondantes précédemment calculée.
Sauf que.
Sauf que déjà personne ne dit s'il faut multiplier à droite ou à gauche.
En fait, aucun tutoriel ne donne d'exemple AVEC valeurs numériques, ce qui me permettrait de vérifier étape après étape que tout fonctionne.
Il y a aussi toute une histoire de matrice ligne vs matrice colonne et, l'un dans l'autre, je finis par ne plus être sur de rien.
(et oui vous l'aurez deviné, je ne suis pas un grand fan des matrices. Sauf que généralement en forçant un peu ça finit par passer, en touillant et en testant plein de combinaisons, ou en se posant et en réfléchissant à ce que je fais. Là ça fait des jours que je suis dessus, des jours à regarder bêtement le même code, à essayer et réessayer toutes les possibilités, et dans l'incapacité de m'assurer qu'au moins mes outils de base sont bon. Je ne sais pas si mon truc pour faire l'inverse d'une matrice est bon, il n'est pas de moi mais de jogamp (jogl) et leur documentation n'est même pas cohérente).
Donc voici un lien vers le bousin. Il est trop gros par rapport à ce qu'il devrait être, notamment à cause des fichiers obj. Et je le précise tout de suite, ils ne sont pas de moi mais de Kenney, sous licence CC0 si mes souvenirs sont bons.
https://drive.google.com/file/d/1Dg-...ew?usp=sharing
La compilation du programme se fait avec "php Makefile.php", pour forcer la recompilation de tout c'est "php Makefile.php -f".
Pour lancer le programme et voir un exemple de ce qui ne va pas, c'est "main.exe _game/script.lua".
Si vous le lancez sans paramètres il utilisera "_test/script3D.lua", qui n'est pas ce que vous voulez.
Pour une description du format
https://drive.google.com/file/d/12lO...ew?usp=sharing
c'est un fichier html "self contained".
Mais si vous voulez une description c'est "obj + des infos pour animer".
Le basic des infos: chaque animation a des keyframes associées, qui ont chacune une durée et des "armature update". Chaque armature update contient la position (translation + rotation) d'un os.
Le fichier contient aussi les os en position de repos.
Les données "obj" sont utilisables telle quelle, c'est-à-dire que même en ne regardant pas les données d'animation on pourrait afficher le mesh au repos. Mais encore une fois c'est classique, je ne suis pas original là-dessus.
Le fichier incriminé pour ce bug me semble être
3D/gmf/gmf_plus.c
Et ... je sais que ça ne sert à rien de dire tout ça.
Bref, demain j'aurais sûrement une vidéo montrant le problème "en animation".
(Et le problème ne peut pas venir de l'interpolation puisque je n'en fais pas. Pour le moment à l'export j'exporte TOUTES les frames, pas seulement les keyframes).
De ce que j'ai pu vérifier dans le fichier les données sont correctement exportées (correspondent au format).
Je ne sais pas d'où vient le problème (et il peut tout à fait venir de "common/vector.c" qui définit tout ce qui a trait aux matrices).
Je ne sais pas par où commencer et je pète un câble.