Mauvais axe de rotation avec pivot

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Tarquin38
Messages : 8
Inscription : 15 Mai 2018 14:34

Mauvais axe de rotation avec pivot

Message par Tarquin38 » 15 Mai 2018 14:54

Bonjour,

J'ai créé une scène 3D très simple avec un cube et un plan. Mon objectif est de fixé le cube sur le plan avec 3 points d'ancrage. Pour ce faire, l'utilisateur sélectionne un vertice du mesh du cube puis un endroit sur le plan (raycast). Lorsque l'on ancre le 1er point, le cube se déplace à l'endroit souhaité.

Les problèmes commence lors de l'ancrage du deuxième point, j'effectue une rotation sur l'axe X puis une rotation sur l'axe Y, les deux utilisant le 1er point fixé comme pivot. Les 2 rotations fonctionnent individuellement. Cependant, lorsque j'effectue les deux rotations à la suite ça ne fonctionne pas.
J'utilise les axes du transform du cube pour faire mes rotations("Transform.up" et "Transform.right") mais lorsque j'effectue ma rotation sur X, le vecteur "Transform.up" devient l'axe Z(bleu) du transform de mon cube alors que je veux faire ma 2eme rotation Y(vert).
ImageImage

Voici mon code pour effectuer les 2 rotations à la suite:

Code : Tout sélectionner

float angleX;
float angleY;

//Vecteurs pour le calcul de l'angle en X
Vector2 fromFixedPointToSelectedForX = new Vector2((model.transform.position.z + selectedPoint.z) - fixedPoints[0].z, (model.transform.position.y + selectedPoint.y) - fixedPoints[0].y);
Vector2 fromFixedPointToWorldHitPointForX = new Vector2(worldHitPosition.z - fixedPoints[0].z, worldHitPosition.y - fixedPoints[0].y);

Debug.Log("Fixed -> select : " + fromFixedPointToSelectedForX);
Debug.Log("Fixed -> hitpoint : " + fromFixedPointToWorldHitPointForX);

//Calcul de l'angle entre les 2 vecteurs pour la rotation en X 
//Test de l'orientation de l'angle, positif ou négatif
if (fromFixedPointToSelectedForX.x * fromFixedPointToWorldHitPointForX.y - fromFixedPointToSelectedForX.y * fromFixedPointToWorldHitPointForX.x < 0)
         angleX = Vector2.Angle(fromFixedPointToSelectedForX, fromFixedPointToWorldHitPointForX);
else
         angleX = -Vector2.Angle(fromFixedPointToSelectedForX, fromFixedPointToWorldHitPointForX);

//rotation par rapport à l'axe X
model.transform.RotateAround(fixedPoints[0], model.transform.right, angleX);

//Vecteurs pour le calcul de l'angle en Y
Vector2 fromFixedPointToSelectedForY = new Vector2((model.transform.position.x + selectedPoint.x) - fixedPoints[0].x, (model.transform.position.z + selectedPoint.z) - fixedPoints[0].z);
Vector2 fromFixedPointToWorldHitPointForY = new Vector2(worldHitPosition.x - fixedPoints[0].x, worldHitPosition.z - fixedPoints[0].z);

Debug.Log("Fixed -> select : " + fromFixedPointToSelectedForY);
Debug.Log("Fixed -> hitpoint : " + fromFixedPointToWorldHitPointForY);

//Calcul de l'angle entre les 2 vecteurs pour la rotation en Y
//Test de l'orientation de l'angle, positif ou négatif
if (fromFixedPointToSelectedForY.x * fromFixedPointToWorldHitPointForY.y - fromFixedPointToSelectedForY.y * fromFixedPointToWorldHitPointForY.x < 0)
         angleY = Vector2.Angle(fromFixedPointToSelectedForY, fromFixedPointToWorldHitPointForY);
else
         angleY = -Vector2.Angle(fromFixedPointToSelectedForY, fromFixedPointToWorldHitPointForY);

Debug.Log("angleX : " + angleX);
Debug.Log("angleY : " + angleY);

//rotation par rapport à l'axe Y
model.transform.RotateAround(fixedPoints[0], model.transform.up, angleY);
Merci d'avance pour votre aide.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6222
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Mauvais axe de rotation avec pivot

Message par boubouk50 » 15 Mai 2018 15:54

Salut,
Sur les deux images, les axes sont bien en local?
Le Up sera toujours le vert en local, le Right le rouge et le Forward le bleu.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Tarquin38
Messages : 8
Inscription : 15 Mai 2018 14:34

Re: Mauvais axe de rotation avec pivot

Message par Tarquin38 » 15 Mai 2018 16:15

Oui c'est le transform du cube.
C'est pour ça que je ne comprend pas pourquoi le UP change d'axe.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6222
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Mauvais axe de rotation avec pivot

Message par boubouk50 » 15 Mai 2018 16:31

Comment sais-tu, testes-tu le fait que le Up change d'axe? Visuellement, peut-être c'est l'impression que cela donne mais ce n'est surement pas ce qui se passe, le Up restera toujours le Up.

Si tu tournes ton modèle selon l'axe X (local), le Up (local) aura bougé. Peut-être souhaites-tu effectuer la rotation sur l'axe Up (local) avant que celui-ci change? Il te faut donc le stocker avant la première rotation.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Tarquin38
Messages : 8
Inscription : 15 Mai 2018 14:34

Re: Mauvais axe de rotation avec pivot

Message par Tarquin38 » 15 Mai 2018 16:44

J'ai vérifié et je me suis effectivement trompé, l'axe est bien le bon, désolé pour ça.
Cependant mes rotations ne s'effectue pas correctement et je ne vois pas vraiment pourquoi.

merci pour ton aide.

Tarquin38
Messages : 8
Inscription : 15 Mai 2018 14:34

Re: Mauvais axe de rotation avec pivot

Message par Tarquin38 » 15 Mai 2018 16:55

Voici un petit schema de ce que je veut faire:
Image

Je veux mettre le point sélectionné sur le point de destination (ou plutôt sur la droite qui par du point fixé et passe par le point de destination) en faisant 2 rotations autour du point fixé(en X et Y).

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6222
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Mauvais axe de rotation avec pivot

Message par boubouk50 » 15 Mai 2018 17:10

Donc c'est bien ce que je disais, tu veux faire deux rotations sur les axes locaux de départ.
Il te faut d'abord déterminer les 2 axes et leurs angles avant de les appliquer. Ici, tu fais d'abord la première puis la seconde. Or, la seconde calcule non pas en fonction du départ mais de la position et rotation intermédiaire après la première rotation.
Par contre, je ne peux te confirmer si c'est une bonne méthode.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Répondre

Revenir vers « Scripting »