2
$\begingroup$

I have a little problem :) I need to do a program in python , blender , in wich i must built a structure of many cubes. i am a absolutely beginner , and i have no experience in python. I realize a functional program in python and i succeded to built the structure , but i don't know how to make a mini-movie in which i would see how really my structure construct itself. this is the program i have made :

import bpy

for i in range(6):
    for x in range(-i,i+1):
        for y in range(-i,i+1):
            for z in range(-i,i+1):
                if(x<0):
                    xx=-x
                else:
                    xx=x

                if(y<0):
                    yy=-y
                else:
                    yy=y

                if(z<0):
                    zz=-z
                else:
                    zz=z

                if(xx+yy+zz==i):
                    bpy.ops.mesh.primitive_cube_add(radius=0.5,location=(x,y,z))

That is all.. I have been looking for a tutorial for more than a mouth , and i can't see one who would be useful for my program . Help meeee!!!

$\endgroup$
10
  • $\begingroup$ you want to render a frame for each new block being added? $\endgroup$
    – zeffii
    Feb 5, 2016 at 13:05
  • $\begingroup$ yes , but i talk about more than 400 cubes $\endgroup$
    – user21553
    Feb 5, 2016 at 13:09
  • $\begingroup$ i was thinking about puting sleeptime after every iteration , but my program waited and show me nothing until the program is finished $\endgroup$
    – user21553
    Feb 5, 2016 at 13:12
  • $\begingroup$ related, possible duplicate: blender.stackexchange.com/questions/28673/… $\endgroup$
    – zeffii
    Feb 5, 2016 at 14:27
  • $\begingroup$ sleep() wont work, but if you want to see this code running in 3dview in realtime then the above link shows a few approaches. it's not exactly clear what you want to produce as an outcome. Please elaborate. $\endgroup$
    – zeffii
    Feb 5, 2016 at 14:40

1 Answer 1

2
$\begingroup$
import bpy
from itertools import product

mesh = bpy.data.meshes['Cube']
objects_scene = bpy.context.scene.objects
objects_data  = bpy.data.objects
actions_data  = bpy.data.actions

def create_cube(name, location):
    obj = objects_data.new(name, mesh)
    objects_scene.link(obj)
    obj.location = location
    return obj

def create_animation(obj, time):
    obj.animation_data_create()
    obj.animation_data.action = action = actions_data.new("Action")
    fcurves = [action.fcurves.new(data_path) for data_path in ("hide", "hide_render")]
    for fcu in fcurves:
        fcu.keyframe_points.insert(   0, 1, {'FAST'}).interpolation = "CONSTANT"
        fcu.keyframe_points.insert(time, 0, {'FAST'}).interpolation = "CONSTANT"
        fcu.extrapolation = "CONSTANT"

n = 6
time = 1    
for i in range(n):
    for indices in product(range(-i, i+1), repeat=3):
        if sum(abs(j) for j in indices) == i:
            cube = create_cube("Cube", indices)
            create_animation(cube, time)
            time += 1

The result rendered using the OpenGL Viewport Renderer:

result


Note

I scaled down the default cube manually and deleted it afterwards before i ran the script.

$\endgroup$
1
  • $\begingroup$ you are a genius ! Can i move my camera around the construction , while it is building? $\endgroup$
    – user21553
    Feb 6, 2016 at 21:26

You must log in to answer this question.

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