x


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)

more ▼

asked Dec 03, 2009 at 12:19 PM

torg gravatar image

torg
112 7 6 10

could you include the code that you're trying? the basic "transform.Rotate()" function should rotate an object around its own centre point, so if you're calling this on the empty parent, the children should all get rotated around it.

Dec 03, 2009 at 12:29 PM duck ♦♦

It may also be worth checking the coordinates of the children in the Inspector window, as they will be relative to the parent (ie EmptyGameObject). The little trasform gizmo appears to be drawn in the approximate centre of the object and children collectively, not at the parent's origin as in other programs like 3D Max.

Dec 03, 2009 at 12:47 PM Novodantis 1

Is there anyway to set the actual pivot or center of the parent gameObject? Looking at it in the scene view, the pivot (or transform gizmo) is at the approximate center of the object, which I've made sure of by moving it along the x-axis to make up for the individual positions of the children. This is why I cant understand that the rotation does not respect this center point in the script, but clearly does when the rotation is performed in the editor.

Dec 03, 2009 at 12:57 PM torg
(comments are locked)
10|3000 characters needed characters left

5 answers: sort voted first

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.

more ▼

answered Dec 04, 2009 at 10:20 AM

runevision gravatar image

runevision ♦♦
9.1k 52 77 134

There is at least 1 case ( http://answers.unity3d.com/questions/137688/pretty-weird-issue-with-rotating-a-sphere.html ) in which neither of these work (when importing a messed up mesh with pivot not in center), and they both look messy. Is there any "cleaner" solution nowadays? (years after this answer)

Jun 04, 2012 at 07:45 PM Cawas

Still keeping an interest in the question above (is there a more pleasant solution), I need to fix my mistake: using bounds do work, but we need to use RotateAround and apparently nothing else (such as RotateAroundLocal). Also, it's simpler to get renderer.bounds.center rather than collider, as @wolfram suggested me elsewhere.

Jun 04, 2012 at 10:00 PM Cawas

Here's the answer to my questions: use a new parent GameObject translated into the now child's renderer.bounds.center - which is basically a combination of what you said: http://answers.unity3d.com/questions/137688/pretty-weird-issue-with-rotating-a-sphere.html#comment-263630

Jun 11, 2012 at 08:01 PM Cawas
(comments are locked)
10|3000 characters needed characters left

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);
    }
}
more ▼

answered Dec 03, 2009 at 03:09 PM

h2hjastermereel gravatar image

h2hjastermereel
42 2

(comments are locked)
10|3000 characters needed characters left

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

more ▼

answered Dec 04, 2009 at 02:22 PM

Bampf gravatar image

Bampf
5.6k 13 30 66

(comments are locked)
10|3000 characters needed characters left

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.

more ▼

answered Dec 29, 2010 at 02:18 PM

td-lambda gravatar image

td-lambda
17 1

(comments are locked)
10|3000 characters needed characters left

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!

more ▼

answered Feb 18, 2013 at 03:22 AM

Pixelblock Games gravatar image

Pixelblock Games
6

@Pixelblock Games - I usually like to read the entire thread before posting an 'answer'. In doing so, it helped me see that torg is presenting a considerably more-complex issue, which your answer does not help with at all.

Mar 23, 2013 at 04:09 PM grojguy

i want to rotate the object manually by touch in android devices, how do i do that? can someone give me the script for it?

Sep 02, 2013 at 08:22 AM Safvan7

this answer does rotate 360 degrees around y axis but it does not rotate in the center of the object

Sep 09, 2013 at 04:13 AM geomorillo
(comments are locked)
10|3000 characters needed characters left
Your answer
toggle preview:

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Answers

Answers and Comments

Topics:

x8593
x3520
x3378

asked: Dec 03, 2009 at 12:19 PM

Seen: 93516 times

Last Updated: Sep 09, 2013 at 04:14 AM