How to array or instance light point or other type of light source?

I need to array a series of objects each parented to its own light point. I discover that lights cannot be arrayed? Can somebody explain why? Are lights a specific type of object that cannot be duplicated? I tried to instance cubes with lights parented to them but as you can see on the screenshot attached, just the cube gets arrayed or instanced but not the light… Some technical info here would be welcome…

I think I know a workaround. You can instance lights as the object for particle systems, so you could make a faux array that is just one vertex placed wherever you want, and have a particle system on it that spawns at vertices, remove any kind of velocity or gravity from it, and make them all emit at the same time with a long life.

I dont get why alt+d doesnt instance lights, but it annoys me too.

1 Like

I got stuck by that question last night and then searching on the web I found on Stack exchanges the following solution : https://blender.stackexchange.com/questions/24391/how-to-create-an-array-of-lamps
So I did try it with 2.82a and it works. The solution is to create a series of vertices, a mesh of one line of vertices or more, then to parent the light to a vertex using vertex as parenting target. The light will be replicated along the series of vertices … see blend joined.282 Array light .blend (549.2 KB)

1 Like

Thanks Niklas

I did post a reply as I could find a solution to the question. Your solution is interesting on its own because of the use of particle to spread the lights… Thanks again

Huh? That has always worked for me. The instanced lights also share settings as expected. I can also alt+d geometry with a light parented if both are selected.

Yeah. Array mod doesn’t work on lights or collections. Very annoying.

I suggest doing a very basic into to python course and then do the intro to JS course over on Khan Academy. The basic drawing geometry via code stuff they teach you comes in very handy in 3d as well.

You can create a light and use alt+d to instance it so all the lights share the same strength and nodes. Then you can use some basic python to space them out evenly:


import bpy

# https://www.reddit.com/r/blenderhelp/comments/bx03hc/how_to_use_code_to_position_objects/

#base z value
z_base = 0;
#offset z value
z_offset = 1;

#loop through all selected objects
# i is the current index of the loop
# obj is the current object being inspected
for i, obj in enumerate(bpy.context.selected_objects):
    #location has 3 indexes, 0=x, 1=y, 2=z
    #if you need x/y to be 0 you can set them here.
    obj.location[2] = z_base + (z_offset * i)

Or you can look up how to use sine and cosine to arrange them in a circle or use a 2nd loop within the loop to create a grid and stuff like that.

grid example in JS: https://www.khanacademy.org/computer-programming/spin-off-of-project-bookshelf/5691752398848000

radial example in JS: https://www.khanacademy.org/computer-programming/radial-array-loop/4509465009340416

just need to figure out the python version of the code in general and the Blender python api commands for creating and positioning a light and setting it’s strength.

Thank you for the code @thinsoldier This is another way I didn’t know or think about… ](https://blenderartists.org/u/thinsoldier) I’ll look at that…

Well Alt-D works with lights to instance them… I just tested it now and it works… I must have miss something last night…

Huh, it works for me now too. Maybe it was just broken in one of the experimental builds I used at some point?