5 : BLENDER PYTHON

Tak ako pri materiáloch, aj pre scriptovanie v pythone ma blender predrobené prostredie. V blendri si prepnite layout na scripting.

Vľavo dole máte konzolu. Tam môžete písať pythonovské príkazy ako doteraz (tentokrát sa enterom potvrdzuje)

Teraz si vyskúšame niečo blendrovské. Bohužiaľ tie príkazy sú relatívne dlhé a neintuitívne. Našťastie blender nám s tým vie pomôcť. Skúste kocku nejak transformovať. Napríklad ju naškálujte na dvojnásobok. V úplne spodnom okienku nám pribudol taký dlhý text.

Toto je presne pythonovský kód daného príkazu. Ale vyzerá dosť zložito. Našťastie si ho vieme skrátíť. Väčšinu z parametrov sme vôbec nemenili. Necháme tam iba tie, čo nás zaujímajú, za ostatné si blender automaticky dosadí základné hodnoty.

Takže si to skopírujme a zmažeme všetko, čo sa nám nepáči. Môžete si navoliť vlastné hodnoty miesto 2,2,2.

Pozor! Pri Crtl+C a Ctrl+V treba mať myš NAD daným okienkom, inak vám to neskopíruje.

Ten istý príkaz viete zavolať znova. Šípkami sa viete dostať k použitým príkazom.

V skutočnosti, pri každej akcii ktorú v blendri vykonáte sa v tom dolnom okienku objaví príslušný pythonovský kód. To platí o editovaní scény, ale aj o prepínaní menúčok. Našou úlohou je vedieť to dobre využiť.

Robiť príkazy po jednom nieje moc šikovné. Našťastie je tu aj Text Editor, kde si vieme napísať viac riadkov kódu a naraz ich spustiť. To je to veľké prázdne okno v strede.

Vytvoríme si nový Script (klikom na New), pridáme do neho nejaký denoduchý príkaz a skúsime si ho spustiť pomocou Run Script.

(pozn: odvtedy, čo som chystala toto cviko sa blendru jemne zmenili tlačítka, teraz je run script vo forme šípočky)

Script nám síce zbehol (v ľavom dolnom okienku by o tom mala vyskočiť informácia, tak isto ako o škálovaní), ale nevidíme výsledok. Výstup, ktorý sa netýka priamo blendra uvidíme na konzole, ktorú si musíme ešte otvoriť. Window → Toggle System Console.

Tak už ju máme. Môžete ju využiť na vypisovanie čiastočných výsledkov, ak vám program nebude bežať dobre.

Skúste teraz do scriptu skopírovať a spustiť náš kód o škálovaní.

Vyhodí nám to chybu. Výstupná konzola nám oznámi, že nepozná bpy. To preto, že je to modul ktorý nemáme importovaný. V bočnej konzole už importovaný bol, je to napísané v tom bodrom úvode (žltý rámik)

Takže skúsme to ešte raz. Aj s poriadnym importom.

Už nám to ide pekne. Takže by sme si mohli skúsiť niečo vyrobiť.

Pridávanie nových objektov

Skúsime si pridať nové objekty. Vytvoríme si nový script.

Nazveme si ho opice. Zmažte si kocku a pridajte opicu. Skopírujte kód pridania novej opice do scriptu a spustite ho, či funguje. (overte si, či vám v strede vznikla ďalšia nová opica)

Tak si ich teraz môžeme vyrobiť viac. Napríklad do forcyklu. Dáme im náhodnú pozíciu.

V pythone na generovanie náhody je pripravený modul random. (Komplentné info: tu)

My z neho použijeme funkciu randint(a,b), ktorá vráti náhodný integer N z intervalu [a,b].

Skúste vyrobiť forcyklus, ktorý vyrobí 10 opíc náhodne rozmiestnených v oblasti [-10,10]x[-10,10]x[-10,10] (tj ich x,y, aj z-ová súradnica je z intervalu [-10,10])

Správne riešenie:

Alternatívne ste mohli randint importovať aj takto:

Script môžeme spustiť aj viackrát. Vtedy sa nám vždy vygenerujú nové a nové opice.

Teraz máme priestor dosť preplnený. Urobíme si nový script, ktorý nám zmaže všetky objekty. Môžeme ho potom podľa potreby použiť, ak sa nám preplní priestor.

Vľavo od názvu aktuálneho scriptu máme zoznam všetkých scriptov. Vpravo je zasa klikátko na vytvorenie nového scriptu.

Ešte by som rada upozornila na troch drahých pomocníkov, ktorých si môžete pozapínať (možno máte niektoré z nich už zapnuté): 1. číslovanie riadkov, 2. zalamovanie textu, 3. zvýraznenie syntaxe.

Tak poďme naspäť na to mazanie objektov. Vyrobte si script, ktorý zmaže všetky objekty na scéne. Znova je to najlepšie urobiť tak, že označíte ručne všetky objekty (skratka A), zmažete ich (delete) a využijete vzniknutý kód.

Pre istotu dávam aj návod:

Vyskúšajte si, či vám script správne funguje tým, že si vygenerujete opice pomocou starého scriptu a zasa ich zmažete pomocou nového.

Script si vieme uložiť samostatne (mimo .blend súbor).

Samostatné cvičenie I

Vytvorte script, ktorý vytvorí 12 opíc pravidelne rozostavených do kruhu.

Tvorba vlastného meshu

Teraz si skúsime vytvoriť vlastný mesh. Najjednoduchší kód na takéto niečo je takýto. Skopírujte si ho a skúste si, či vám beží. Mal by vytvoriť nový objekt, ktorý je iba jedna štvorcová stena.

import bpy

verts = [(1,1,0),(-1,1,0),(-1,-1,0),(1,-1,0)]
faces = [(0,1,2,3)]

moj_mesh = bpy.data.meshes.new("nazov_meshu")
moj_mesh.from_pydata(verts, [], faces)
moj_mesh.update()

obj = bpy.data.objects.new("nazov_objektu", moj_mesh)

bpy.context.collection.objects.link(obj)

Teraz stručne vysvetím, čo sa tam deje. Rozlišujeme tu medzi dvoma pojmami:

Ak si vytvoríme 10 opíc, budeme mať 10 rôznych objektov s rovnakým meshom.

Takže pozrime sa na ten kód:

Ako fungujú tie vrcholy a steny?

  1. Najprv si zapíšeme všetky vrcholy meshu. Získavajú poradové číslo podľa toho, ako ich postupne zapisujeme.
  2. Zadefinujeme steny. Každá stena je n-tica poradových čísel vrcholov, ktoré ju určujú.
Náš mesh má štyri vrcholy (s poradovými číslami 0,1,2,3) a jednu stenu, ktorá je určená štvoricou vrcholov (0,1,2,3)

Skúste si mesh prerobiť tak, aby obsahoval dve štvorcové steny ležiace vedľa seba spojené jednou hranou. čiže toto:

Príklad riešenia (je viacero možností, ako to spraviť):

Samostatné cvičenie II

Vytvorte script, ktorý vytvorí nový mesh v tvare pyramídy. Čiže niečo takéto (výška pyramídy môže byť ľubovoľná)

Blender Python templates

Zatiaľ sme si skúšali písať nejaké kratšie kúsky kódu (scripty). Okrem toho v Blendri existuje aj veľa predvyrobených scriptov na rôzne blenderovské účely. Nájdete ich tam, kde sme písali scripty pod tlačítkom Templates.

Rada by som upozornila na jeden konkrétny: Addon Add Object je relatívne dlhý script, ktorý vám vytvorí vlastný typ meshu s tým, že sa vám aj pridá do zoznamu základných meshov. Takže po spustení scriptu sa bude dať vytvoriť úplne rovnako ako obyčajná kocka - cez add mesh. Tento script tam má vyriešené úplne všetko, vrátane vlastnej ikonky pre daný mesh.

