site_logo
border_img

Jak na Python v Blenderu- 2. díl

Vložil tol Ne, 2005-09-11 18:12.

anotacni_fotka Po obecném úvodu v minulém díle si dnes, jak jsme si posledně ostatně slíbili, vytvoříme náš vůbec první funkční program v Pythonu. A jak jsem již v předchozím článku naznačil, půjde o jednoduchý čtvercový mesh objekt.

Nejprve si tedy ukážeme celý programový kód a následně jej v důležitých bodech rozebereme.


Programový kód

Nebudu vás dlouho napínat, celý programový kód vypadá následovně:


#########################################################
#                                                       #
# Jednoduchy skript na tvorbu ctvercove plochy (mesh)   #
# 	 Autor: Pavel  Pokorny, 1. 8. 2005		#
#                 go.paja@centrum.cz			#
#                                                       #
#########################################################

import Blender			# nacteni modulu Blenderu
from Blender import NMesh	# budeme pracovat s Mesh objekty

me=NMesh.New()			# vytvorime si novy mesh objekt
#me=NMesh.GetRaw()		# totez co predchozi pripad

v=NMesh.Vert(1.0,0.0,0.0) 	# a pridame do nej 4 nove vertexy
me.verts.append(v)
v=NMesh.Vert(1.0,1.0,0.0) 
me.verts.append(v) 
v=NMesh.Vert(0.0,1.0,0.0) 
me.verts.append(v) 
v=NMesh.Vert(0.0,0.0,0.0) 
me.verts.append(v)

f=NMesh.Face()			# vytvorime si novy face
f.v.append(me.verts[0]) 	# pridelime mu 4 vertexy
f.v.append(me.verts[1]) 
f.v.append(me.verts[2]) 
f.v.append(me.verts[3])
me.faces.append(f)

NMesh.PutRaw(me, "Plane")	# pridani noveho objektu do sceny
Blender.Redraw()		# prekresleni sceny


Pojďme si nejdříve popsat program jako celek. Posloupnost jednotlivých příkazů odpovídá tomu, jak bychom očekávali. Nejprve tedy vytvoříme nový objekt typu mesh, do tohoto meshe vložíme čtyři vertexy a mezi těmito vertexy vytvoříme jednu plochu. V posledním kroku daný mesh přidáme do scény.

Taková je tedy základní koncepce. Nyní si už podrobně popíšeme jednotlivé části programového kódu. Postupovat budeme od začátku programu. Dříve, než se ale dostaneme k prvnímu příkazu, zmíním se o komentářích. Už jste z uvedeného programu asi pochopili, že komentáři předchází znak #, a platnost každého takového komentáře je až do konce příslušného řádku. Samozřejmě je vhodné do programu komentáře umísťovat, jednak na začátek programu, kde by měl být popisek o jaký program jde, kdo a kdy ho vytvořil, verze, apod. a dále k určitým blokům nebo příkazům pro bližší popis, co daná část dělá. Sice se to může zdát zbytečné, ale pokud se někdy později k danému programu vrátíte, snadněji se v něm budete orientovat.

Když tedy pomineme komentáře, prvním příkazem je import Blender. Příkaz import je obdobou příkazu v C jazyku #include. Jinými slovy, na začátku každého programu si potřebujeme vždy vložit knihovny (moduly), které budeme používat. Uvedeným příkazem v našem programu tedy vkládáme modul Blenderu (ten budeme vkládat v každém programu) a tím si zajistíme dostupnost objektů a metod, které v sobě obsahuje. Později budeme vkládat ještě i jiné moduly. Tím chci naznačit, že podle toho, jaké moduly vkládáte, snadno zjistíte, co musíte mít nainstalované. Pokud vkládáme pouze modul Blenderu, nemusíme mít nainstalovaný Python jako takový, vystačíme s tím, co nám Blender nabízí (a že toho není málo).

Dalším příkazem je from Blender import NMesh. Modul Blender, který jsme si již do našeho programu vložili, obsahuje celou řadu submodulů a my bychom měli kompilátoru říci, jaké budeme používat. Submoduly jsou například Camera, Lamp, Image, World, Material, Texture, Object... Seznam všech submodulů včetně referenčních popisů jejich atributů a metod naleznete v dokumentaci k Pythonu na domovských stránkách Blenderu zde (tento odkaz jsem uvedl již v předchozím článku). Dneska pouze vytváříme objekty typu Mesh, proto načítáme pouze modul NMesh.

