- Home /
How do I rotate an object around another to have its opposite ?
Hello everyone !
In the last days, I made a mini algorythm to stick two gameobjects like to magnets on the Start() on Unity (no rigidbody, no modification in-game, it's only at the begin of the scene). So here's my process :
I make a "base" gameobject called "Module" that never move at the generation ;
I make a point that will be the reference to place the second gameobject ;
I instanciate a second gameobject "Module" that will be rotated around its placement point and moved to the base's placement point.
But the code that I made is not working so well, the second gameobject is never to the place I want it to be. It's always a bit rotated and I don't have any idea to correct that, whereever the first gameobject is.
So here's what I expected: (in black, the base's module, in white the second module that will be placed)
And here's what I have : (n.b. : I rotated the base's module to explain the problem I have)
I'm working on it during the last 14 hours, I just can't find a correct solution. If someone have a solution, that would be ery helpful thanks !
This is the last version of my placement code ("oldExit" is the base's placement point and "newExit" is the second gameobject's placement point. There are both childs of their own Module's gameobject.) :
private void MatchExits( ModuleConnector oldExit, ModuleConnector newExit )
{
Transform newModule = newExit.transform.parent;
Transform oldModule = oldExit.transform.parent;
Quaternion oldRotation = oldExit.transform.rotation;
Quaternion newRotation = newExit.transform.rotation;
newModule.transform.rotation = oldRotation;
newModule.transform.LookAt(oldExit.transform);
/* correction forward */
float correctionForward = Vector3.Angle(Vector3.up, oldExit.transform.forward) * Mathf.Sign(oldExit.transform.forward.x) * Mathf.Sign(oldExit.transform.forward.y) * Mathf.Sign(oldExit.transform.forward.z);
correctionForward -= Vector3.Angle(Vector3.up, newExit.transform.forward) * Mathf.Sign(newExit.transform.forward.x) * Mathf.Sign(newExit.transform.forward.y) * Mathf.Sign(newExit.transform.forward.z);
newModule.RotateAround(newExit.transform.position, newExit.transform.right, correctionForward);
correctionForward = Vector3.Angle(Vector3.forward, oldExit.transform.forward) * Mathf.Sign(oldExit.transform.forward.x) * Mathf.Sign(oldExit.transform.forward.y) * Mathf.Sign(oldExit.transform.forward.z);
correctionForward -= Vector3.Angle(Vector3.forward, newExit.transform.forward) * Mathf.Sign(newExit.transform.forward.x) * Mathf.Sign(newExit.transform.forward.y) * Mathf.Sign(newExit.transform.forward.z);
newModule.RotateAround(newExit.transform.position, newExit.transform.up, correctionForward + 180);
Vector3 correctiveTranslation = oldExit.transform.position - newExit.transform.position;
newModule.position += correctiveTranslation;
}
Your answer
Follow this Question
Related Questions
Camera rotation around player while following. 6 Answers
rotate around character 1 Answer
Quaternion, eulerAngles, localEulerAngles Driving me mad 1 Answer
rotate around character 2 Answers
Transform.RotateAround over specific length of time 1 Answer