Este ejercicio esta relacionado con la página Usando keyframe_insert.
El ejercicio consiste en poner 10 esferas en fila sobre el eje de las "Y", luego animarlas, recorriendo el eje de las "X", durante 240 cuadros. El script se puede recuperar del depósito de archivos, con el nombre "10_esferas_keyframe_insert.py" .
import bpy
pos_ini = [0,0,0]
i = 0
while i<10:
bpy.ops.mesh.primitive_uv_sphere_add(segments=32, size=0.15, location=pos_ini)
bpy.ops.object.shade_smooth()
j = 0
ob = bpy.context.active_object
frame_num = 0
pos_ini[0] = 0
while j < 25:
bpy.context.scene.frame_set(frame_num)
bpy.context.active_object.location = pos_ini
bpy.context.active_object.keyframe_insert(data_path="location", index=-1)
pos_ini[0] =pos_ini[0]+0.1
frame_num += 10
j = j + 1
pos_ini[1] = pos_ini[1] + 0.5
i = i + 1
Vamos a comentar el script.
Lo primero es poner la fila import bpy, de este modo accedemos al API de Blender a través de esta libreria.
La variable pos_ini = [0,0,0] , utilizamos una lista para indicar la posición inicial de la primera esfera, en coordenadas X=0, Y=0, Z=0; esto es importante porque luego en el script iremos modificando esta lista.
Con una doble iteración, resolvemos el crear cada esfera e insertar las llaves de los cuadros de animación (keyframe_insert)
bpy.ops.mesh.primitive_uv_sphere_add(segments=32, size=0.15, location=pos_ini)
Con esta línea creamos una esfera, la localización de la misma esta dada por la variable pos_ini, esta variable luego se incrementa en 0.5 solo para las Y, con esta línea pos_ini[1] = pos_ini[1] + 0.5
con la siguiente suavizamos la superficie.
bpy.ops.object.shade_smooth()
En la otra iteración se insertan las llaves de animación, solo referidas a la posición en X,Y,Z
bpy.context.scene.frame_set(frame_num)
bpy.context.active_object.location = pos_ini
bpy.context.active_object.keyframe_insert(data_path="location", index=-1)
Luego se increnta la posición en X en 0.1 y el número del cuadro (frame) en 10 unidades.
pos_ini[0] =pos_ini[0]+0.1
frame_num += 10
Hay que hacer notar que debemos poner a 0 la posición en X, de este modo todas las esferas tiene la misma coordenada de partida. También el número de cuadro (frame) a 0. Con estas líneas
frame_num = 0
pos_ini[0] = 0
Esto es en pocas palabras como se resuelve este ejercicio. Seguramente alguno encontrará otra forma mejor de resolverlo. A partir de este ejercicio podemos jugar cambiando pos_ini[2], es la coordenada en Z.
Al final del ejercicio la variable tiene la posición de la última esfera en la última posición de la animación, más el último incremento en X e Y.
Este es el video del ejercicio: 10_esferas_01.avi
Una variante del script anterior, se agrega un efecto aleatorio con random
import bpy
import random
pos_ini = [0,0,0]
i = 0
while i<10:
bpy.ops.mesh.primitive_uv_sphere_add(segments=32, size=0.15, location=pos_ini)
bpy.ops.object.shade_smooth()
j = 0
ob = bpy.context.active_object
frame_num = 0
pos_ini[0] = 0
pos_ini[2] = 0
while j < 25:
bpy.context.scene.frame_set(frame_num)
bpy.context.active_object.location = pos_ini
bpy.context.active_object.keyframe_insert(data_path="location", index=-1)
delta=random.choice([0.05,0.04,0.03,0.02,0.01,0.0,-0.01,-0.02,-0.03,-0.04,-0.05])
pos_ini[0] =pos_ini[0]+delta+0.1
delta=random.choice([0.05,0.04,0.03,0.02,0.01,0.0,-0.01,-0.02,-0.03,-0.04,-0.05])
pos_ini[1] = pos_ini[1]+delta
delta=random.choice([0.05,0.04,0.03,0.02,0.01,0.0,-0.01,-0.02,-0.03,-0.04,-0.05])
pos_ini[2]=pos_ini[2]+delta
frame_num += 10
j = j + 1
pos_ini[1] = pos_ini[1] + 0.5
i = i + 1
bpy.ops.screen.frame_jump()
Al final del script se agrega la fila bpy.ops.screen.frame_jump() que fue sugerida por +Jorge Herández - Meléndez, el también hizo una versión propia del anterior script, que me inspiro para utilizar el random.
La fila delta=random.choice([0.05,0.04,0.03,0.02,0.01,0.0,-0.01,-0.02,-0.03,-0.04,-0.05]) , precisa una explicación. La función random.choise elije uno de los números de la lista encerrada entre paréntesis, en nuestro casos los incrementos pueden darse en un rango entre 0.05 y -0.05, se puede elegir cualquier rango y cualquier cantidad números; por ejemplo si repetimos 3 veces un mismo número, tendrá más posibilidades de ser escogido. Es un buena forma de practicar variando estos números. Para el que no tenga conocimiento de python puede buscar sobre random.choise en "En borrador permanente".
Video resultado 10 esferas 02.avi. El script se llama 10_esferas_keyframe_insert_02.py
Por sugerencia de +Jorge Herández - Meléndez , he usado metaball en este script python para blender. En este video se corre cuatro veces el script y se obtiene este objeto, que algunos han visto como una crisálida y otros como una metamorfosis de un objeto metálico que se desplaza.
import bpy
import math
import random
pos_ini = [0,0,0]
i = 0
while i<10:
bpy.ops.object.metaball_add(type='CAPSULE', view_align=False, enter_editmode=False, location=pos_ini, rotation=(0, 0, math.pi/2.0))
bpy.ops.transform.resize(value=(0.15, 0.25, 0.150))
bpy.ops.object.shade_smooth()
j = 0
ob = bpy.context.active_object
frame_num = 0
pos_ini[0] = 0
#pos_ini[1] = 0
pos_ini[2] = 0
while j < 25:
bpy.context.scene.frame_set(frame_num)
bpy.context.active_object.location = pos_ini
bpy.context.active_object.keyframe_insert(data_path="location", index=-1)
delta=random.choice([0.05,0.04,0.03,0.02,0.01,0.0,-0.01,-0.02,-0.03,-0.04,-0.05])
pos_ini[0] =pos_ini[0]+delta+0.1
delta=random.choice([0.05,0.04,0.03,0.02,0.01,0.0,-0.01,-0.02,-0.03,-0.04,-0.05])
pos_ini[1] = pos_ini[1]+delta
delta=random.choice([0.05,0.04,0.03,0.02,0.01,0.0,-0.01,-0.02,-0.03,-0.04,-0.05])
pos_ini[2]=pos_ini[2]+delta
frame_num += 10
j = j + 1
pos_ini[1] = pos_ini[1] + 0.5
i = i + 1
bpy.ops.screen.frame_jump()
Video resultado metaball_insert_keyframe_01_02.avi. El script se llama 10_metaball_keyframe_insert_01.py