how to distribute different objects evenly in Object Mode? I know about dupliverts, particles, array modifier, etc, but they do not serve as a good, general solution.

EDIT: I have a scene with a quite a lot objects. They are already there, the question is how, in general, to distribute them evenly in linear (or in 2d/3d) fashion.

  • $\begingroup$ What exactly are you looking for? Could you add some images of what you want to do? $\endgroup$ – gandalf3 Nov 28 '13 at 19:00
  • 1
    $\begingroup$ You could try using Shift+S > Selection to grid, but beyond that I think you will have to script this in python. $\endgroup$ – gandalf3 Nov 28 '13 at 22:27
  • $\begingroup$ Dear Gandalf, this is simple like that - just a bunch of object scattered randomly. So, they are in really random positions, and it seems there is no simple native way of distributing them. $\endgroup$ – piotao Nov 29 '13 at 20:33

Afaik, I think you have to use script or some existing addons. The only addon I've ever seen that can do distribute is the Oscurart Tools, which has been bundled with the official Blender build, already.

The following steps show you how to use it:

  • File > User Preferences (or press CtrlAltU), then enable Oscurart Tools in the Addons list;
  • Back to the scene, select the objects you want to distribute;
  • Find Oscurart Tools panel down in the left-hand Tool Shelf, enable Object button, which will bring a new panel below called Object Tools;
  • Click Distribute button in it, and choose the axis (X Y and/or Z), then click OK.

enter image description here

enter image description here

NOTE: The order in which the objects are selected is quite important, which determines how you want to distribute them, as shown below.

enter image description here

Manual page for this addon see here. Btw, Oscurart Tools is much more powerful other than distribute.

Note: This addon has been removed from Blender via https://developer.blender.org/rBA731efb680132e3d5f846cae9b448a74a7b74a9b8

  • $\begingroup$ Thank you! That was the solution, using a script is perfectly OK. And Oscurart is very powerful. $\endgroup$ – piotao Nov 29 '13 at 20:35
  • 1
    $\begingroup$ Apparently, not included by default in 2.75a. But you can still download the source into addons_contrib directory, and they work great! $\endgroup$ – Michael Bray Jul 20 '15 at 3:06
  • $\begingroup$ @MichaelBray Thanks for the information. :) $\endgroup$ – Leon Cheung Jul 20 '15 at 6:22
  • $\begingroup$ @LeonCheung i have ask the question blender.stackexchange.com/questions/69231/… and u can see the results its not having the proper spacing. $\endgroup$ – atek Dec 14 '16 at 14:29
  • $\begingroup$ @atek as I said, it depends on selection order. For your case there, you may want to select them one by one in order, instead using B tool. Or you can try first select the top cylinder, then using C tool. Good luck. $\endgroup$ – Leon Cheung Dec 15 '16 at 7:50

As Leon Cheung's answer showed, Oscurart Tools add-on (bundled with Blender) is great for linear distribution between two objects AND it respects the order of your objects selected, a feature I have not found in other distribute tools. Here are some others I've found which may serve your unique needs:

Distribute Objects Addon - Another Array Addon created by Duarte Ramos

  • Excellent for evenly distributing objects in a single row, 2d grid, or even 3d grid.
  • He does offer it for free and if it helps you and you want to contribute, it's on BlenderMarket.

Distribute Objects add-on settings in action

BsMax 2.80 - created by Naser Merati (Nevil)

  • Has many features and is free.
  • Object>Transform>Distance Sort respects rotation and scale and will evenly space, rotate, and scale the objects relative to the farthest two objects. enter image description here
  • Object>Transform>Path Sort distributes objects along an open OR closed Curve>Bezier or Curve>Circle like this BezierCircle. First select your objects to be distributed, and then the Curve object, and then choose "Path Sort". It will ignore disconnected Bezier segments, so an "i" Bezier shape for example would either ignore the dot of the "i" or it it will ignore the long stroke segment of the "i". Ironically, "Path Sort" does NOT work with Nurbs objects, including "Path".
    enter image description here

BONUS: Align Tools (bundled add-on)

  • Does NOT evenly distribute between two objects, but can be very useful for aligning an array of objects to a floor or wall etc. For example, the Advanced align options provides min / max of mesh bounding boxes, so if I use BsMax addon's "Distance Sort" to evenly distribute and tween my cubes like this, enter image description here

I can then align the cubes (previously selected) to the top of the monkey's head (active object) with Align Tools "Advanced" options like this, aligning the "Min" or lowest point of each cube's bounding box to the "Max" highest point of the monkey's bounding box: enter image description here


I like to use ShiftR to repeat the last step (when the last step was duplicate/move).

For example:

  1. Duplicate a cube enter image description here

  2. Press ShiftR to repeat the last step enter image description here

  • 2
    $\begingroup$ Thanks, but that's not the case. Sorry to describe my problem wrongly. The scene is already set up and objects are already there, and they are not the same in side and shape. You solution is nice and clean, and I knew it already, but it serve well only for the same object. $\endgroup$ – piotao Nov 28 '13 at 19:04

None of these addons seemed to work for Blender 2.90 so I made my own basic one. It distributes along an axis taking bounding box into account, an an option for the margin in between items.



  • 1
    $\begingroup$ You're a champion! $\endgroup$ – Mobin Mar 9 at 13:35
  • $\begingroup$ Perhaps add some documentation. I tried it but I could not use the margin option. It collapses the objects next to each other. $\endgroup$ – Rafael Jun 20 at 5:22

blender -> scripting -> text editor -> new script

import bpy

# turntables
xoff = 0
xstep = 2
yoff = 0
ystep = 2

ywrap = 10

# set the translation of all objects
for obj in bpy.data.objects:
    obj.location[0] = xoff
    obj.location[1] = yoff
    xoff += xstep
    if xoff > ywrap:
        xoff = 0
        yoff += ystep

execute the script with: alt+p

  • $\begingroup$ except, these locations are some how temporary? do not save and do not show in renders $\endgroup$ – ThorSummoner Nov 30 '20 at 23:29
  • $\begingroup$ This can be seemingly cleared by selecting all the object and deleting keyframes (ctrl+i) $\endgroup$ – ThorSummoner Nov 30 '20 at 23:34

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.