Page 1 sur 1

[VR] - Position du corps d'un personnage

Publié : 03 Jan 2017 15:26
par Dedemon
Bonjour,

Actuellement, je travaille sur un projet VR en utilisant le plugin SteamVRPlugin qui se trouve dans l'asset store. Pour ce projet, j'ai un personnage qui contient 2 meshes séparés (la tête et le corps).
Depuis plusieurs jours, j'essaye d'avoir une position "exacte" pour le corps de mon personnage. J'ai essayé de prendre les yeux comme référence, mais dès lors que je regarde en haut ou en bas, le corps monte ou descend.
Après de nombreuses recherches, j'ai compris que le corps devait copier la position du cou et non des yeux. J'ai donc crée un objet "Cou" qui a un offset par rapport aux yeux (de 0,075 en Y). Ce objet contient un script qui lui permet de se repositionner si les yeux sont plus loin que la distance initial (c'est à dire l'offset). Cependant j'ai quelques petit soucis, si je recule, le cou (et donc le corps) se retrouve devant moi. Mon corps monte un peu si je bouge et descend si je reviens a mon état initial (Position de départ et tête droite).
Pouvez-vous me dire si je suis dans la bonne voie ? Si oui, comment puis-je avoir la bonne position du cou même si je bouge ? Si non, avez-vous d'autre pistes à me donner ?

Merci d'avance pour vos réponses et désolé pour ce long (très long paragraphe :)).

Re: [VR] - Position du corps d'un personnage

Publié : 03 Jan 2017 15:52
par boubouk50
En gros, ton body doit seulement suivre la position de ton coup et pas la rotation?

Je ne suis pas sur qu'il faille séparer la tête et le corps. Si tu te baisses, il faut aussi que ton corps se baisse mais que les pieds restent au sol. Ils font partie de la même entité seulement la tête est le centre de contrôle au lieu du pelvis habituel.
Tu as un rig sur ta tête et ton corps? Comment tu fais le lien? Peut-on voir ton script?

Re: [VR] - Position du corps d'un personnage

Publié : 03 Jan 2017 16:09
par Dedemon
Pour mon personnage, je n'ai pas de rig. La tête et le corps sont deux objets séparés mais le corps a pour enfant la tête. Le corps s'occupe de copier la position et la rotation sur l'axe Y des yeux. La tête copie la rotation sur l'axe X et l'axe Z des yeux.
Pour l'instant, mon code pour le cou n'est pas fini mais je galère pas mal.

Voici le code:

Code : Tout sélectionner

using UnityEngine;

public class VRNeck : MonoBehaviour
{
    [SerializeField]
    private Transform   _eyeTransform   =   null;
    [SerializeField]
    private Vector3     _neckOffset     =   new Vector3(0f, 0.075f, 0f);

    private Transform   _neckTransform      =   null;
    private float       _defDistanceNeckEye =   0f;
    private float       _curDistanceNeckEye =   0f;

    private void    Awake()
    {
        _neckTransform = this.transform;
        _defDistanceNeckEye = Vector3.Distance(Vector3.zero, _neckOffset);
    }

    private void    FixedUpdate()
    {
        if (null != _eyeTransform)
        {
            if (0f > Vector3.Dot(_neckTransform.forward.normalized, (_eyeTransform.position - _neckTransform.position).normalized))
            {
                _neckTransform.position =   _eyeTransform.position - _neckOffset;
            }
            else
            {
                _curDistanceNeckEye = Vector3.Distance(_eyeTransform.position, _neckTransform.position);
                if (_defDistanceNeckEye < _curDistanceNeckEye)
                {
                    _neckTransform.position += (_eyeTransform.position - _neckTransform.position).normalized * (_curDistanceNeckEye - _defDistanceNeckEye);
                    //_neckTransform.position = _eyeTransform.position - _neckOffset;
                }
            }
        }
    }
}

Re: [VR] - Position du corps d'un personnage

Publié : 03 Jan 2017 17:09
par boubouk50
Ah ok, pas de rig!
Ta solution est un peu caduque et alambiquée! (deux mots que je peine à caser alors j'en profite)
Tu ne devrais pas lier la tête au corps et déplacer ensuite chacun séparément mais de façon liée puisque le corps se déplace (tu comprends mieux l'utilisation des deux mots sus-cités).
Le problème se situe au niveau de ta tête je pense. Son pivot tout du moins. Quand tu bouges la tête, c'est au niveau du cou que tout se joue, pas au niveau de la tête. Il sera l'axe de rotation de ta tête et le point de positionnement de ton corps.
Si tu veux caler ton corps par rapport à ta tête, alors ce n'est pas le corps qui doit gérer le déplacement.
Si tu dois caler le cou en fonction de la tête alors tu ne dois pas gérer la rotation par la tête, mais par le cou.
Ton cou doit devenir l'élément principal de ton rig. (du moins son point de pivot).

Peut-on avoir un aperçu des pivots de ton perso. Que je sache comment cela est conçu en terme de hiérarchie. Je pense que c'est la que ça pêche.

Le but ici est de créer le pivot de ton cou, qui gérera la rotation de ta tête (par lien pur parent-enfant) et d'ensuite caler le corps verticalement dessous ton cou. Puisque celui-ci ne fait que tourner autour de son pivot, il ne bouge pas lors d'une rotation, donc le corps restera en place quand tu tourneras la tête. Le déplacement du joueur se fera aussi sur le cou, puisque le parent de tous les éléments, donc tout suivra.

Re: [VR] - Position du corps d'un personnage

Publié : 03 Jan 2017 18:01
par Dedemon
Vous pouvez retrouver ci-joint, ma hiérarchie. L'objet "CharacterOne" équivaut au cou car c'est cet objet qui copie la position et la rotation en Y des yeux.L'objet "Pivot - Head" s'occupe de copier la rotation en X et en Z des yeux. Les objets "Head" et "Body" sont juste les meshes renderer.

En VR, nous n'avons que la position et la rotation des yeux. Quand je me déplace, les yeux changent de position ce qui est normal. Mais quand je penche la tête, les yeux effectuent une rotation (normal) et change de position. Donc pour éviter que mon personnage ne bouge quand je penche ma tête, j'essaye si possible de déterminer la position du cou (ne fonctionne toujours pas pour l'instant).