Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Membre du Club
    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

    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:


    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.

  2. #2
    Responsable 2D/3D/Jeux

    Bonjour,

    Bravo, vous avez gagné, je n'ai rien compris .
    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.
    Pourquoi faites vous tout cela ? Si c'est pour trouver la position de chaque os, pour une keyframe donnée, pourquoi ne l'envoyée vous pas directement par le code C, au GPU ? D'autant plus que vous dites que l'envoi fonctionne.
    Ce que je veux dire par là, c'est qu'au temps T, les positions doivent correspondant à celles provenant du fichier d'animation. Donc, il ne devrait pas y avoir autant de calcul ? Les positions intermédiaires proviennent de l'interpolation T avec T-1.

    Vous avez beaucoup (trop) de doutes sur vos codes de matrice ou de vecteur. Soit vous utilisez une bibliothèque (style GLM, ou vous avez parlé de JOGL (pour un projet C ?)), soit vous vérifiez votre code avec des tests unitaires. Mais au moment d'implémenter des animations, il faudrait ne plus douter d'un tel code.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Rédacteur/Modérateur

    Question con mais : l'inverse d'une position c'est ?

    Passer le bashing du forum, puis le self bashing : le problème est ?
    Tu veux animer un skeleton ? Chaque bone est un truc à animer et certains ont des dépendances sur d'autres, ce qui revient à multiplier leurs matrices.
    Quant à l'ordre de multiplication : tu multiplies la matrice globale/dépendante par la matrice locale afin d'avoir la matrice globale, il me semble. M'enfin au pire avec 1 essai tu verras rapidement si les transformations sont correctes ou pas et si l'ordre est correct ou pas.
    Enfin pour les matrices lignes ou colonnes, c'est juste un nom pour des matrices à 1 ligne ou 1 colonne... Et le niveau 0 de connaissance des matrices dit qu'une matrice M*N (lignes*colonnes) ne peut multiplier qu'une matrice N*O ce qui donne une matrice M*O. Tout simplement parce que tu sommes et multiplies case par case.
    https://en.wikipedia.org/wiki/Matrix...multiplication
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    Expert éminent sénior
    comme Littlewhite je n'ai rien compris moi aussi..
    La théorie, c'est quand on sait tout et que rien ne fonctionne.
    La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.
    ( A Einstein)

  5. #5
    Responsable 2D/3D/Jeux

    Citation Envoyé par Bousk Voir le message
    Question con mais : l'inverse d'une position c'est ?
    Pour ce cas, j'ai interprété en : inverse de la matrice contenant la position et la rotation au vu de cette mention :
    Maintenant la théorie (j'utilise le terme "position" comme un raccourci de "translation" + "rotation").
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

###raw>template_hook.ano_emploi###