Možná se ptáte, proč do programu musíme vložit modul Blenderu a pak jeho submodul(y). Odpvěď zní: nemusíme. Příkaz from Blender import NMesh v programu skutečně být nemusí. Pokud ho ale neuvedeme, budeme muset upravit všechny další příkazy, které se týkají submodulu NMesh. Takže příkaz v=NMesh.Vert(1.0,0.0,0.0) bychom museli zapsat jako v=Blender.NMesh.Vert(1.0,0.0,0.0). Jinými slovy, všude, kde vidíte slovíčko NMesh, bychom před nějmuseli připsat Blender., aby kompilátor věděl, že daný příkaz je součástí tohoto modulu. Je zcela na vás, který ze způsobu zápisu budete používat. Můj názor je, že je vhodné kombinovat oboje. První způsob vám šetří čas a snižuje velikost souboru, ten druhý je zase přehlednější, jelikož okamžitě víte, jakého modulu (či submodulu) je příkaz součástí.

Pojďme ale v našem programu dál. Po importování následuje příkaz me=NMesh.New(). Za ním je v komentáři ještě jeden - me=NMesh.GetRaw(). Oba dělají prakticky to samé, totiž vytvářejí nový objekt typu mesh. Abych byl přesnější - obě metody mohou mít jeden parametr (viz. dokumentace), kterým je jméno mesh objektu. Metoda New vždy vytváří nový prázdný mesh objekt a metoda GetRaw získá data meshe jehož jméno je uvedeno jako parametr této metody. Pokud žádné parametry nejsou, vytvoří se také nový prázdný mesh objekt a ten přiřadíme identifikátoru me. Jméno mesh objektu zatím zadávat nebudeme, to uděláme později.

V dalším kroku přiřazujeme mesh objektu čtyři vertexy. Práce s každým z nich je rozložena do dvou příkazů. Prvním z nich je přiřazení nového vertexu do identifikátoru (u prvního vertexu je to příkaz v=NMesh.Vert(1.0,0.0,0.0)). Metoda Vert u submodulu NMesh obsahuje tři parametry a jak už asi tušíte, jsou to globální souřadnice x, y a z. Ve druhém kroku příslušný identifikátor reprezentující vertex přidáme do mesh objektu příkazem me.verts.append(v). Není na tom nic složitého - takto si můžete do mesh objektu vložit vertexů kolik chcete. Chtěl bych ale ještě upozornit, že záleží na tom, v jakém pořadí vertexy do mesh objektu vkládáte. To pořádí by mělo být v souladu s vytvářenou plochou, která bude dalším krokem. Nezáleží na tom, který z vertexů vložíte do mesh objektu jako první, ale obecně platí, že by měly být vertexy vkládány v pořadí, jak jdou za sebou. To znamená buď po směru hodinových ručiček nebo proti tomuto směru. Způsob, který zvolíte ovlivňuje směr normály později vytvořené plochy. Schválně to vyzkoušejte. A nebojte se i experimentovat s pořadím vertexů. Zkuste je nezadat podle pravidla, které jsem teď popsal. Tímto způsobem nejlépe pochopíte, jak to v Blenderu funguje.

V dalším kroku si vytvoříme novou plochu (face). To provedem příkazem f=NMesh.Face(). Za ním následuje volání metody f.v.append tolikrát, z kolika vertexů se daný face musí skládat (v našem příadě jsou to čtyři). Všimněte si, že parametrem této funkce jsou příslušné vertexy v meshi, které jsme mu vložili v předchozím kroku a tyto vertexy jsou ukloženy v poli (toto využijeme později). Poté, co dané ploše reprezentované identifikátorem f vertexy přidáme, tuto plochu přiřadíme námi vytvořenému mesh objektu. To dělá příkaz me.faces.append(f).

Předposledním příkazem NMesh.PutRaw(me, " Plane") příslušný mesh vložíme do scény. Prvním parametrem této metody je identifikátor námi vytvořeného mesh objektu a druhým je jeho jméno (textový řetězec). Pokud bychom takovýto program spustili, v některých případech bychom na obrazovce nic nemuseli vidět. Je to z toho důvodu, že je často potřeba celou scénu překreslit. Toto nám právě dělá poslední uvedný příkaz Blender.Redraw().

Úkol

Ta, to je pro dnešek vše. Snad to bylo aspoň trochu srozumitelné. Nyní ještě dnešní úkol. Ve výše uvedeném příkladu jsme si vytvořili jednoduchý čtvercový mesh. Zkuste na základě uvedených informací vytvořit krychli, tj. ve skutečnosti bude 8 vertexů a 6 faců. Pokud jste porozumněli výše uvedenému popisu, neměl by to být problém. Pokud si přesto nevíte rady, níže je ke stažení zdrojový kód.

autor:Pavel Pokorný
Univerzita Tomáše Bati ve Zlíně
Fakulta technologická

© 2005 Blender3dcz. Všechna práva vyhrazena. | Design by Stickfish | Webmaster: Jiří Hnídek | drupal