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$
  • $\begingroup$ you want to render a frame for each new block being added? $\endgroup$ – zeffii Feb 5 '16 at 13:05
  • $\begingroup$ yes , but i talk about more than 400 cubes $\endgroup$ – user21553 Feb 5 '16 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 '16 at 13:12
  • $\begingroup$ related, possible duplicate: blender.stackexchange.com/questions/28673/… $\endgroup$ – zeffii Feb 5 '16 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 '16 at 14:40
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.

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

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.