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).
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);