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

Unity Discussion :

Problème de rotations


Sujet :

Unity

  1. #1
    Membre habitué Avatar de Kromagg
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    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 : 275
    Points : 198
    Points
    198
    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 : 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
    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
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    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...

Discussions similaires

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

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