# Change scale of objects in array without affecting distance

How do you change the scale of objects without changing their relative positions?

In a related question, objects are scaled relative to an Empty that is used as the Object Offset for an array. This also affects the relative spacing between the objects:

I'd like to accomplish a similar feat (scale an array of objects), but without changing their relative position. For example, in the following image, the objects are lined up in the desired locations, but changing the Empty's scale causes the objects (in the array) to shift:

Without using particles, how would you scale the objects of an array but keep the spacing between each object a constant?

I tried using a lattice and a simple deform, but both deformed the shape, rather than a simple scale. It might be possible to use a lattice with a number of hand-made subdivisions, but I'd really like for the scale to be easily tweaked and proportional.

Note: This is to render a single image, not a movie.

While the array modifier, with its limited scaling options isn't really suited for the task, you can quite easily achieve this using dupliframes.

Move and scale your object into the position you want the first duplicate to be in, and hit I to add a LocScale keyframe to it. Then move forwards on the timeline some amount of frames, for example 100. On this latter frame, move and scale your object to the transformation you want your last duplicate of the object to be, and insert another LocScale keyframe. Playing the animation should now move the object between the locations of the first and last duplicates you want to have.

Go into duplication panel of the object buttons, and enable the "frames" option, and set "off" frames to your animation length / (the number of copies you want to have - 1) - 1, and animation end frame one frame longer than your animation. This will take the object's position on frame 1 and add a copy there, skip the off amount of frames, and add another copy on the frame after that, and so on, ending on the final position of the object.

Because animation interpolation by default is non-linear, you should go to a graph editor, and set the curve interpolation to linear (T -> Linear)

Example result, with cube animated to go from 0 to 20 on X, with a copy every 5 units

The instance of the cube you animated will not be rendered, only the copies will be visible in the render.

• The alignment isn't perfect, but this is was the only way that I could make work. – Dave Jarvis Oct 31 '15 at 0:09

If you are using Object Offset, and scaling the empty, that acts as a scale modifier for all repeated objects. Similarly unapplied scale transforms will also be repeated on objects.

scaled empty

unapplied object scale

The way to scale the objects as a group is to scale via the vertices, Shape Keys let you morph between mesh states.

via vertices

shapekeys

• Thanks for this, but I seem to be missing something. I've added the shapekeys, but all the objects change size (as in your last image) simultaneously. The image in the "unapplied object scale" is close to what I'm looking to accomplish, but only scales the height. What happens when you scale the height (z) and the length (x)? Do the cubes remain equidistant? – Dave Jarvis Oct 30 '15 at 21:22
• The way I read your question led me to believe the last image was what you were looking for.. At this point I don't understand your question, but you have already accepted a question so perhaps nothing more needs to be added to this answer. – zeffii Oct 31 '15 at 12:32

## Sverchok

You can build a custom "Object array" with Sverchok add-on that would be able to take into account only the object's location, leaving the scale factor "out of the equation" of the duplicates positioning.

The base nodetree

Let's start developing a (relatively) simple operation which is able to duplicate an object in the origin to another object's location. A possible nodetree could be the following:

On the left, in the green nodes, you can set the two object (the cube and the empty) and with the slider between them you can control the number of object in the array.

Basically I'm picking a series (long as the number of duplications ) of unit vectors (1,1,1) and multiplying (component wisely) them by the XYZ coordinates of the empty. Then creating multiple matrix based ond such vectors to transalte the initial geometry.

The scale of the empty is instead going inside the matrix without any operation, so it will be the same for all the object.

The full nodetree:

Now it's time to get rid of the limitations of the previous approach and build a more powerful algorithm able take in account also the fact that the object could be located far away from the origin. You can see mine see in the upper label of the image below.

Let's now focus on how to inherit the scale also.. without going too deeeply into the details, with the nodes in the bottom label, I'm getting the each component's scaling ratio between the two object and creating a esponential serie of vector to scale the object with.

I choose an exponential series to mime the array modifier scaling behaviour, but with this approach you can costumize it (e.g. linear...)

(Don't forget to update your nodetree to see the node in action...)

If I get your question, can't you do that, but with constant offset?

• Try one row of cubes. The cube on the left is large, the cube on the right is small, and the cubes in between decrease from large to small. The space between each cube should be a constant (the centers of the cubes equidistant, regardless of cube size). – Dave Jarvis Oct 30 '15 at 10:12