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

Moteurs 3D Discussion :

Problème d'algo pour mon moteur 3D


Sujet :

Moteurs 3D

  1. #1
    Membre à l'essai
    Inscrit en
    Janvier 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Janvier 2006
    Messages : 47
    Points : 24
    Points
    24
    Par défaut Problème d'algo pour mon moteur 3D
    Bonjour

    Je développe un moteur 3D depuis quelques temps, j'ai implémenté les animations et tout fonctionne correctement mais je suis confronté maintenant à un problème. Tout d'abord voici un résumé de comment ça fonctionne jusqu'à présent :

    Je crée un modèle skinné et animé sous un logiciel 3D, je l'exporte dans un format perso, j'exporte également les animations dans un autre format et je charge le tout dans mon moteur. Ensuite je crée mon modèle avec son skin (tableau qui associe à chaque vertex la somme pondérée des bones auquel il est lié) ainsi que son squelette.

    Pour assurer la bonne transformation des vertex durant l'animation, j'utilise pour chaque modèle skinné 2 squelettes : un qui est toujours à la même position, celle d'origine, et l'autre qui va bouger conformément à l'animation. Je parcours ensuite la hiérarchie de ces 2 squelettes à chaque frame et je calcule pour chaque bone une matrice qui sera égale à la matrice de passage du squelette d'origine vers le squelette courant. J'obtiens ainsi un tableau contenant autant de matrices qu'il y a de bones dans mon squelette, chaque matrice décrivant la transformation subie pour passer de la position d'origine vers la position courante, et donc la déformation que devra subir le vertex qui l'utilisera pour suivre le mouvement de son bone. J'envoie ensuite le tout au vertex shader qui multiplie alors la matrice de transformation initiale (projection * modelview) par cette matrice. Au moment de l'animation, les déformations sont correctes donc je n'ai pas d'erreur à ce niveau là.

    Maintenant, j'aimerais aller un peu plus loin en permettant au moteur de pouvoir lier un mesh à un bone, ce que font tous les moteurs 3D, mais le problème c'est que jusqu'à présent les 2 squelettes de mon mesh n'étaient pas liés à la scène car j'ai constaté que ça provoquait des problèmes dont je n'ai pas réussi à identifier correctement la cause (je ne suis pas très matheux à la base, j'ai déjà beaucoup galéré au niveau des matrices mais il y a encore des trucs qui m'échappent). J'ai donc imaginé plusieurs solutions qui s'apparentent plutôt à du bidouillage mais je vais d'abord essayer de décrire brièvement l'architecture de cette partie de l'application :

    J'ai une classe entité qui dérive d'une classe de node et qui contient un pointeur vers les 2 squelettes (eux aussi de type node). Au moment du rendu, l'entité calcule sa matrice de transformation en fonction de sa matrice locale et de la matrice world de son parent. Pour le moment je n'ai pas eu besoin de lier les 2 squelettes à l'entité car je ne m'en sert que pour calculer les transformations locales subies par les différents bones du squelette, et j'envoie ensuite au shader la matrice world de l'entité ainsi que les matrices de déformation de ses différents bones. Le shader va donc composer ces matrices pour calculer la matrice de transformation finale (en pondérant évidemment les transformations pour les vertex influencés par plusieurs bones), ce qui fait que la méthode consistant à ne pas lier les squelettes au graphe de scène marche parfaitement... jusqu'au moment où je décider de lier d'autres entités à certains bones de mon squelette.

    Etant donné qu'il n'est pas lié au graphe de scène, le bone parent de l'entité que je viens de linker ne contiendra que la transformation du bone par rapport au root du squelette, mais pas les informations sur les transformations de la caméra, ce qui fait qu'il restera toujours au même endroit par rapport à celle-ci.

    Deux solutions possibles se présentent donc :

    . Soit je link les deux squelettes à mon entité, mais ça me pose alors un problème pour calculer la matrice de passage des bones d'origines vers les bones courants. En effet, si on nomme M0 la matrice world de l'entité et M1...Mn les matrices de tous les bones du squelette d'origine et M1'...Mn' les matrices des bones courants, ça veut dire que pour un bone k, j'aurais sa matrice d'origine de cette forme :

    Mg = M1 * ... * Mk

    et sa matrice courante de cette forme :

    Mc = M1' * ... * Mk'

    et donc la matrice de passage vaudra :

    Mp = Mc * Mg^-1 = M1' * ... * Mk' * Mk^-1 * ... * M1^-1.

    Par contre si je link les 2 squelettes à l'entité, j'aurais la matrice de passage d'un bone k de la forme suivante :

    Ap = M0 * M1' * ... * Mk' * Mk^-1 * ... * M1^-1 * M0^-1 = M0 * Mp * M0^-1

    Or, arrêtez moi si je dis une bétise mais normalement pour tout M0 (sauf pour l'identité évidemment), M0 * Mp * M0^-1 =/= Mp, ce qui est d'ailleurs confirmé par les déformations complètement foireuses que subi mon modèle au moment de l'animation si j'utilise cette méthode.

    C'est la raison pour laquelle j'ai imaginé une autre solution un peu crade qui consiste simplement à stocker dans chaque entité linkée à un bone un pointeur vers l'entité "maitre", c'est à dire celle qui contient le bone auquel elle est linkée. Au moment du rendu je multiplie la matrice world de l'entité linkée par la matrice world de l'entité maitre de cette manière : WorldBoneLinké = WorldEntitéMaitre * WorldBoneLinké.
    Le problème c'est que ça ne marche toujours pas , au moment du rendu j'ai mon animation qui est jouée correctement, les déformations du meshes sont bonnes mais en revanche les objets liés se mettent n'importe où (je précise quand même qu'ils suivent bien l'animation, mais ils sont dans un autre repère que l'os auquel ils sont liés).

    Même si c'est une bidouille et qu'il faudrait sûrement que j'implémente un algo moins crade par la suite, cette méthode me semble pourtant correcte non

    Sinon j'ai imaginé une 3eme solution mais elle me parait encore plus pourrie que la 2eme, elle consisterait à laisser les deux squelettes non liés à l'entité et à utiliser un 3eme squelette lié à l'entité auxquelles seraient liées les entités filles, mais du coup ça veut dire qu'il faudra faire 3 update de squelette pour chaque entité au lieu de deux actuellement, sachant que ça utilise des inversions et des multiplications de matrices qui ne sont pas particulièrement rapide à calculer (d'autant plus que le modèle que j'utilise pour les test a 53 bones, ce qui est plutôt standard dans le jeu vidéo). En fait j'ai simplement imaginé cette méthode tout à l'heure et je n'ai pas encore bien réfléchi à toutes les conséquences, si ça se trouve je risque d'être confronté à d'autres difficultés ou bidouilles que je n'ose imaginer.

    Voilà, merci pour votre patience pour ceux qui ont lu jusqu'au bout, j'aurais bien aimé être plus concis et plus clair mais c'est pas évident d'expliquer tout ça en peu de mot. Si l'un d'entre vous a déjà travaillé sur un moteur 3D et qu'il connait les techniques qui sont utilisées dans ce genre de cas, car à mon avis il doit exister une solution plus simple et élégante que mes algos, je serais ravi de discuter avec lui

  2. #2
    Membre à l'essai
    Inscrit en
    Janvier 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Janvier 2006
    Messages : 47
    Points : 24
    Points
    24
    Par défaut
    Bon finalement j'ai reussi a trouver une solution, j'ai utilise la 2eme methode et le probleme venait simplement du fait que je ne faisais que linker les diffentes entites entre elles sans les positionner correctement. Elles etaient donc quand meme bien linkees, je n'ai eu qu'a les multiplier au prealable par la bonne matrice et tout marche bien.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 8
    Points : 6
    Points
    6
    Par défaut Problème de robotique
    Salut,

    Rien à rajouter, tu l'as dit dans ton explication : a partir d'une position racine qui te donne des points/surfaces en X, Y, Z, chaque sous-élément est dans un repère différent.

    A chaque fois qu'on change de repère, on multiple par une matrice, et donc sa matrice inverse pour revenir dans le repère d'origine.

    Si j'ai une main qui bouge au bout d'un bras je calcule les positions de la main (je suis dans le repère du bras) puis je multiple par la matrice inverse qui me fait revenir le bras dans le repère du corps. Si le corps bouge lui aussi car il est dans un véhicule, je multiplie par la matrice inverse du véhicule par rapport à ma scène, qui elle même a un point de caméra pas forcément à 45°. Si on a plusieurs transformations successives, on peut avoir intéret a garder une partie des transformations en mémoire et ne recalculer que celle qui change tout le temps (tant que ma main ne bouge pas par rapport au bras ni au corps, pas de recalcul de la main ni du bras mais uniquement matrice inverse corps par rapport à la scène).

    Pour chaque repère, pointeur vers son repère 'parent' semble obligatoire. Le dernier repère 'parent' est la caméra. Si j'ai plusieurs caméras, je n'ai besoin de recalculer que la dernière transformation par exemple.

    http://fr.wikipedia.org/wiki/Coordon...homog%C3%A8nes

    Tous les déplacements en 3D sont des multiplications de matrice. On y trouve aussi les homotéthies (zoom plus ou moins sur la scène).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème d'arborescence pour mon site.
    Par Moxostoma dans le forum Balisage (X)HTML et validation W3C
    Réponses: 8
    Dernier message: 22/08/2009, 12h27
  2. problème d'installation pour mon modem
    Par Psycko3 dans le forum Ubuntu
    Réponses: 1
    Dernier message: 22/10/2008, 21h21
  3. Problème de compatibilité pour mon menu déroulant
    Par tidus_6_9_2 dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 29/01/2008, 15h29
  4. trouve pas comment faire un algo pour mon programme
    Par unknoweb dans le forum Débuter avec Java
    Réponses: 21
    Dernier message: 12/04/2007, 18h17

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