[RESOLU] Inverse Kinematics ou pas ?

Questions techniques liées à l’utilisation d'Unity (et n'entrant pas dans le cadre d'une des sections suivantes)
Mythix
Messages : 8
Inscription : 16 Avr 2020 09:34

[RESOLU] Inverse Kinematics ou pas ?

Message par Mythix » 28 Mai 2020 23:21

Bonjour à tous,

Est-ce que quelqu'un pourrait m'aider pour mon problème ci-dessous en précisant un peu le contexte:

Voici un extrait de mon jeu : https://youtu.be/avdTOwlGzM4

https://youtu.be/avdTOwlGzM4

J'utilise le modèle 3D suivant pour le personnage que le joueur contrôle : https://assetstore.unity.com/packages/3 ... art-106154

Dans mon jeu, ce modèle 3D exécute en permanence l'animation "idle_shoot_Ar" afin que le personnage donne l'impression de "respirer".

Mon problème est le suivant :
Dans mon jeu (qui est un FPS), lorsque je vise vers le haut ou vers le bas, je souhaiterais pouvoir faire une rotation sur l'axe X de la colonne vertébrale (spine) du modèle 3D afin que ce soit plus réaliste. Car actuellement c'est l'ensemble du modèle 3D qui fait une rotation (même si ca ne se voit pas in game... ^^).

Lorsque je ne suis pas en "play mode", j'arrive bien à faire la rotation du "spine" pour avoir cette effet, donc à mon avis le rigging semble bon. Mais mon problème c'est que dès que je passe en "play mode", même si je viens modifier la rotation sur l'axe souhaité, cela ne fonctionne pas. J'ai l'impression qu'automatiquement l'animation "idle_shoot_Ar" prend le dessus.

En creusant j'ai entendu parlé du "Inverse Kinematics", mais je ne suis pas sûr que cela puisse m'aider. Est-ce possible de faire une sorte "d'overwrite" sur une animation en cours.
En gros, j'aimerais rajouter une animation (rotation du buste/movement colonne vertébrale) sur l'animation en cours.

Est-ce possible ? Peut-être que je m'y pas mal... Comment gérer cela ?
Est-ce que ce post c'est une bonne piste / solution (overwrite dans le lateUpdate) ? ==> https://answers.unity.com/questions/126 ... ation.html


En espérant qu'un de vous puisse m'aider ^^'

Avatar de l’utilisateur
jmhoubre
Messages : 188
Inscription : 05 Oct 2019 22:05

Re: [Need help] Inverse Kinematics ou pas ?

Message par jmhoubre » 30 Mai 2020 12:04

As-tu essayer un Blend Tree?

djulio74
Messages : 664
Inscription : 19 Déc 2009 22:55
Contact :

Re: [Need help] Inverse Kinematics ou pas ?

Message par djulio74 » 30 Mai 2020 18:19

Ton probleme n'en est pas un et est tout a fait normal.
en dehors du mode play, tu peut en effet donner la rotation que tu veux a chacun des bones, mais des que tu va mettre sur play, il vont reprendre leur rotation définies par l'animation, c'est elle qui prime.
Et je pense cela n'aura pas grand chose a voir avec inverse kinematics.

Une solution un peut barbare serait d'avoir des doublons des bones.
En gros, une exemplaire de ton perso, avec les bones et leurs animations, mais sans le mesh, et un autre ave les bones, les mesh mais pas les animation.
mettre chaque bones sans animation enfant de la même bone avec animation. donc l'animation va deplacer les bones avec animation qui, étant leurs parents vont déplacer les bones sans animation qui elles vont déformer/animer le mesh de ton perso.

A ce moment tu pourra donner des rotation locales supplémentaires au bones sans animation qui suivront toujours l'animation du parent mais avec un offset.

Je ne sais pas si ça peut marcher mais cela me semble cohérent. sinon refaire une animation suplémentaire avec blender par exemple pour l'action de viser vers le haut ou le bas.

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

Mythix
Messages : 8
Inscription : 16 Avr 2020 09:34

Re: [Need help] Inverse Kinematics ou pas ?

Message par Mythix » 02 Juin 2020 14:51

Hello,

Merci pour vos retours.
Non je n'ai pas tester Blend Tree mais je vais regarder à quoi cela sert, c'est toujours intéressant.

Effectivement, djulio74 tu as raison, l'animation reprend toujours le dessus. J'ai testé et implémenté la solution décrite ici est elle fonctionne parfaitement : http://redirect.viglink.com/?format=go& ... ation.html

En quelques mots, la solution consiste à stocker dans une variable la position à laquelle on souhaite faire bouger l'objet. Et dans le lateUpdate on vient "écraser" la position générée par l'animation par celle de notre variable. Et ça fonctionne à merveille. :cote:

Voilà ce que ça donne avec un extrait de code :

1. Je récupère les positions initiales à la création du gameObject :

Code : Tout sélectionner

void Start()
    {
        .......

        // Spine movement management
        spine = transform.Find("Hips").gameObject.transform.Find("Spine").gameObject;
        spinePositionZ = spine.transform.rotation.z;
    }
2. Je gère le mouvement dans la fonction LateUpdate():

Code : Tout sélectionner

void LateUpdate(){
        float verticalDelta = crosshVerticalSpeed * Input.GetAxis("Mouse Y");
        spinePositionZ += verticalDelta;
        spine.transform.eulerAngles -= new Vector3(spinePositionZ, 0, 0);
}

djulio74
Messages : 664
Inscription : 19 Déc 2009 22:55
Contact :

Re: [Need help] Inverse Kinematics ou pas ?

Message par djulio74 » 02 Juin 2020 18:18

Parfait si tu as trouvé une solution, et merci de l'avoir partagée.
En effet bien plus simple que ma version "bourrin" que je proposais :mrgreen:

Quand a réponse à la question initiale à été trouvé , pense à éditer le titre de ton premier message pour le passer en résolu en ajoutant [RÉSOLU]. Je te lai fais cette fois ci.
De plus, inutile d'ajouter [need help] à ton titre, par défaut quand on post sur un forum c'est principalement pour avoir de l'aide justement ;-)


Bonne continuation,
Julien

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

Répondre

Revenir vers « Unity le logiciel »