# How to align polyhedra face to face in an array

I am trying to create an array that starts from the object's face rather than from its geometric center (to create objects made of tiled polyhedra), here is an approximate example of what I mean:

To make an array I've moved my object's origin to a face and made a custom transform orientation perpendicular to the face:

Yet when I create an array it doesn't behave the way I thought it would:

Looks like the offset occurs from the object's center rather from the face, and the direction of the offset doesn't make sense to me (it's supposed to be X, why is it going upwards?).

How do I get my modifier to start from the specified face along the specified axis?

Well, I found the solution. Although the result does not look like the object on the very first picture, the array elements lined up face to face, which is what I wanted. The problem is that some non-rectangular polyhedra have no faces being normal to their coordinate axes. Since the array modification relies on the "local" coordinate system of the whole object, you can't produce an array with objects aligned face to face unless you change the object's local axes.

The solution is basically given in the comment above, with a tweak to achieve perfect alignment of the faces. So, once more:

1. Create an icosahedron and a cube.
2. Using a plugin ("align by faces", from here), align the face of a cube with one of the object's faces.
3. Delete all of the cube's vertices.
4. Join the icosahedron TO the cube (not the other way round) so that the resulting object inherits the cube's axes.
5. Origin to geometry and create an array.
6. Create an empty in the center of the icosahedron. At this point you can set the empty as the offset object to check how things are looking.
7. Rotate the empty so that the "normal" axis (along which the array should be situated), in my case the x-axis, aligns with the icosahedron's axis. I just copied the angle numbers from one to the other. The result is this:

And of course this can be further tweaked by moving/rotating the empty and changing offsets.

You may consider to use the Align by Face addon, which is already implemented in every blender builds now.

1. CtrlAltU to bring the User Preferences window, enable Align by Face addon under Addons tab (usage can be found here);
2. Duplicate one copy to make the first align by face, then CtrlJ to join them.
3. If you repeat the last step, the array can be done in geometrical progression. Sometimes the final rotation alignment may be inverted, then you can rotate the new aligned mesh with the technique you've already known.
4. Go to Edit Mode of the fninal joint mesh, select all elements and W > Remove Doubles.

After a few steps, I think you may get the result as you expected, like this:

It is not an automatic way, but may be acceptable with a limited array amount.

Another option is to do this by mirroring along face:

1. Create the icosphere;
2. Select one face. Ctrl, (switch to median point); ShiftS > Cursor to Selected; . (swich to 3D cursor);
3. AltSpace > Normal; CtrlAltSpace, rename this new transform orientation;
4. CtrlI, ShiftDEnter, CtrlMZZEnter;
5. Repeat the last three steps, until what's expected;
6. Remove Doubles after finishing.
• Thanks Leon! That's the method I used to produce the first picture in the question. I just wanted to see what can be produced using the automatic arrays. Jan 17 '14 at 17:10
• I see. I'm afraid further coding is needed here. Jan 17 '14 at 17:22
• I like the mirroring along face option! That's a faster way to do it. Jan 17 '14 at 17:25

You'll notice that the offset is in the direction of the green arrow, which happens to be the LOCAL x-axis ;-) To clarify, the relative offset is using local space, so it will be in the directions that relate to the local axes, not the global axes.

It will help to make your object's axes the same as the world axes. This just makes things a little more intuitive.

It may also help to explore using the "Object Offset," which makes it relative to some other object, like an empty. It can be easier to see what's going on, that way.

Hope that helps!

• I see. I thought that if I'd selected the custom orientation the modifier would use it. But instead the modifier is using the local orientation and that's why the center and the direction of the array is not according to the custom orientation ("empty"). Jan 16 '14 at 20:56
• Quite right. That's also why you can grab the original object and transform it, and the arrayed objects will follow it around, even if you rotate, etc. If you use another object, like an empty, you'll have to make sure and move the empty with the original object anytime you ever transform it. (A simple solution would be to make the empty a child of the original object)
– Matt
Jan 16 '14 at 20:59
• I've been messing around with empties and it didn't get me very far. It seems to me that the problem really is that you need to change the local axes so that one axis is normal to one of the faces. This thread: fsdeveloper.com/forum/showthread.php?t=427932 has a mechanism for changing the axes. Accordingly I've created a cube, aligned it with a face of my icosahedron -> delete vertices -> join -> origin to geometry. It worked and the resulting array is doing what I want it to do, except I need to get the rotation right. Jan 16 '14 at 22:49
• I'm glad you found something that worked, but I really think that's the long way around. Without experimenting more myself, I can't be certain, but my spidey-sense is tingling somethin' aweful. I really think a much easier way is very close by.
– Matt
Jan 17 '14 at 16:18