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

Ogre Discussion :

Problème de rotation de bone


Sujet :

Ogre

  1. #1
    Membre du Club Avatar de Dodin
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2009
    Messages : 104
    Points : 66
    Points
    66
    Par défaut Problème de rotation de bone
    Bonjour à vous !

    Voici mon problème, j'ai un personnage qui possède des Postures/Animations diverses et une "posture" initiale.
    J'arrive à lui appliquer une rotation de la tête quand aucune animations est chargées cad quand il est en posture initiale, mais quand je lui applique une rotation quand une des postures ou animations est chargées la tête effectue des rotations étranges.

    De plus pour ma rotation j'utilise qu'une composante x, et quand une posture/anim est load la tête tourne dans tous les sens...

    Je pense que j'ai un problème de repère différent entre ma posture de bases et mes anims.

    Comment pourrai-je forcé mes animations à avoir le même repère que ma posture initiale ?

    Merci pour votre aide !

  2. #2
    Membre éprouvé Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Points : 1 087
    Points
    1 087
    Par défaut
    Peut-être devrais-tu utiliser les quaternions pour représenter les rotations de tes bones. Pour la tête j'imagine qu'elle est dépendante d'autre bones, peut-être dois-tu multiplier son quaternion avec le quaternion d'autres bones pour obtenir la rotation finale.

  3. #3
    Membre du Club Avatar de Dodin
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2009
    Messages : 104
    Points : 66
    Points
    66
    Par défaut
    Salut oxyde356 !

    Merci pour ta réponse j'ai essayé mais je suis confronté à un autre problème...
    J'ai fait un test pour voir si j'arrivé à bien sauvegarder mes Quaternions et a les appliquer... Pour cela j'ai testé que la tête et impossible de sauvegarder quoi que ce soit...

    Explication, je tourne ma tête puis je sauvegarde ça position grâce à "getOrientation () " qui me retourne un quaternion.
    Ensuite je re-pivote ma tête dans n'importe quel sens et lui applique grâce à un bouton la methode "setOrientation (const Quaternion &q)". Et la la tête vient se positionner en état initial.

    Je suis passé aussi par "_setDerivedOrientation (const Quaternion &q)" et "_getDerivedOrientation" avec le même problème.

    En lisant la doc je me suis rendu compte que ces méthodes enregistrés la position du node "personnage" et non pas position de mon bone:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    virtual void 	setOrientation  (const Quaternion  &q)
     	//Sets the orientation of this node via a quaternion.
    Es ce que c'est du à ça ? Merci pour ta réponse une nouvelle fois!

  4. #4
    Membre du Club Avatar de Dodin
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2009
    Messages : 104
    Points : 66
    Points
    66
    Par défaut
    Re bonjour.

    Bon un problème sur 2 résolu, pour maintenir la rotation de ma tête je passe par la méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    _BoneTempo->setInitialState();
    Lors du relâchement du bouton de ma souris j'exécute cette méthode. Puis quand je load mes postures, la tête reste tourné.

    Il ne reste plus qu'a faire pareil pour mes postures, les enregistrés! Je suis en train de cherché dans l'API Ogre 3D comment faire. Soit passé directement par le skeleton, soit plus compliqué en enregistrant toutes les positions de mes bones un à un. Puis en les ré-appliquant au modèle sans posture.

    Avez-vous d'autre pistes pour m'aider?

  5. #5
    Membre éprouvé Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Points : 1 087
    Points
    1 087
    Par défaut
    Attache un identifiant à chaque bone, et quand tu veux enregistrer une posture, tu parcours tous tes bones et tu enregistre le couple <bone_id,bone_quaternion> dans un tableau et le tour est joué. Après quand tu veux chargé une posture, fais l'opération inverse, tu parcours ton tableau et applique le quaternion qui convient au bone qui convient simplement en confrontant leur identifiant.

  6. #6
    Membre du Club Avatar de Dodin
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2009
    Messages : 104
    Points : 66
    Points
    66
    Par défaut
    Salut oxyde356.

    J'ai suivi tes conseils mais pas tout a fait à la lettre, car cela ne fonctionnait pas. Apparemment je n'y arrive pas du tout avec les quaternions...
    Voici mon code qui fonctionne par l'intermédiaire de setInitialState() . Mais cela me pose un problème pour revenir en arrière au cas ou l'utilisateur se planterai dans la manipulation... Rien n'est impossible je cherche dans l'API...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Ogre::Skeleton::BoneIterator BoItJoueur = MonSkeletonInstance->getBoneIterator();
         while (BoItJoueur.hasMoreElements())
                 {
                    Ogre::Bone* BoneTmp = BoItJoueur.getNext();
                    BoneTmp->setInitialState();
                 }
    Voici mon code avec les quaternions qui ne fonctionne pas. Quand je déactive les animations sur mon mesh, celui-ci se met en posture vierge.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Ogre::Skeleton::BoneIterator BoItJoueur = MonSkeletonInstance->getBoneIterator();
         while (BoItJoueur.hasMoreElements())
                 {
                    Ogre::Bone* BoneTmp = BoItJoueur.getNext();
     
                    _monQuaternionCorp = BoneTmp->getOrientation();
                    BoneTmp->setOrientation(_monQuaternionCorp);
                 }
    Saurais-tu pourquoi ils ne fonctionnent pas (Quaternion) ? Pour reset ma posture n'aurais tu pas aussi une méthode en tête. Je sais quand lui disant que ma posture finale est un état initial ça va pas être facile facile mais je cherche.

    Merci pour toutes tes réponses qui m'éclairent !

  7. #7
    Membre éprouvé Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Points : 1 087
    Points
    1 087
    Par défaut
    Bah logiquement si ton modèle revient à une position vierge c'est que tu n'applique plus les bons quaternions. Après je ne peux pas trop te dire d'où vient le problème je ne connais pas Ogre mais je connais un peu le fonctionnement du skinning (utilisation des bones).

  8. #8
    Membre du Club Avatar de Dodin
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2009
    Messages : 104
    Points : 66
    Points
    66
    Par défaut
    Re re .... oxyde356

    Merci une fois de plus pour ta réponse, apparemment ça retourne les quaternions du node joueur et non pas du bone de mon joueur... c'est pour cela que ça ne bouge pas...Vu que je n'ai pas déplacé mon node.
    C'est extrêmement étrange!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    //tiré API Ogre::Bone
    virtual const Quaternion  & 	getOrientation  () const
     	Returns a quaternion representing the nodes orientation. 
     
    virtual void 	setOrientation  (const Quaternion  &q)
     	Sets the orientation of this node via a quaternion.
    Cela devrait fonctionner car j'arrive à fixer une posture après avoir déactivé l'animation avec "setInitialState". Je remplace seulement mon "setInit..." par "getOri..." pour copier et "setOri" pour appliquer mon quaternion.

    Si tu as un éclair de génie je suis preneur.
    Thanks a lot !

  9. #9
    Membre éprouvé Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Points : 1 087
    Points
    1 087
    Par défaut
    C'est méthode font surement ceux que tu attend d'elle mais tu ne dois pas utiliser le bon objet (dans le sens programmation objet). Tu utilise surement une sorte de "bone principal" qui désigne ton personnage alors que tu dois cibler celui de la tête.

  10. #10
    Membre du Club Avatar de Dodin
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2009
    Messages : 104
    Points : 66
    Points
    66
    Par défaut
    Salut !

    Effectivement il y a un truc pas très clair qui se passe dans tout les cas... Ben j'ai essayé de faire comme tu me l'a dit, cad je récupère mon Bone grâce à une fct, puis j'enregistre une rotation avec un quaternion, je re-déplace ma tête aléatoirement et je lance une autre fct qui met la bonne orientation à mon bone grâce à mon quaternion enregistré.

    Et rien ne se déplace...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    Ogre::Bone* QOgreGLWidget::getBone(Ogre::Entity* ent, const Ogre::String& boneName)
    {
        Ogre::Bone* rc = 0;
     
            //test pour voir si le modele possede un skeleton
            if(ent && ent->hasSkeleton())
            {
                 MonSkeletonInstance = ent->getSkeleton();
     
                 //test pour voir si le modele possede un bone du nom de ...
                 if(MonSkeletonInstance->hasBone( boneName))
                 {
                         rc = MonSkeletonInstance->getBone( boneName);
                 }
                 else
                 {
                   qDebug() << " ================= AUCUN BONE DE CE NOM DETECTE ============== ";
                 }
            }
            else
            {
                qDebug() << " ================= AUCUN SKELETON DETECTE ============== ";
            }
        return rc;
    }
     
    //Pour le lancer :
    Ogre::Bone* _BoneTempo;
    //En prenant le bone de la tête
    _BoneTempo = getBone(_man,"SMan0008-Head");
    Moi ce qui me fait "tilter" c'est dans la doc ils mettent "Node" à la place de "Bone" et je ne comprendrais pas l'utilité d'une telle méthode, qui me retournerai le quaternion du node de mon mesh ? Pourtant l'objet que je lui donne est bien un bone ?

    J'avoue je suis un peu bloqué, cela fonctionne mais j'ai pas trouvé de solution pour faire un reset de la posture. Et la méthode par les quaternions n'est pas fonctionnelle.

    Merci encore !

  11. #11
    Membre éprouvé Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Points : 1 087
    Points
    1 087
    Par défaut
    Hum désolé mais je ne peux pas plus t'aider je ne connais pas Ogre et ton problème se rapproche de plus en plus à la compréhension de Ogre

  12. #12
    Membre du Club Avatar de Dodin
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2009
    Messages : 104
    Points : 66
    Points
    66
    Par défaut
    Salut oxyde356,

    Écoute c'est pas grave, tu m'a bien aidé, et même si j'ai quelque petit soucis encore j'ai réussi à sauvegardé une posture....

    Donc, la je bascule sur mon problème d'affichage multi-fenêtres; je laisse ça de côté pour plus tard !

    Merci encore pour ton aide et à plus tard sur le forum !

    Et surtout bon week !

  13. #13
    Membre éprouvé Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Points : 1 087
    Points
    1 087
    Par défaut
    Merci à toi, bonne chance et bon weekend

  14. #14
    Membre du Club Avatar de Dodin
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2009
    Messages : 104
    Points : 66
    Points
    66
    Par défaut
    Bonjour à vous !

    Bon j'ai modifié mon prg et j'ai ajouté le mesh du ninja qui possède quelques animations.

    Et la, quelle surprise de voir que cela fonctionne... Ce pourrait il que mon squeleton soit faussé ?

    Je possède l'utilitaire CeguiMeshViewer d'ogre 3D et quand je veux lui faire apparaitre le squeleton tout va bien pour mon ninja tant dis que pour mon autre mesh les fleches des axes de mes bones ont un problème d'échelle... Cela m'affiche n'importe quoi.

    Auriez-vous des idée pour testé mon mesh, vu que blender ne prend pas les .mesh ?

    Merci !

  15. #15
    Membre du Club Avatar de Dodin
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2009
    Messages : 104
    Points : 66
    Points
    66
    Par défaut
    Re bonjour.

    Bon je suis dans la .... j'ai des postures et je veux les modifier. Tourné le tête, le buste...

    Comme vous pouvez le voir je passe par la méthode getBone. Qui me retourne un certain bone de mon squelette.

    Ensuite je fais cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    void QOgreGLWidget::rotationPlayerHeadSliderPosture( int valueHead )
    {
        _BoneTempo = getBone( _EntityCurent,"SMan0008-Head" );
     
        if ( _BoneTempo != NULL )
        {
            qDebug() << "_oldAngleSliderValueHead : " << _oldAngleSliderValueHead;
            qDebug() << "valueHead : " << valueHead;
            _BoneTempo->setManuallyControlled( true );
            _BoneTempo->pitch(Ogre::Degree( valueHead - _oldAngleSliderValueHead ) );
     
            _oldAngleSliderValueHead = valueHead;
        }
         //pour le ninja
        _BoneTempo = getBone( _EntityCurent,"Joint8");
     
        if(  _BoneTempo != NULL )
        {
            _BoneTempo->setManuallyControlled( true );
     
            Ogre::Matrix3 axis = _BoneTempo->getLocalAxes();
     
            Ogre::Vector3 x = axis.GetColumn(1);
     
            x.normalise();
     
            _BoneTempo->rotate( x ,Ogre::Degree( valueHead - _oldAngleSliderValueHead ));
     
            //_BoneTempo->yaw(Ogre::Degree( valueHead - _oldAngleSliderValueHead ) );
     
            _oldAngleSliderValueHead = valueHead;
        }
    }
    C'est à dire que je passe mon bone en manuel et je fais ma rotation. Mais apparemment ce n'est pas la bone méthode car j'ai des conflits avec mes animations. Quand je bouge ma tête tout va bien mais dès que j'attaque le buste (en plein au milieu de mon squelette), je rencontre des problèmes avec le manualyControled. J'ai mon buste qui se déplace tout seul et qui fait n'importe quoi quand je lance une animation.

    La doc Ogre me dit ça "Manually controlled bones can be altered by the application at runtime, and their positions will not be reset by the animation routines. Note that you should also make sure that there are no AnimationTrack objects referencing this bone, or if there are, you should disable them using pAnimation->destroyTrack(pBone->getHandle()); ".

    Mais moi j'ai besoin des deux, l'animation pour placé mon mesh dans une position donné et ensuite lui appliquer mes rotations.


    Help please i'm lost in the sea ! Thanks and good week-end.

  16. #16
    Membre du Club Avatar de Dodin
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2009
    Messages : 104
    Points : 66
    Points
    66
    Par défaut
    Ola.

    Bon j'ai résolu mes problèmes de rotation pendant une animation grâce à une ligne... Comme quoi souvent les problèmes surviennent entre la chaise et le PC.

    Voici la ligne de code qu'il fallait rajouté juste après, le "setManuallyControled()". Bon moi je me suis fait une méthode, c'est plus lisible.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    //permet de déactivé l'animation d'un bone pour qu'il effectue les Mov
    //souhaité meme durant une anim
    void QOgreGLWidget::setBoneHandle()
    {
        _EntityCurent->getSkeleton()->getAnimation( _NomAnimCurent )->destroyNodeTrack( _BoneTempo->getHandle() );
    }
    Voici un extrait de la doc, qui invite à utilisé la méthode, mais pas à jour. "destroyTrack"

    void Ogre::Bone::setManuallyControlled ( bool manuallyControlled )

    Sets whether or not this bone is manually controlled.


    Remarks:
    Manually controlled bones can be altered by the application at runtime, and their positions will not be reset by the animation routines. Note that you should also make sure that there are no AnimationTrack objects referencing this bone, or if there are, you should disable them using pAnimation->destroyTrack(pBone->getHandle());
    Voila bonne journée, et merci.

  17. #17
    Membre du Club Avatar de Dodin
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2009
    Messages : 104
    Points : 66
    Points
    66
    Par défaut
    Oh fait, voici le lien qui a pu me débloquer :

    http://www.ogre3d.org/tikiwiki/ManuallyCOntrollingBones

    Cela peut toujours aider.

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

Discussions similaires

  1. Problème de rotation
    Par Syphon dans le forum Flash
    Réponses: 9
    Dernier message: 11/01/2007, 10h27
  2. Problème de rotation => "rideau noir"
    Par alex6891 dans le forum OpenGL
    Réponses: 19
    Dernier message: 29/07/2006, 21h25
  3. Réponses: 4
    Dernier message: 20/03/2006, 21h26
  4. [OpenGL] problème de rotation 3D
    Par ReiVon dans le forum OpenGL
    Réponses: 3
    Dernier message: 11/04/2005, 09h47
  5. Problème de rotation
    Par Francky033 dans le forum DirectX
    Réponses: 1
    Dernier message: 17/07/2003, 16h38

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