How do I rotate and object around its center in script?

I want to rotate an object around its center point. I've tried `RotateAround`, and what seems like every possible way to use both Rotate and transform.rotate.

To give some more detail my object is an empty gameObject containing several children, I'm translating my parent object to a specific position and doing two rotations, one `Vector.right * 90` (or `Rotate(90, 0, 0)` and a random one (`0-360`) along what after the first rotation is the y-axis. If I do the first rotation in the script and proceed to rotate around the y-axis in the editor I get the result I'm after namely that it rotates around its own center point. In the script however it seems to rotate around the center pivot of the first child of the object I'm rotating. Of note it seems like the script is doing the rotation without changing the objects position, while the editor reflects a new positions for x and z while I'm rotating around y.

My original code was this: `objectName.Rotate(90, Random.Range(0, 360), 0);` But as stated I've tried doing the two rotations separately and also using `RotateAround` with a the objects positions as the rotation point. (the objectName var refers directly to the objects transform)

When you modify the rotation of a Transform, the rotation happens around the local origin - that is, the center of the local coordinate system for the object. The actual middle of the object may not be placed at the origin - that depends on how it was modeled.

To make the rotation around the actual middle, there are a few things you could do.

  • Rotate around the bounds center. You can use collider.bounds.center to get the center of the world space bounding box of the collider of the game object, get the center of the local space bounding box of the mesh. In both cases, you can then use RotateAround to rotate around that point. Note that for the mesh bounds, you need to transform the center into global coordinates first.

  • Make an empty parent game object to the game object you want to rotate. Place the game object such that its middle is placed right at the origin of the parent. You can then rotate the parent game object instead using the normal ways to set the rotation of the transform.

Rotating objects in the Unity3d Engine is extremely easy. For instance, I use the following code to rotate an object in the scene 360 degrees:

function Update () {

     transform.Rotate(0,20*Time.deltaTime,0);

}

Just create a new JavaScript, and paste this inside the script!

Under the “GameObject” menu in Unity, there is now a command called “Center On Children”. This will move the pivot point of the object to the midpoint of the total bounds of all your children. After this, you can use any method to spin around an axis and it will behave just like you want it to. :slight_smile:

Like Ducky stated, we would need to see your code. I am wondering where you are updating the rotation and how. Its one thing to call transform.Rotate but where are you doing this and how often?

For instance this works for me:

using System;
using UnityEngine;

[AddComponentMenu("Scripts/Quests/SpinningSymbol")]
public class SpinningSymbol : MonoBehaviour
{
    private void Update()
    {
        transform.Rotate(Vector3.forward * Time.deltaTime * 100);
    }
}

It sounds like you might need to give some thought to the way you compose consecutive rotations. By default, the Transform.Rotate method always rotates using the object's local coordinate system. This system does not change when you move or rotate the object. So if you rotate the object 90 degrees around Vector3.right, then what you might think of as the Y-axis in the scene/editor is the local Z-axis. (Note: in recent versions of the Unity editor you can choose whether the tool handles are displayed using local coords or not. Select your object, and click on the button marked "Global" or "Local" above the Scene View to switch from one to the other.)

If you want to rotate around the world's "up" direction, regardless of the object's local coordinate system, you can try adding Space.World as the last argument to Rotate.

Alternatively you can use only local coordinates for your work. You will need to rotate around the local axis that represents Up from the object's point of view, regardless of how its current orientation in the world. (Again, you can tell the Scene editor to display the rotation/translation tool handles in the local coordinate system to help keep this straight.)

One additional comment: if the first 90 degree rotation is being done to correct an orientation problem with the model, you might consider doing that in the modeller instead. By defining the correct "up" and object center in the modeller, you make working with it in Unity a bit more intuitive.

(I suppose another way around this might be to rotate the object 90 degrees, then parent it to a new game object whose local coordinate system is more to your liking. This is not something I've tried though.)

This has been a struggle for me as well. The only way I've been able to do this without creating any empty parents, clutter, etc is using an armature in Blender (assuming you're also using Blender :) I'm using it for a model that doesn't require a deform, meaning that each bone is assigned to a separate object. Also ensure that the bones have proper parenting hierarchy.

  1. Create an armature in Blender and assign each bone to the object it should control. You can do this by parenting the object to the bone (CTRL+P)

  2. Export as FBX and import in Unity.

  3. Then in Unity script that you attach to the main GameObject of your Model you can execute the following on the bone that you want to rotate:

    bone.transform.RotateAround(new Vector3(1f,0f,0f), 45);

This will rotate the bone and the attached object 45 degrees around the X-Axis using its own pivot point instead of the pivot point of the entire game object.

I'm pretty new to Unity so this may not be the most effective way, but I wasn't able to find much info on how to do this.

Vector3 Axis; //the axis you want to rotate about

//In Update Function
this.transform.RotateAround (this.transform.position,Axis, rotationSpeed*Time.deltaTime);