← späť

CV9: BLENDER PYTHON

Okrem manuálneho modelovania vieme v blendri využiť aj výhody programovania. Buď na uľahčenie práce (urobiť si jeden forcyklus je ľahšie ako manuálne porozkladať 100 kociek do radu), alebo na vizualizáciu matematiky alebo fyziky. Možnosti sú obrovské.

Dnes to bude taký úvodík do toho, ako môže kombinácia blendru a programovania vyzerať. V blendri sa na programovanie využíva jazyk Python. Ak ste ho ešte nikdy nepoužívali, mám tu taký krátky úvod, aby ste videli ako v ňom vyzerajú základné príkazy (viac ani nebude treba). Ak ho už aspoň trochu poznáte, môžete úvodnú časť preskočiť.

Python

Python je veľmi pekný a kamarátsky jazyk. Najprv si spravíme taký malý úvodík, aby sme videli, ako sa v tomto jazyku vyzerá syntax a základné príkazy.

Ak chcete používať python na svojom počítači, treba si ho najprv nainštalovať. Niektoré operačné systémy a výrobcovia notebookov ho mávajú predinštalovaný. Potom si môžete stiahnúť nejaké pekné prostredie, v ktorom budete samotný kód písať. Viac info napr. tu: wiki.python.org: Beginners Guide

Druhá možnosť je využiť tento skvelý projekt s názvom Jupyter Notebook: jupyter.org (treba sa kúsok prescrollovať dole)

Okrem toho, že ponúka veľmi pekné prostredie na prácu s pythonom, má aj verziu, ktorá beží priamo v browseri. Vtedy vám sami založia server, kde sa kód vykonáva a teda vám všetko pekne pobeží aj bez inštalácie pythonu. Na veľký projekt by som túto browserovú verziu nepoužívala, ale na takéto drobné pokusy je to ideálne (ušetríte si všetko to inštalovanie). Môže sa vám stať, že majú plné servre, vtedy treba minútku počkať a skúsiť znova.

Takže poďme na to. Otvorte si jupyter notebook v browseri (prípadne iné preferované prostredie)

V jupyter notebooku sa programuje v tzv. bunkách (cells). Do každej bunky si napíšete kúsok kódu. Potom si viete spustiť jednu alebo viac buniek, podľa toho, čo potrebujete. Hneď pod každú bunku vám vypíše priamo výstup.

Základné ovládanie:

Skúste mu dať nejaký jednoduchý matematický úkon:

Ak chcete pridávať a mazať bunky, nástroje pre to nájdete hore (pod Edit, Insert a Cell). Ináč vám bude stačiť, ak vždy len použijete Alt + Enter, čiže vykonáte bunku a vytvoríte novú, v ktorej môžete ďalej pokračovať.

Základné dôležité pravidlá pre python:

Vyskúšajte si týchto pár základných príkazov, aby ste sa vedeli v pythone trošku zorientovať:

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 (akurát 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 zásade je to iba volanie funkcie so strašnou kopou parametrov. Väčšinu z parametrov sme v tomto prípade vôbec nemenili a ani nás nezaujímajú. Necháme tam iba tie, čo sú pre nás dôležité (v tomto prípade je to parameter value), 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 (na klávesnici) 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 modrom ú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.

Dúfam, že už sa tu v tom začíname pomaly zorientovávať.

Vytvorte si nový script, ktorý nám vygeneruje rad 10 kociek v rade za sebou v pravidelných vzdialenostiach.

Skúste si to sami, pre istotu sem dávam jedno možné riešenie:

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 (čiže určíme ich súradnice). Vrcholy automaticky 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

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:

Keď sa nad tým zamyslíte, 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:

SAMOSTATNÁ ÚLOHA:

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

Je v poriadku, ak budete zaokrúhľovať, čiže používať napríklad 3,14 miesto pí. Počítačová aritmetika je tak či tak presná iba na určitý počet desatinných miest. Úlohu mi pošlite vo forme scriptu, čiže ako .txt súbor. (každý script sa dá uložiť samostatne, mini .blend súbor)