← naspäť na zoznam cvík

21.4

09 : blender python

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 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:

  • Enter = nový riadok (v rámci jednej bunky)
  • ctrl + Enter = vykoná bunku
  • alt + Enter = vykoná bunku + pridá za ňu novú bunku

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

Ak chcete pridávať a mazať bunky, nástroje pre to nájdete (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á pravidlá pre python:

  • python rozlišuje malé a veľké písmená (je case-sensitive)
  • príkazy sa neoddeľujú bodkočiarkou, ani žiadnym iným znakom. Nový príkaz je určený tým, že začnete písať na nový riadok
  • odsadenie od začiatku riadku má vplyv na kód (uvidíte neskôr)

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

Základné pythonovské príkazy

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.

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.

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:

Samostatné cvičenie I

Prerobte script tak, aby miesto jedného radu kociek urobil 10 radov kociek. Čiže vytvorí pravideľnú mriežku 10x10 kociek.

Pošlite mi kód! Script si vieme uložiť samostatne (mimo .blend súbor). Uložte ho ako priezvisko.txt

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. Na prvý pohľad to môže byť jemne mätúce. Rozlišujeme tu medzi dvoma pojmami:

  • mesh (to je vnútorná štruktúra objektu – čiže počet vrcholov a stien a ich vzájomné vzťahy. čiže to, čo meníme v Edit Mode)
  • objekt (samotný objekt umiestnenú niekde v priestore)

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á)

Pošlite mi script! Vo formáte priezvisko.txt

BONUS 5

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.