Take the 2-minute tour ×
Blender Stack Exchange is a question and answer site for people who use Blender to create 3D graphics, animations, or games. It's 100% free, no registration required.

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

enter image description here

share|improve this question
    
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 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 at 3:25
    
I updated my answer. –  his Jan 6 at 5:41
add comment

2 Answers 2

up vote 9 down vote accepted

Add an empty at the origin of the object that you want to duplicate. 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.)

Screenshot

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.

share|improve this answer
    
Hi his, I just updated my question with more detail. Could you please take a further look at it? Thanks. –  Leon Cheung Jan 6 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 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 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 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 at 7:19
add comment

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:

  1. Add a cube.
  2. In Edit mode move that cube to the left. The cube's origin should remain unchanged and in the same location.
  3. Return to Object mode and add an empty (hopefully you haven't moved your 3D Cursor, so the empty should have the same origin as your cube).
  4. Rotate the empty (say... 5 degrees)
  5. Add an Array modifier on the cube using the empty as your offset. You should see the circular array form around the empty.
share|improve this answer
    
Hi Fweeb, yep, it works. :) But is there any way to avoid changing the location of the origin? I think that's I really meant, wait I should update the question, sorry for that. –  Leon Cheung Jan 6 at 2:58
    
If you want the arrayed object to keep its origin fixed, then you might be better off using Dupliverts instead of the array modifier. It's an older technique, but it does have the side benefit of being more memory efficient (Dupliverts uses instances whereas the array modifier generates geometry). Failing that, you could also try a path constraint (to a bezier circle) on a regular array with just a relative offset. –  Fweeb Jan 6 at 5:30
    
Sure Fweeb, I agree with the idea by using Dupliverts, and I know that way, too. I'm just thinking about using Array modifier, since it is much more flexible and controllable with less additional work, in case that I need to animate that. –  Leon Cheung Jan 6 at 6:56
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.