Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 2 sur 2
  1. #1
    Membre actif Avatar de Kromagg
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    août 2008
    Messages
    270
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : août 2008
    Messages : 270
    Points : 158
    Points
    158

    Par défaut Problème de rotations

    Bonjour,

    Je travaille actuellement sous Unity avec la Wiimote (avec un plugin C# maison). J'utilise le pointeur infrarouge pour attraper un objet et le déplacer dans le monde 3D, l'objet devant toujours faire face à la caméra (suivant le côté sélectionné). Donc quand je tourne de gauche à droite, l'objet tourne sur lui-même dans l'autre sens, idem pour le haut-bas.

    Seulement arrivé à une rotation de 90° autour de Y mon objet effectue une rotation supplémentaire assez étrange.
    Voici mon code source
    Code :
    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
    35
    36
    37
    38
    39
     
    // Pour la composante Y du point de l'écran, je soustrais la hauteur de l'écran à la position du point IR car les coordonnées écran se font en partan du bas-gauche alors que les coordonnées IR se font en partant du haut-gauche.
    ray = Camera.main.ScreenPointToRay(new Vector3(controllerData.virtualX, Screen.height - controllerData.virtualY));
     
    Vector3 vecUpDown = new Vector3(0, ray.direction.y, ray.direction.z);
    Vector3 vecLeftRight = new Vector3(ray.direction.x, 0, ray.direction.z);
     
    vecUpDown.Normalize();
    vecLeftRight.Normalize();
     
    float dotUpDown = Vector3.Dot(vecUpDown, Vector3.forward);
    float dotLeftRight = Vector3.Dot(vecLeftRight, Vector3.forward);
     
    Debug.Log(vecUpDown);
     
    float angleUpDown = Mathf.Acos(dotUpDown) * Mathf.Rad2Deg;
    float angleLeftRight = Mathf.Acos(dotLeftRight) * Mathf.Rad2Deg;
     
    Vector3 crossUpDown = Vector3.Cross(vecUpDown, Vector3.right);
    Vector3 crossLeftRight = Vector3.Cross(vecLeftRight, Vector3.up);
     
    crossUpDown.Normalize();
    crossLeftRight.Normalize();
     
    float dotSignUpDown = Vector3.Dot(Vector3.forward, crossUpDown);
    float dotSignLeftRight = Vector3.Dot(Vector3.forward, crossLeftRight);
     
    if (ValueBetween(-1.0F, 0.0F, dotSignUpDown))
    	angleUpDown = -angleUpDown;
     
    if (ValueBetween(-1.0F, 0.0F, dotSignLeftRight))
    	angleLeftRight = -angleLeftRight;
     
    Quaternion rotationLeftRight = Quaternion.Euler(0, angleLeftRight, 0);
    Quaternion rotationUpDown = Quaternion.Euler(angleUpDown, 0, 0);
    Vector3 position = ray.direction * sphericalRay + ray.origin;
     
    objectSelected.localRotation = rotationLeftRight * rotationUpDown;
    objectSelected.position = position;
    Je pense que le souci viens de mon produit vectoriel, en effet arrivé à 90° de rotation le vecteur s'inverse.

    Auriez-vous une solution ?

    Kromagg
    C'est dans ses rêves que l'homme trouve la liberté cela fut, est et restera la vérité! (John Keating - Le cercle des poètes disparus)

  2. #2
    Expert Confirmé Avatar de ericd69
    Homme Profil pro Eric Dureuil
    Développeur informatique
    Inscrit en
    avril 2011
    Messages
    1 849
    Détails du profil
    Informations personnelles :
    Nom : Homme Eric Dureuil
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : avril 2011
    Messages : 1 849
    Points : 3 179
    Points
    3 179

    Par défaut

    salut,

    le produit vectoriel est sensible au signe et un float à 0 en pratique c'est pas forcément exactement donc ça peut engendrer des comportements bizarres...

    une solution est de dire que si la valeur absolue du nombre est inférieur à la précision choisie ça vaut 0
    tu peux aussi convertir en entier signé tes valeurs float qui représentent les angle, ça reste très acceptable pour de la détection de mouvement et ça réglera ton pb...
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •