# How to make a circular array using offset object as center?

We know that the there is an Object Offset option for Array modifier, but when trying to make a circular array with that offset object as the center of the array circle, it always doesn't behave quite like what's expected. So how to make a nice and controllable circular array?

P.S.: There is an old trick on CGCookie about moving the object's origin. I wonder if there is any way to do this without changing the location of the origin. :)

-
Why don't you want to move the origin? Of course it is possible, you just have to calculate the rotation and translation of the empty manually. Not hard with a little bit of trigonometry but generally unnecessary. – his Jan 6 '14 at 3:13
Since the original origin will be taken in further use. And it is not so easy to calculate it back unless it fits any item listed in the SHIFT CTRL ALT C menu. – Leon Cheung Jan 6 '14 at 3:25
I updated my answer. – his Jan 6 '14 at 5:41
The link on CGCookie seems to be gone. I couldn't find it but would love to see the other option as well if you can relink? Thanks! – fabrice d Mar 31 at 5:54
@fabriced Oh right, it does outdated. Luckily I tried to find the video on YouTube. Please recheck the updated link. – Leon Cheung Apr 1 at 0:43

Add an empty at the origin of the object that you want to duplicate. (Remember to hit CtrlA and select rotate and scale, to apply transormations on the original object). Then, add an array modifier with object offset linked to this empty.

Set the 3D cursor to the desired centre of the circle. Add another empty here. Make it the parent of the other empty. Now select only the centre empty. Rotate. The amount of rotation is of course dependent on the number of objects, e.g. 12 objects = 30°.

If you want the single elements to "touch" as in your picture you need to either adjust the object width or the radius. The circumference of the circle is 2 * PI * radius, so the width has to be the nth (e.g. 12) part of it. (Or, if it is not about absolute exactness, it can be done visually.)

You probably want to parent the object to the centre empty.

This circle is "controllable" as you can simply change the angle by rotating the centre empty.

-
Hi his, I just updated my question with more detail. Could you please take a further look at it? Thanks. – Leon Cheung Jan 6 '14 at 3:08
This makes sense to me. I just wonder what if the cube already got a parent before that, in that case, you have to clear the old one and parent it to the center empty (then parent back again?). But your idea is indeed what I mean by "controllable". – Leon Cheung Jan 6 '14 at 6:52
The cube would be the parent, the centre empty its child, and the outer empty the child of the centre empty. So no problem there. – his Jan 6 '14 at 6:57
Good point. Yeah, I think this solves all concerning problems. By the way, I bet the Pivot constraint can be used instead, similarly. So it seems plenty of ways in doing so. If you think the Pivot constraint works as well, please consider complementing that in your answer to guide other guys better. :) – Leon Cheung Jan 6 '14 at 7:06
Probably. But that constraint is marked with "very buggy", even in the GUI. I would refrain from using it yet for productive work. – his Jan 6 '14 at 7:19

Just want to complement with several tricks that I just figured out. They all share with the same idea - to offset the rotation pivot of the Offset Object:

Variant 1:

Using 3D Cursor as pivot. (PROS: Fast and straight forward. CONS: Not suitable for animation)

Variant 2:

Using another object as rotate center.

Variant 3:

Parenting.

Variant 4:

Using Pivot constraint.

Variant 5:

Using Hook modifier and Copy Location constraint.

-
How do you "drag-multiply"? (First gif) looks neat – fabrice d Mar 31 at 5:55
I just select the cube then hit R to rotate along current pivot (I've switched pivot type to 3D Cursor, as seen in the same gif). – Leon Cheung Apr 1 at 0:32

To do that, you would need the arrayed object's origin to be in the same location as your offset object's origin. Try this test: