Za razliku od Blendera 2.4x, njegove najnovije verzije jednostavno ne mogu normalno raditi bez Python skripti. Naime, ako preimenujete ili uklonite mapu scripts (u mapi 2.5x pod Blenderovom instalacijskom mapom) i pokrenete program, dobit ćete samo praznu ljusku s 3D pogledom.
Osim što u njemu možete pomicati početnu kocku, pa čak i manipulirati njenim točkama, to bi bilo gotovo sve što se s takvim sučeljem dade raditi. Upravo zbog te ovisnosti distribucija Blendera povećala se za desetak megabajta u odnosu na Blender 2.4x – u nju je uključen gotovo kompletan paket Pythona verzije 3.x.
U tekstu koji slijedi opisat ćemo kako se poslužiti interaktivnom konzolom u Blenderu i napisati jednostavnu Python skriptu. Da biste shvatili o čemu pišemo, uputit ćemo vas u neke od osnova jezika Python, no neka nam ovdje Python programeri ne zamjere na nužnim pojednostavljenjima kojima ćemo morati pribjeći radi lakšeg objašnjenja. Kompletnu Python dokumentaciju možete pronaći na stranici docs.python.org/py3k.
Link za preuzimanje aktualne verzije Blendera nalazi se na stranici www.blender.org, no mi ćemo koristiti “svježe” kompajliranu verziju iz najnovijeg koda dostupnog na njegovim SVN poslužiteljima. Ukoliko niste sami pokušavali kompajlirati Blender (o čemu smo već pisali), a niste spremni ni za upuštanje u takvu avanturu, na stranici www.graphicall.org možete pronaći najnovije buildove raznih autora.
Interaktivna konzola
Kad spominjemo konzolu, tu ne mislimo na komandnolinijski prozor koji se pokreće zajedno s Blenderom. Iako se u njemu vide poruke Python interpretera, prozor je potpuno neinteraktivan. Za verzije Blendera 2.45+ kreirana je interaktivna konzola u obliku skripte koja se pokretala putem izbornika Scripts u istoimenom prozoru.
U novom Blenderu skripta je evoluirala u potpuno integriranu interaktivnu konzolu koja se aktivira putem izbornika Editor Types i stavke Python Console ili pritiskom na kombinaciju tipki Shift i F4 (npr. proširite Timeline editor i umjesto njega aktivirajte interaktivnu konzolu).
Nakon pokretanja u konzoli ćete ugledati sažete upute kako je upotrebljavati i upozorenje da je Blender 2.5 API predmet promjena (Application Programming Interface – laički rečeno, API je sučelje putem kojeg jedan program pristupa funkcijama drugog programa). Na dnu konzole tri su znaka “veće od” (tj. “>>>”), što predstavlja Python prompt, odnosno početak naredbenog retka (nešto poput c:> u DOS-u). Važno je napomenuti i da Python razlikuje velika i mala slova.
Za početak utipkajte “print(‘Blender je zakon’)”, bez dvostrukih navodnika, i pritisnite tipku Enter. Funkcija print u konzoli će “isprintati” rečenicu “Blender je zakon” i vratiti vas u novi naredbeni redak (to bi bila naša inačica standardnog programa “Pozdrav svijete” kojim počinje učenje gotovo svih programskih jezika).
Uz print trebate naučiti još dvije funkcije koje će vam biti od velike pomoći u daljnjem radu s konzolom: dir i help. Prva funkcija bez argumenata (tj. samo “dir()”, bez ičega u zagradama) prikazat će vam popis objekata u obliku Python liste kojima trenutno možete pristupiti putem konzole. Druga će vam prikazati dostupnu dokumentaciju vezanu u odabrani objekt (“help(print)” će vam prikazati što radi te upute kako koristiti tu funkciju).
Uvoz modula
Dosad spomenute funkcije ugrađene su u sam interpreter i uvijek su dostupne, ali većina drugih logički je raspoređena po zasebnim modulima. Trebate li neku od njih, možete joj pristupiti na dva načina.
Prvi je da najprije “uvezete” modul u kojemu se nalazi tražena funkcija, što ćete učiniti pomoću ključne riječi import (npr. “import neki-modul”) i onda je pozvati naredbom u formatu “neki-modul.neka-funkcija”.
Želite li pak pokretati funkciju bez prefiksa “neki-modul.”, pristupit ćete joj na drugi način i direktno je uvesti iz pripadajućeg modula naredbom “from neki-modul import neka-funkcija”. Ako želite uvesti sve funkcije u tom modulu umjesto “neka-funkcija” stavite zvjezdicu (*).
Ako ste u Blender konzoli već utipkali dir(), među pedesetak stavki (od kojih su većina matematičke funkcije uvezene iz modula mathutils i math) skriva se modul bpy koji predstavlja osnovu Blender API-ja.
Unutar tog modula pronaći ćete gotovo sve dostupne funkcije Blendera te putem njega možete pristupati objektima u sceni, ali i elementima korisničkog sučelja. Blender konzola podržava automatsko dovršavanje naredbi (autocomplete), pa utipkajte riječ “bpy.” te nakon točke pritisnite tipku Ctrl i razmaknicu.
Konzola će prikazati popis dostupnih stavki unutar modula bpy, od kojih su nama trenutno zanimljive samo dvije: context i data. U osnovi, obje stavke služe potpuno istoj svrsi, ali s tom razlikom što context omogućuje izravan pristup aktivnim objektima.
Da biste, na primjer, dobili koordinate trenutno aktivnog objekta u 3D prostoru, utipkajte u konzolu “bpy.context.object.location”, a rezultat koji dobijete bit će u obliku vektora Vector((0.0,0.0,0.0)).
Putem stavke object isti rezultat dobili biste unosom linije “bpy.objects[‘ime objekta’].location”, ali to znači da morate znati ime objekta za koji želite utvrditi lokaciju. Na kraju, da biste odabrani objekt premjestili na drugo mjesto u 3D prostoru, jednostavno izmijenite vrijednost stavke location.
To možete učiniti dodjelom novih koordinata u obliku liste “[x,y,z]” (“bpy.context.object.location = [1.0,2.5,3.0]”) ili, primjerice, izravnim mijenjanjem pojedinih koordinata vektora (“bpy.context.object.location.x =5” ili “bpy.context.object.location.y = 10”).
Petlja “for”
Ako u sceni imate više objekata s različitim materijalima i svima odjednom želite pojačati intenzitet difuzne boje ili, primjerice, uključiti prozirnost, u Blenderu to još uvijek nažalost nećete moći učiniti putem korisničkog sučelja. Morat ćete odabrati svaki objekt posebno i u editoru materijala podesiti željene postavke.
Ako se radi o velikom broju objekata i materijala, to bi mogao biti vrlo zamoran posao. Srećom, ni to više nije nepremostiva prepreka, pa je sve to moguće učiniti putem konzole i petlje “for”.
U korisničkim postavkama pod karticom Editing privremeno uključite stavku Materials u popisu Duplicate Data. Početnu kocku duplicirajte desetak puta, a nove kocke “razbacajte” po sceni. Zbog napravljene promjene u postavkama svaki će duplikat imati svoj vlastiti materijal.
U konzolu utipkajte “for ob in bpy.data.objects:” i pritisnite Enter. Ispred kursora pojavit će se tri točke, što znači da naredba nije dovršena, pa pritisnite tabulator i utipkajte tekst “if ob.type == ‘MESH’ and len(ob.material_slots) > 0:” te ponovno pritisnite Enter.
Naredba još uvijek nije dovršena, stoga ponovno pritisnite tabulator, ali sada dvaput i utipkajte “ob.active_material.diffuse_intensity = 1”. Da biste pokrenuli ovu petlju, dvaput pritisnite tipku Enter i u 3D Editoru vidjet ćete da je boja svih objekata u sceni posvijetlila.
Kreirana petlja za svaki objekt (for ob) u popisu objekata (in bpy.data.objects) – ako je objekt tipa MESH (if ob.type ==’MESH’) i broj materijala na njemu veći od nule (and len(ob.material_slots) > 0:) – u aktivnom materijalu objekta (ob.active_material.) postavlja intenzitet difuzne boje na 1 (diffuse_intensity = 1).
Bez testiranja uvjeta pod “if” došlo bi do pogreške jer objekti tipa CAMERA i LAMP (kamera i svjetlo) nemaju pridružene materijale ili onda kada jedan od MESH objekata uopće nema pridružen materijal.
Kreiranje skripte
Konzola je moćan alat, ali ima jedan veliki nedostatak: ne može trajno zapamtiti ono što ste u nju upisali i nakon što ugasite Blender sve će biti izgubljeno. Osim toga, pisanje koda u više linija (poput petlje koju smo vam pokazali) u konzoli krajnje je nespretno.
Zato postoji integrirani tekstualni editor (dostupan putem izbornika Editor Type) koji će vam omogućiti ne samo pisanje i spremanje koda, već i njegovo direktno izvršavanje u Blenderu. Podijelite 3D editor na dva dijela i u lijevom dijelu putem spomenutog izbornika u zaglavlju editora aktivirajte Text Editor (ili kombinacijom tipki Shift i F11). Kliknite na veliku tipku New te aktivirajte prvu i treću malu tipku desno od nje (prva će uključiti prikaz broja linije u editoru, a druga bojenje sintakse).
Za razliku od većine ostalih programskih jezika blokovi koda (funkcije, petlje i slično) nisu odvojeni vitičastim zagradama ili ključnim riječima poput begin i end. Umjesto toga Python koristi uvlačenje (indentation) tako da kod u istom bloku ima istu uvlaku, dok smanjenje uvlake znači da je trenutni blok završio. Primjerice, u petlji za mijenjanje intenziteta difuzne boje imate dva bloka – vanjski for, a unutar njega if. Editor u Blenderu će sam postaviti uvlake (novi blok počinje nakon linije koda koja završava dvotočkom).
U tekstualni editor skriptu započnite linijom “import bpy”. Napravite jednu liniju razmaka i upišite “def main(value):” (def označava početak Python funkcije). Prijeđite u novi red i upišite linije koda petlje for istim redoslijedom kao što ste ih unijeli u konzolu, ali bez tabova (editor će sam umetnuti uvlake). Umjesto broja jedan u “diffuse_intensiti = 1” upišite “value” te na kraju u zadnjoj liniji vratite kursor na početak i upišite “main(1)”. Pokrenite skriptu i intenzitet boje bit će postavljen na 1.0. Promijenite li “main(1)” u “main(0.5)”, intenzitet će biti 0.5.
Piše: D.P.