I'm trying to generate a 3D grid that can be rendered visibly in the Cycles renderer. Preferably using a script where I can customize the size and dimensions.

I'm picturing something like this: enter image description here

I've tried the answers from this question: Create gridlines in Python But the script from the first answer only generates a floor grid which isn't very useful. For the 2nd script, I couldn't figure out how it works.

So any help will be appreciated!

  • $\begingroup$ First and Second answer will depend on how answers are ordered. (Active, Oldest, Votes) Surely being shown how to create one grid is somewhat useful. Both scripts would need updating to work in 2.8x. Which is the primary question here, how to render edges in cycles or how to create them? $\endgroup$
    – batFINGER
    Apr 3, 2020 at 20:00
  • $\begingroup$ @batFINGER I managed to update both of them just fine. The script by CodeManX is the one that generates one grid, but you can already do that simply with Add->Grid. The primary question is creating them. $\endgroup$
    – what the
    Apr 3, 2020 at 20:07

3 Answers 3


I came up with two scripts, one which "brutally" instantiates verts and edges, then converts it to a curve in order to add thickness.

import bpy

mesh = bpy.data.meshes.new('Mesh_Grid')
obj = bpy.data.objects.new('Obj_Grid', mesh)

rows, columns, levels = 10, 10, 10
wire_thickness = 0.02

verts, edges = [], []

i = 0
for l in range(levels):
    for r in range(rows):
        for c in range(columns):
            verts.append((c, r, l))
            if c < columns - 1:
                edges.append((i, i + 1))
            if r < rows - 1:
                edges.append((i, i + columns))
            if l < levels - 1:
                edges.append((i, i + (rows * columns)))
            i += 1

mesh.from_pydata(verts, edges , [])


bpy.context.view_layer.objects.active = obj


obj.data.bevel_depth = wire_thickness

Result : enter image description here

And the other one which is the same as @Vega_KH's answer, but as a script. I just added a weld modifier in order to avoid duplicate geometry. (Need Blender 2.82+) :

import bpy

dimensions = (10,10,10)
wf_thickness = 0.1

bpy.ops.mesh.primitive_cube_add(enter_editmode=False, location=(0, 0, 0))
cube = bpy.context.selected_objects[0]

for i in range(3):
    mod = cube.modifiers.new('Array_' + str(i), 'ARRAY')
    mod.relative_offset_displace[0] = 0
    mod.relative_offset_displace[i] = 1
    mod.count = dimensions[i]

cube.modifiers.new('WD', 'WELD')
wf = cube.modifiers.new('WF', 'WIREFRAME') 
wf.thickness = wf_thickness

Result : enter image description here


enter image description here

This was made in about 2 minutes by doing this:

  1. Start with a cube. The base cube that comes with a new scene is fine.
  2. Add an array modifier.
  3. Change count to 8. Leave the "relative offset" default (1,0,0)
  4. Add another array modifier.
  5. Change the count to 8. Change the "relative offset" to (0,1,0)
  6. Add another array modifier.
  7. Change the count to 8. Change the "relative offset" to (0,0,1)
  8. Add a wireframe modifier. Change the thickness to 0.1m.

This isn't a script but you can just adjust the count on each modifier up and down to easily resize the grid. And obviously change the thickness on the wireframe modifier to make the lines thicker.


ANother one

Sheesh, doesn't pay to get sidetracked.

Similarly to https://blender.stackexchange.com/a/61254/15543

import bpy
import bmesh
from bpy import context

obj = context.object
me = obj.data
# add two array modifiers

arrays = ((10, (1, 0, 0)),
          (10, (0, 1, 0)),
          (10, (0, 0, 1)),

for count, displace in arrays: 
    print(count, displace)         
    mod = obj.modifiers.new("Array", 'ARRAY')
    mod.count = count
    mod.relative_offset_displace = displace


bm = bmesh.new()

# remove faces and doubles




You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .