Jacob's Ladder: la scala di Giacobbe - Animazione in Blender via script Python
* * *
ATTENZIONE - NOTA IMPORTANTE--- Questo tutorial è stato realizzato con la versione 2.49 di Blender; dal 24 Novembre 2009 è invece disponibile la versione 2.5 di Blender, che introduce importanti novità soprattutto dal punto di vista dell'interfaccia utente, per cui questo articolo verrà lasciato per motivi "storici", ma potrebbero esserci delle differenze tra gli elementi discussi o mostrati e la nuova versione del software.
* * *
IDEA
Una gran fonte di ispirazione, per creare le scene 3D ed effetti speciali è (che ci... CREDIATE o no :-))... la Bibbia !
Ad esempio, in Genesi 28, 10-13, abbiamo:
“Giacobbe partì da Bersabea e sia avviò verso Carrai. Capitò in un posto dove passò la notte perché il sole era già tramontato. Lì prese una pietra, se la pose sotto il capo come guanciale e si coricò. Fece un sogno: una scala poggiava a terra e la sua cima raggiungeva il cielo; su di essa salivano e scendevano angeli di Dio”.
Ora, lasciando perdere gli angeli di Dio (mesh di esseri umani vestiti con tuniche, mettete texture chiare con “emit” alta nella radiosità ed effetti di halo), come facciamo una scala che “scende” dal cielo ? Andiamo a mettere tanti scalini, li posizioniamo ad uno ad uno e mettiamo i keyframe ?
E perché farlo noi se può farlo uno script ? ☺
JACOB’S LADDER
Apriamo Blender, manteniamo il cubo di default.
Modifichiamo questo cubo in modo da fargli assumere lunghezza 20, altezza 1.6, profondità 3. Rinominiamolo “Scalino.000”.

Ora facciamo quante copie vogliamo di questo scalino (shift-d); i nomi delle copie saranno “Scalino.001”, “Scalino.002”, … “Scalino.n” dove n è il numero di scalini. Io ho fatto 50 copie, quindi arrivo a “Scalino.050”.
Nella vista prospettiva apriamo la schermata dell’editor di testo. Cosa deve fare il nostro script ? Supponendo che la nostra scalinata debba avere base sul piano xy, se n è il numero di scalini presenti (quindi, qui, 51: le 50 copie + l’originale), allora la scalinata ha quota massima n*16, ossia 51*1.6 = 81.6. Allora lo script deve posizionare tutti gli scalini lì, al frame 1.
Quanto deve durare la nostra animazione ? Sia f il numero di frame (io ho scelto 120 frame). All’ultimo frame la scalinata deve essere completa, ergo ogni scalino deve essere “al suo posto”. Come faccio a calcolare questa posizione ? Essa vale: c * 1.6, con c il numero dello scalino corrente (si inizia a contare c da 0). La “posizione in profondità” vale c * 3. Allora, vediamo questo script…
import Blender
from Blender import Object
from Blender.Object import *
from Blender.Scene import Render
# Numero di scalini, numero di frame
n = 51
f = 120
quotaMAX = 81.6 # Calcolata come alzata_scalino * numero_scalini
distanzaMAX = 153 # Calcolata come pedata_scalino * numero_scalini
# Recupero la scena
scn = Blender.Scene.GetCurrent()
# Frame 1. Creo un contesto scena, metto il frame corrente a 1.
contestoScena = scn.getRenderingContext()
contestoScena.cFrame = 1
# Posiziono tutti gli scalini nello stesso posto al primo frame
for i in range(n):
if i<10: scalino = "Scalino.00"+str(i)
else: scalino = "Scalino.0"+str(i)
scn.objects.active = Object.Get(scalino)
# Recupero il context ipo ed inserisco una chiave LOC per l'oggetto selezionato al frame 1
objSel = scn.objects.active
objSel.insertIpoKey(LOC) # creo una chiave, per creare una ipo per l'oggetto
contextIpo = objSel.getIpo() # recupero la IPO dell'oggetto
objSel.setLocation(-10,-distanzaMAX, quotaMAX) # imposto la posizione dell'oggetto
objSel.insertIpoKey(LOC) # inserisco la chiave LOC
# Frame 120.
contestoScena.cFrame = 120
# Posiziono gli scalini con offset calcolati per il numero di scalini
for j in range(n):
if j<10: scalino = "Scalino.00"+str(j)
else: scalino = "Scalino.0"+str(j)
scn.objects.active = Object.Get(scalino)
objSel = scn.objects.active
# Recupero il context ipo, calcolo la posizione, inserisco la chiave ipo
contextIpo = objSel.getIpo() # recupero la IPO dell'oggetto
y = (-1)*(j*3)
z = j*1.6
objSel.setLocation(-10,y, z) # imposto la posizione dell'oggetto
objSel.insertIpoKey(LOC) # inserisco la chiave LOC
Ecco un esempio di risultato (gli scalini hanno colore giallo, emit 0.44, ma niente halo… tocca a voi rendere esteticamente bella la scena ☺), alcuni frame…

Bye !
|