Ak na kóde nič nezmeníte, nový mesh bude iba obyčajný štvorec a bude sa volať Add Object. Vyskúšajte si to.

Addons, matematické funkcie a plochy

Súčasťou blendru sú aj rozšírenia, tzv. Addons. Pridávajú do blendru rôzne nové funkcionality. Nájdete ich v Preferences.

Ak chcete nejaký Addon aktivovať, treba mu proste zaškrtnúť políčko vedľa (niekedy to chvíľu trvá). My si aktivujeme addon Add Mesh: Extra Objects.

Ten vám pridá k dispozícii viacero nových zaujímavých objektov. Môžete si ich poskúšať. Tie na ktoré chcem upozorniť špeciálne, sú matematické funkcie, a to tieto dve:

Teda Z-Math Surface je iba špeciálny prípad XYZ-Math Surface. Poďme si ich vyskúšať.

Vyberme si Z-Math Surface. Dole sa vám zobrazia možnosti, kde vašu funkciu viete definovať. Zápis vzorca je rovnaký ako pri matematických operáciach v jazyku python. (ja som v príklade prepísala pôvodnú funkciu na rovinu z=x+y)

Pre XYZ-Math Surface sú aj nejaké prevyrobené známe plochy.

Ak si chcete vyrobiť vlastnú plochu, zaujíma vás hlavne predpis funkcie a interval na ktorom je dedinovaný. Tie sa nachádzajú tu:

Plochy, ktoré tu predpisujeme sú hladké, blender ich aproximuje to meshu. Hodnoty U-step a V-step vyjadrujú, ako husto budú tieto plochy nasekané, čím dáte vyššie číslo, tým hustejšie vám to v danom smere naseká.

Konkrétne takto: Nech napríklad U-step = 4, V-step = 4. Potom si plochu S(u,v) = (x(u,v),y(u,v),z(u,v)) definovanú na [0,1]x[0,1] vykresíme v bodoch S(0/4,0/4), S(0/4,1/4), S(0/4,2/4) ... S(4/4,4/4) a pospájame do meshu. Vizuálne:

Blender python a animácie

Ako vieme toto využiť v animáciach?

V zásade nám python vie pomôcť dvoma spôsobmi: vie nám uľahčiť množstvo práce, ak je repetitívna a vie za nás urobiť nejaké matematické výpočty.

Urobíme si krátky príklad, ako také animovanie s blendrom môže vyzerať. Vytvorte si nový súbor, prepnite sa na scripting. Urobíme si script, ktorý bude náhodne kocku posúvať. Dáme si import bpy a urobíme si skratku na tú našu kocku.

Vyrolujte si niekde timeline a presuňte sa manuálne na nejaký frame. Teraz si môžeme skopčiť pythonovský kód.

Na náhodnu potrebujeme randint z modulu random. Urobíme si forcyklus. Kód pre insert keyframe si môžeme skopčiť rovnako ako kód pre všetko iné. Spustíme kód a máme animáciu.

V príklade sme si dávali náhodné súradnice, dúfam, že si viete predstaviť, ako by sa to dalo využiť na nejaké cielené súradnice, napríklad závislé od nejakej funkcie.

UPDATE 2022: na novších verziach takto napísaný script nebude dobre fungovať, treba ho opraviť

Samostatné cvičenie III

Náhodne pohybujúcej sa kocke odlíšte jednu stenu - napríklad fabou. Upravte script tak, aby pri sa pri každom pohybe posúvala špeciálnou stenou napred.

BONUS 2

Vygenerujte dva náhodné integery v intervale medzi 4 a 20. Tieto dve čísla budú predstavovať počet rovnobežiek a poludníkov na sfére. Vytvorte script, ktorý tieto rovnobežky a poludníky vizualizuje tak, že na každý priesek rovnobežky s poludníkom vytvorí opicu, pričom tá sa bude pozerať v smere normály v danom bude (tj. von zo sféry).

Z bonusu 2 odovzdajte iba daný script - čiže pošlite mi ho ako .txt súbor.