IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

OpenGL Discussion :

Bug dans l'implémentation du skinning (basé sur des os, avec des poids etc).


Sujet :

OpenGL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 90
    Points : 50
    Points
    50
    Par défaut 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:
    Nom : merde.png
Affichages : 128
Taille : 3,4 Ko

    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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    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


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    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
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    comme Littlewhite je n'ai rien compris moi aussi..

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    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.

Discussions similaires

  1. [AC-2007] Champs calculés dans un état basé sur des requêtes pivot
    Par isacoz dans le forum IHM
    Réponses: 2
    Dernier message: 24/10/2014, 00h09
  2. Réponses: 0
    Dernier message: 02/05/2011, 17h37
  3. Réponses: 5
    Dernier message: 06/01/2007, 04h48
  4. Algo basé sur des nombres
    Par Kijer dans le forum Algorithmes et structures de données
    Réponses: 15
    Dernier message: 12/12/2006, 12h46
  5. Chat basé sur des sockets php5
    Par javhost dans le forum Développement
    Réponses: 1
    Dernier message: 12/07/2005, 16h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo