34
$\begingroup$

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

$\endgroup$
  • $\begingroup$ 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. $\endgroup$ – his Jan 6 '14 at 3:13
  • $\begingroup$ 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. $\endgroup$ – Leon Cheung Jan 6 '14 at 3:25
  • $\begingroup$ I updated my answer. $\endgroup$ – his Jan 6 '14 at 5:41
  • $\begingroup$ 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! $\endgroup$ – MicroMachine Mar 31 '16 at 5:54
  • 1
    $\begingroup$ @fabriced Oh right, it does outdated. Luckily I tried to find the video on YouTube. Please recheck the updated link. $\endgroup$ – Leon Cheung Apr 1 '16 at 0:43
44
$\begingroup$

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

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.

$\endgroup$
  • $\begingroup$ Hi his, I just updated my question with more detail. Could you please take a further look at it? Thanks. $\endgroup$ – Leon Cheung Jan 6 '14 at 3:08
  • 1
    $\begingroup$ 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". $\endgroup$ – Leon Cheung Jan 6 '14 at 6:52
  • $\begingroup$ 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. $\endgroup$ – his Jan 6 '14 at 6:57
  • $\begingroup$ 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. :) $\endgroup$ – Leon Cheung Jan 6 '14 at 7:06
  • $\begingroup$ Probably. But that constraint is marked with "very buggy", even in the GUI. I would refrain from using it yet for productive work. $\endgroup$ – his Jan 6 '14 at 7:19
30
$\begingroup$

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)

First, use an empty object in Object Offset section in the Array modifier setting, then, all you have to do is to rotate the empty object, instead of the arrayed object itself:

enter image description here

enter image description here

Variant 2:

Using another object as rotate center.

Note that this variant uses two empties; one at the cube center (just like Variant 1) and one for the pivot point (replacing the 3D Cursor in Variant 1).

To do the actual rotation after setting the Active Element as Pivot Point, first Right-Click the empty at the cube center to select it, then Shift+Right-Click the pivot center empty to select that as well, then R to rotate.

enter image description here

Variant 3:

Parenting.

enter image description here

Variant 4:

Using Pivot constraint.

enter image description here

Variant 5:

Using Hook modifier and Copy Location constraint.

enter image description here

$\endgroup$
  • 1
    $\begingroup$ How do you "drag-multiply"? (First gif) looks neat $\endgroup$ – MicroMachine Mar 31 '16 at 5:55
  • 1
    $\begingroup$ 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). $\endgroup$ – Leon Cheung Apr 1 '16 at 0:32
  • 4
    $\begingroup$ This does not work. Can you add description how you did it? Gifs are telling nothing. $\endgroup$ – Paweł Audionysos Sep 28 '16 at 18:13
  • 5
    $\begingroup$ When I hit R I'm just rotating selected object (not making 9 copies of it). $\endgroup$ – Paweł Audionysos Sep 29 '16 at 10:30
  • 1
    $\begingroup$ Your answer is not complete. It's not clear what you're doing from the beginning. What is the "offset object"? Are you using the array modifier? That's what @PawełAudionysos, me and others don't understand. $\endgroup$ – ecv Feb 14 '18 at 12:28
10
$\begingroup$

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.
$\endgroup$
  • $\begingroup$ 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. $\endgroup$ – Leon Cheung Jan 6 '14 at 2:58
  • $\begingroup$ 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. $\endgroup$ – Fweeb Jan 6 '14 at 5:30
  • $\begingroup$ 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. $\endgroup$ – Leon Cheung Jan 6 '14 at 6:56
4
$\begingroup$

People have been struggling with Leon's answer. Here is how it works (I'm using default blender scene, with 3D Cursor placed at the origin):

  1. Go to Top Ortho View (Numpad7 and Numpad5).
  2. Add an Empty (Shift + A > Empty > Plain Axis). This empty will act as the center point.
  3. Add a cube and move it 5 units in Y direction. (Shift + A > Mesh > Cube, G, Y, 5, Enter).
  4. Move cube's origin to 3D Cursor. (Ctrl + Shift + Alt + C, Origin to 3D Cursor).
  5. Add Array modifier to the cube. Set number of copies to (say) 12 and turn off Relative Offset option.
  6. Turn on Object Offset and choose empty from the drop-down list.
  7. Make sure the cube is still selected, now press R and perform rotation. All the array elements will start following circular path around the empty. You can distribute them evenly by mouse or you can type an angle as you normally do in rotation.
$\endgroup$
  • $\begingroup$ Thanks. Actually I didn't change the object origin, since normally you don't want to do that, which is why I use tricks (like two empties) as workaround. But your way is good if it is not quite a matter. :) Plus, I've updated the answer sometime ago. I think it should make things clearer. Feel free to discuss. $\endgroup$ – Leon Cheung Apr 22 '18 at 3:25
3
$\begingroup$

There is a method that actually doesn't require an array modifier:

First figure out how many objects you need, then divide 360 by that number and you have the amount of degrees between each object. For this example, I use a step value of 10 degrees for 36 objects.

Then place the 3D-Cursor in the center of rotation and set the pivot point in the header to 3D-Cursor.

pivot point in the 3D header

Select your object, duplicate it with SHIFTD and then without even confirming that hit R10RETURN.

That way, Blender considers duplication and rotation as a single action, not two.

You can now use the repeat hotkey SHIFTR to create a full circle of objects and they will be rotated evenly around the cursor.

You can use ALTD to create linked copies instead of SHIFTD if you want to save a bit of memory and filesize. All objects will then use the same mesh.

The advantage of this method is that you have ready to use objects which keep their axes and you save the time for setting up the modifier.

$\endgroup$
0
$\begingroup$

I used blender once to create so called Venetian blinds with an array modifier. To keep rotation of the array objects around there individual origin, I rigged the object to use with the array modifier to a single bone in the center of the object. When you rotate this bone, each object created by the array modifier will rotate around it's own center.

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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