Skip to content

Instantly share code, notes, and snippets.

What would you like to do?
# a blender-python script that generates a normal distribution of cubes and ico-spheres
# then animates a subset of the objects, levitating a few objects into a line to the left and a few to the right
import bpy, numpy
from mathutils import *
radius = 30
n_samples = 50
samples = numpy.random.multivariate_normal([-0.5, -0.5], [[radius, 0],[0, radius]], n_samples) #returns an array of arrays
for xy in range(len(samples)):
xyz = tuple(samples[xy]) + (0,) # convert array to tuple, append tuple for z coordinate 0, result is 3-tuple
if(numpy.random.sample() > 0.5): # roll the dice, make half of samples cubes, half ico-spheres
bpy.ops.mesh.primitive_cube_add(location = xyz)
bpy.ops.mesh.primitive_ico_sphere_add(location = xyz)
allObjects = list( #convert to list so we can shuffle it ( seems to return objects in alphabetical order, not insertion order)
numpy.random.shuffle(allObjects) #shuffle in place
for leftSample in range(5):
thisObject = allObjects[leftSample] # grab a reference to an object
thisObject.keyframe_insert('location',frame=0) # define current location as location at frame 0
thisObject.location = Vector(((-leftSample * 3) - 3,0,10)) # change location via vector addition
thisObject.keyframe_insert('location',frame=125) # define new location as location at frame 125
for rightSample in range(5,10):
thisObject = allObjects[rightSample]
thisObject.location = Vector((((rightSample - 4) * 3) + 3,0,10))
bake_anim_use_all_actions=False) # following recommendations from SketchFab
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.