Rotating objects around other without rotating itself
Hi,
I'm having a death battle trying to rotate elements around another without rotating itself.
In a hex board, I'm trying to rotate the elements in the radius of an hex. I can do that with the transform.RotateAround() function, but I want to keep the local rotation of the radius object, so they don't flip.
This is what I have now:
void Update() {
if (pivot != null && selected != null) {
Debug.DrawLine((Vector2)Camera.main.ScreenToWorldPoint(Input.mousePosition), pivot.transform.position);
float pivotMouse = AngleBetweenTwoPoints((Vector2)Camera.main.ScreenToWorldPoint(Input.mousePosition), pivot.transform.position);
float pivotSelected = AngleBetweenTwoPoints(selected.transform.position, pivot.transform.position);
float difference = pivotMouse - pivotSelected;
Debug.Log ("Angle between pivot and mouse: " + pivotMouse);
Debug.Log ("Angle between pivot and selected: " + pivotSelected);
Debug.Log ("Diference: " + difference);
for (int i = 0; i < radius.Count; i++) {
// This is the standard rotate around function, and goes perfectly, but as I said on the question, I don't want to change the local rotation of the object, just move around the pivot square
radius[i].transform.RotateAround(pivot.transform.position, Vector3.forward, difference);
}
}
}
Thanks everyone for your help!!
Not a fancy way to do it but, you can simply get the rotation before RotateAround and set to the same rotation after RotateAround.
Quaternion rot = radius[i].rotation ;
radius[i].transform.RotateAround(pivot.transform.position, Vector3.forward, difference);
radius[i].rotation = rot;
Hope that helps.
I know what you mean, the problem is that I don't want to modify their local rotation while they are rotating around the center.
The rotation around the center is not inmediate.
Ok. What i suggested is actually doing what you asked for. $$anonymous$$eeps the local rotation unchanged, just rotating (translating) around the pivot . Here is another way to do it:
for (int i = 0; i < radius.Count; i++)
{
Vector3 pivotToRadius = radius[i].transform.position - pivot.transform.position;
radius[i].transform.position = pivot.transform.position + pivotToRadius * Quaternion.AngleAxis(difference * speed$$anonymous$$ultiplier, Vector3.forward); // speed$$anonymous$$ultiplier will smooth the rotation
}
Answer by sajoga · Nov 10, 2015 at 02:43 PM
I just replied you and found the solution, but thanks anyway!
for (int i = 0; i < radiusGems.Count; i++) {
//radiusGems[i].transform.RotateAround(pivotSquare.transform.position, Vector3.forward, angle);
radiusGems[i].transform.position = RotatePointAroundPivot(radiusGems[i].transform.position,
pivotSquare.transform.position,
Quaternion.Euler(0, 0, angle));
}
....
public static Vector3 RotatePointAroundPivot(Vector3 point, Vector3 pivot, Quaternion angle) {
return angle * ( point - pivot) + pivot;
}
Have you considered constantly refreshing the Quaternion.identity of the object?
//Rotate individual gem
radiusGems[i].transform.RotateAround(Vector3 point, Vector3.pivot, Quaternion angle);
//Constantly reset radiusGem[i]'s angle to 0,0,0
radiusGems[i].transform.rotation = Quaternion.identity;
Not sure how efficient it is to constantly reset the rotation.
Your answer
Follow this Question
Related Questions
Drag - Rotate 0 Answers
it is possible to rotate a texture ? 0 Answers
have enemy try to get in front of player and push them back help 0 Answers
Flip Rotation of transform when it bounces off a wall 1 Answer