V roce 1996, v prvním ročníku na MFF UK, jsem vyráběl můj první zápočtový program. Hra KOLÍČKY je stolní (desková) hra pro jednoho hráče. Základní verze hry obsahovala šachovnici 7x7 z níž jsou vyříznuté všechny 4 rohy o rozměru 2x2. V každém políčku je díra pro umístění kolíčku. Hráč na začátku jeden kolíček vyndá a dá jej stranou. Nyní začne hráč "skákat" kolíčky jak v dámě, kdy vezme "vhodný" kolíček a přeskočí jím svisle nebo vodorovně jiný kolíček tak, aby ho umístil do volné díry na šachovnivci. Cílem je, aby hráči zbyl pouze jeden kolíček.
Moje verze hry umožňuje vyrábět libovolé hrací pole (šachovnici), ukládat a nahrávat ho z disku. Dále je možné se kdykoliv při hře vrátit o libovolný počet kroků zpět či vpřed. Celá hra lze ukládat a později kdykoliv přehrát. Součástí balíčku najdete soubor TOMASWIN.HRA, který obsahuje celou jednu hru vedoucí k výhře. Můžete si ji přehrát.
Celý program (v DOS módu simulaci pod Windows) si můžete stáhnout zde.
V roce 1997-98 jsem vyráběl hru podle TV NOVA kolotoč, kterou jsme pak později hráli s dětmi na táboře. Hra je vždy pro 4 hráče, kteří hádají nějaký text (např. slavný výrok + autora výroku). Hráči roztáčí kolotoč, kde se objevují částky od 50 do 2000 Kč a specielní symboly STOP, BONUS a BANKROT. Vytočí-li si hráč peněžní částku, musí do 6ti sekund (vlevo nahoře běží odpočet) říci písmeno, které tipuje, že v textu je a ještě není odkryto. Pokud tam písmeno je, připíše se hráči na účet součin vytočené částky a počtu výskytů písmene. Pokud tam písmeno není nebo již bylo odkryto, hraje následující hráč. Pokud hráč vytočí symbol STOP, pokračuje další hráč. Pokud hráč vytočí symbol BANKROT, hráčí ztrácí veškeré peníze na účtě a hraje další hráč. Pokud vytočí symbol BONUS, točí ještě jednou a peněžní obnos za uhodnutá písmena se mu zdvojnásobí. Hráč nemusí točit a může se pokusit hádat celý text. Uhodne-li, získává 3000 Kč, neuhodne-li, zbankrotuje a hraje následující hráč.
V mém provedení moderátor soutěže ovládá myš, soutěžící se střídají o mezerník klávesnice, kterým roztáčí kolo. Čím déle drží mezerník, tím rychleji se začne kolotoč roztáčet. Po vytočení částky nebo specielního symbolu začne běžet čas, během kterého musí hráč tipnout písmeno. Moderátor myší vybere písmeno. Chce-li hráč hádat, klikne jednou moderátor myší. Z nabídky vybere příslušnou akci a hra pokračuje.
Celý program (v DOS módu simulaci pod Windows) si můžete stáhnout zde.
V roce 1997 jsem naprogramoval ještě zábavnou hru BINGO, taktéž jsem to použil jako zápočtový program. Program je inspirován televizním soutěžním pořadem Tele-Bingo, který býval vysílán na TV Nova každý čtvrtek od 20:00.
Hra je dělána až pro 20 hráčů (všatně jednoho pořadatele). Každý z hráčů vlastní los = kartička 5x5 políček, každý sloupec je označen písmenem. První B, druhý I, ...N...G...O. Ve sloupci B jsou náhodná různá čísla od 1 do 20, ve sloupci I čísla od 21 do 40... až v O od 81 do 100. Každý los má své číslo. Počítač tahá v náhodném pořadí čísla tak, aby se žádné neopakovalo, a hráči si zaškrtávají na losech tažená čísla. Cílem hry je zaškrtat všech 25 políček, první hráč vyhrává Bingo.
Každý pátý tah je následován „Kolem štěstí“, kde může jeden hráč vyhrát určitou peněžní částku, nebo i zbankrotovat. „Roztočí“ kolo a kde se rotující šipka zastaví, takovou cenu získává. Kolo štěstí se podobá televizní Tutovce. (Bonus = znovu x2, Znovu = jen znovu, 2x = 2x hotovost). Každý dvacátý tah je následován „Zvonkohrou“. Poprvé 2, podruhé 3, až 5 zvonků se objeví, jen jeden z nich však zvoní a vyhrává. Hráč si musí tipnout. Tipují vždy dva a to tak dlouho, dokud neuhodnou ten správný.
Kromě Binga ( 1.000.000,- Kč ) může hráč vyhrát i jiné částky. Jsou to:
- Čtyři rohy - jasné,
- Jedna Linie - libovolná linie (vodorovná zaškrtnutá řádka),
- Jeden Sloupec - analogicky,
- Dvě Linie - první a poslední zaškrtnutá řádka,
- Centrovaný a Diagonální kříž - jasné,
- Mozaika - vždy každé druhé políčko zaškrtnuté,
- Hrací kostka: - 1, 2, 3, 4, 5, 6. Jde o představu kostky ve vnitřním čtverci 3x3, musí platit, že žádné jiné než požadované políčko nesmí být v tomto poli zaškrtnuté (na okrajích může být tedy cokoliv). Pozor! Platí neustále pro všechny hráče, tzn. že ne jen ten první vyhrává.
Celá hra byla ozvučena na Sound Blaster (dnes bohužel nefunguje). Ze „džbánu“ vyjíždí tažené číslo, které počítač ohlásí, a zařadí se vlevo nahoru do seznamu tažených čísel. Urychlení tahů (případně spuštění tahů) se provede pravým tlačítkem myši. Pozastavení tahů se provede levým tlačítkem myši. Vpravo dole jsou vidět výhry, které se postupem času rozsvěcují a indikují, kdo je vyhrává. Nahoře jsou pak vidět peněžní částky jednotlivých hráčů. Výhra Bingo u sebe skrývá kruh s číslem, kde se objevuje počet hráčů, kteří čekají na Bingo, tj. že jim zbývá pouze jedno nezaškrtlé políčko do pětadvaceti. Kolo štěstí se zastavuje klávesnicí - libovolnou klávesou. Zvonko hra se ovládá myší (levé tlačítko vybírá). Na úvodu jsou titulky (pravé tlač. myši ukončí čekání na konci), i na konci jsou titulky.
Po pozastavení tahů se objeví červené STOP, během kterého se dá dělat následující:
- klávesa „+“ zvětší dobu čekání mezi taháním čísel.
- klávesa „-“ ubere (analogicky).
- Ctrl + Q umožní konec programu (bude dotaz Opravdu?)
- klávesa 1, 2, až 9, pak „:“, „;“ atd. podle ASCII codu zobrazí losy s čeveně zaškrtanými poli, které odpovídají jednotlivým hráčům. Libovolná klávesa to zase ruší.
- pravé tlač. myši spustí znovu tahy.
Parametry nutné pro spuštění: vypíší se implicitně, je-li program spuštěn bez nich.
- počet losů (nadále už jen PL)
- soubor s losy ... musí obsahovat minimálně tolik losů jako PL.
- init ... vytváří (vygeneruje) nové losy
- check ... uvádí informace o kvalitě losů, tj. shody každých dvou
- print ... tiskne losy na LTP1 (textově, čísla oddělené čárkou)
- works ... musí existovat dodávaný vzorový soubor NETELE.WKS (pro MS Works 4.0 for Windows), který poslouží pro vytváření všech PL losů tak, aby šli tisknout v přijatelné formě pod Windows.
- =n, kde n je los, který má dostat od začátku hry 250.000,- Kč (které vyhrává, např. pokud se v lose objeví 5 červených srdíček ... jen pro uživatele, který si s tím chce dát práci).
Celý program (v DOS módu simulaci pod Windows) si můžete stáhnout zde.
Mezi jedny z mých nejoblíbenějších her ze starého didaktika patřila hra BLIND ALLEY (možná správně nazýváno CUL DE SAC). Hra spočívá na následujícím principu: přes celou obrazovku se rozprostírá neviditelná šachovnice, ve které se pohybují šipky. Jednu žlutou šipku ovládá člověk, zbylé červené šipky (dvě a více) řídí počítač. V prvním kroku hry každá šipka zabírá pouze jedno políčko šachovnice (startovní bod) a má přednstaven směr (kam ukazuje). V každém dalším kroku se šipka posune ve svém směru o políčko vedle. Směr žluté šipky může kdykoliv klávesnící změnit hráč, směr červené šipky se změní sám tehdy, pokud by šipka v dalším kroku vytekla z obrazovky nebo by narazila do již obsazeného políčka šachovnice (základní nejjednodušší úroveň obtížnosti). Hráč musí šipce vytvořit slepou uličku, z které nebude mít kam odbočit a tím pádem šipka z hrací plochy zmizí.
Moji verzi hry naprogramovanou v Turbo C++ jsem vypiplal do několika úrovní složitosti (některé pochází z originálu):
- Destroyable arrows - červené šipky lze lehce zničit slepými uličkami
- Supervisor arrows - červené šipky mohou jezdit přes sebe, pokud je stěna překryvu široká jen jedno políčko
- Breaking out arrows - pokud musí červená šipka změnit směr, pak je-li to možné, rozdvojí se a pokračuje oběma směry (vlevo i vpravo)
- Rolling arrows - červené šipky se rolují dokola jak šnek, nedodržují pravidlo, že jezdí stále rovně
- Undestroyable arrows - kdykoliv se před červenou šipkou v dálce objeví slepá ulička, šipka okamžitě zahne, aby se ji vyhla (nikdy nevlezou do přímé pasti)
- Spying on arrows - šipky vždy směřují směrem k hráčově hlavě šipky
- Two mirror arrows - hráč řídí 2 žluté šipky najednou, jejich pohyby jsou zrcadlově převrácené
- Regenerative arrows - jakmile je červená šipka zničena, šipka ze svého startovního políčka vyjede po asi 3 sekudnách znovu - hráč musí po startovním bodu rychle přejet, aby zabránil znovu zrození
- Arrows forever - červené šipky po uvíznutí nezanikají, ale zůstávají na místě a zabírají políčka šachovnice
Každá z výše uvedených úrovní obsahuje 10 kol, když proti hráči postupně začínají 2 až 11 šipek. Někdy platí pravidlo, že čím více šipek, tím snažší level je, protože tím rychleji se šipky zabijou samy o sebe, protože jim dojde místo.
Celý program (v DOS módu simulaci pod Windows) si můžete stáhnout zde.
Program, v kterém by jezdily tramvaje, jsem začal vytvářet už během studií na gymnáziu, především na táborech. Tehdy to bylo v textovém režimu, koleje představovaly znaky a tramvajka byla plný čtvereček (Alt+219). Simulátor tramvaje jsem si pak nadšeně zvolil jako ročníkový projekt ve 3. ročníku na MFF UK, který byl povinný pro složení souborné zkoušky. Program jsem psal v Turbo C++ pro MS DOS v grafickém režimu.
Program se skládal ze 2 částí: Editor mapy tramvají a vlastní Simulátor jízdy tramvají.
Editor mapy tramvají
Editor mapy obsahoval následující prvky:
- mapa kolejí - tvořená nekonečnou šachovnicí úseků (nahoře)
- mapa úseku - náhled na koleje a semafory (vlevo dole)
- editor tramv. linek (dole ve prostřed)
- editor zastávek (dole ve prostřed nahoře)
- editor semaforů - uživatel definuje všechny možné kombinace, které semafory na křižovatce mohou ukazovat (dole veprostřed vpravo)
- editor všeho - ukládání a nahrávání do/ze souboru
Simulátor jízdy tramvají
Po spuštění se program dotázal, jakou tramvajovou linku chcete řídit. Po zvolení linky se ocitnete na konečné smyčce a začne se vám odpočítávat jízdní řád (viz dále). Cílem každé simulace je jet co nejpřesněji jako reálná tramvaj, dodržovat všechny dopravní a služební předpisy a především vidělat co nejvíce peněz.
Na začátku simulace máte jako řidič 5000 Korun (to je trochu přehnané, má být správně asi 500 Kč). Za každého nečerného pasažéra vám přibude 12 Kč. Za každý prohřešek proti správné dopravě budete platit pokutu (nejhorší až 1000 Kč), která může vést až ke ztrátě celého zadního vozu. Za peníze si můžete kupovat automatizace, které vám usnadní některé úkony a zajistí vám tak menší počet pokut. Dokonce můžete koupit i třetí vagon.
Správná jízda
Pomocí myši můžete měnit rychlost tramvaje tím, že uchopíte velkou řídící páku vpravo, a hýbete s ní nahoru (zrychlujete) nebo dolů (zpomalujete až zastavíte). Totéž lze provádět klávesnicí - šipkami nahoru a dolů (klávesnicí však bohužel často nestihnete včas zabrzdit, protože reakce na klávednici je pomalá). Jak vypadá správná jízda? Nebo-li, co všechno a v jakém pořadí musíte dělat, abyste nedostali pokutu:
- kdykoliv před otevřením dvěří na následující zastávce spustit upozornění pro cestující o tom, na kterou zastávku se blížíte (tlačítkem RUN; příklad: "Kněžská luka, příští zastávka Chmelnice")
- pokud některou zastávku minete nebo zapomenete spustit upozornění o jejím názvu, musíte posunout zastávkový kurzor na další zastávku (tlačítka se šipkami vlevo a vpravo na panelu "next tram stop", kde je také zobrazeno pořadí zastávky a počet všech zastávek do konečné)
- na zastávce zastavit tak, aby čumák prvního vagónu byl ve žluté zóně zastávny s číslem, vyjadřující počet cestujících
- otevřít dveře a nechat vystupovat a nastupovat cestující (provedete kliknutím do pole DOORS; za nečerného pasažera máte 12 Kč)
- před zavřením dveří zazvonit výstražný signál "NEVYSTUPUJTE" (úplně horní pravé tlačítko)
- zavřít dveře, nerozjíždět se s otevřenými dveřmi
- před semaforem s polohou včas STŮJ zastavit, neprojíždět na červenou
- před průjezdem křižovatkou přehodit vyhybku tam, kam vede trasa linky, s kterou právě jedete
- pokud měníte směr při průjezdu křižovatou, musíte zapnout správný blinkr
- na další zastávku se dostavit před uplynutím doby, která je označena jako "pay" (kontrola jízdního řádu)
Vymoženosti - automatizace
Kdykoliv, když stojíte na kterékoliv zastávce, si můžete koupit nějaké z následujících vylepšení:
- opening the door - automatické otevírání dveří po správném zastavení na zastávce
- public announcement - automatické oznamování názvů stanic po příjezdu na zastávku
- warning NEVYSTUPUJTE - automatické spouštění varování "NEVYSTUPUJTE" při zavírání dveří
- indicator - automatický blinkr při průjezdu křižovatkou
- choosing right direction - automatické přepínání vyhybky, abyste jeli vždy podle vaší správné trasy
- closing the door - automatické zavírání dveří poté, co nastoupí poslední cestující
- going on red forbidden - zakázání průjezdu na červenou, tramvaj začne sama brzdit před semaforem a nepovolí se rozjet na červenou
- stopping at tramstops - automatické zpomalování a zastavování na zastávky (velmi užitečné!)
- reverse system - umožní vám couvat, ne však více než jeden tramvajový úsek (tj. jednu obrazovku)
- trafic inspector - nákup revizora, který promění vyhází všechny černé cestující a tím pádem uvolní místo pro platící zákazníky (každý vagon má omezenou kapacitu a jakmile je plný, již nemůžete nabírat nové cestující a získávat peníze)
- nový vagon
Tramvaj lze ovládat i klávesnicí:
- D - dveře
- Backspace - zpátečka
- Ctrl+Up / Ctrl+Down - zrychlení/zpomalení s krokem 5
- Up / Down - zrychlení/zpomalení s krokem 1
- N - NEVYSTUPUJTE
- Ctrl+Left / Ctrl+Right - změna zastávky pro upozornění (o jedno vlevo / vpravo)
- B - nákup vylepšení
- L - změna linky (pouze na konečné)
- Left / Right - přepínání blinkru
- R - upozornění na zastávku
Šťastnou jízdu!
Ukázka kódu pro výpočet otočení bodu tramvaje
const double M_PI180 = M_PI/180; void map::get_point1( int px,int py,int ppx,int ppy, int kolej,int smer_koleje,int uhel, int deltax,int deltay,int delka,int &nx,int &ny) { float maxuhel = 2*atan(delka/(2*(Pr1*zoom+kolej*(Kmezi*zoom-deltax))))*(180/M_PI); nx = x+px*( Pr1*zoom -ppx*cos( (float)((float)uhel*u1-smer_koleje*((maxuhel*deltay)/delka))*M_PI180 ) * ( ((Pr1+1)*zoom+kolej*(Kmezi*zoom-deltax)) ) ); ny = y+py*( Pr1*zoom -ppy*sin( (float)((float)uhel*u1-smer_koleje*((maxuhel*deltay)/delka))*M_PI180 ) * ( (Pr1*zoom+kolej*(Kmezi*zoom-deltax)) ) ); } //-------------------------- void map::koleje_zat1(int uhel,int start,int stop,int px,int py,int color, int ktera) { setcolor(color); if (ktera<=0) { arc( x+px*Pr1*zoom, y+py*Pr1*zoom, uhel*90+start, uhel*90+stop, (Pr1-Kmezi-Kvevnitr)*zoom); arc( x+px*Pr1*zoom, y+py*Pr1*zoom, uhel*90+start, uhel*90+stop, (Pr1-Kmezi+Kvevnitr)*zoom); } if (ktera>=0) { arc( x+px*Pr1*zoom, y+py*Pr1*zoom, uhel*90+start, uhel*90+stop, (Pr1+Kmezi-Kvevnitr)*zoom); arc( x+px*Pr1*zoom, y+py*Pr1*zoom, uhel*90+start, uhel*90+stop, (Pr1+Kmezi+Kvevnitr)*zoom); } }
27.4.-11.5.2003 jsem strávil s kolegou s Jardou Adamcem (z firmy CIANT) v Marseille, kde jsme se účastnili projektu ALTERNE (sekce ARAPUCA) pod záštitou firmy CYPRES.
Naším úkolem bylo vyvinout software, který by dokázal simulovat proměnlivost kůže (pokožky) chobotnice. Jelikož je dokázané, že se chobotnice dorozumívají pomocí změny barvy a struktury své pokožky, dal si tento projekt za cíl komunikovat s chobotnicemi umělou cestou pomocí počítačové simulace. Myšlenka byla taková, že se přistrčí monitor s program před akvárium s chobotnicí a bude se s ní dorozumívat.
Úkolem aplikace, kterou jsme s Jardou vyráběl, byl jistý druh morphingu obrázku, kdy jeden obrázek plynule přechází v jiný. Abychom docílili co největšího přiblížení realitě, prováděli jsem morphing v rámci několika vrstev současně. Celý proces je rozdělen na časové okamžiky (sloty), mezi kterými probíhá plynulý morphing. Každý slot odpovídá jedné ze 3 možností: začátek morphingu (tedy první obrázek), konec morphingu (poslední obrázek) nebo některá z interpolací (prostřední fáze) morphingu. V každé vrstvě může být v jednom slotu vždy jen jeden obrázek (v některé ze zmíněných fázi).
Bohužel jsme museli z Marseille odjet dříve, než jsme stihli celý projekt zakončit a provézt pokusy s živými chobotnicemi. Odlítali jsme přesně v den mých 25. narozenin (11.5.2003).
Celý program si můžete stáhnout zde.
Během studia počítačové grafiky jsem jako zápočtový program z předmětu (Počítačové vidění a inteligentní robotika) dostal za úkol udělat analyzátor obrazu. Konkrétně jsme zkoumali obrázky budovy kolejí MFF UK v Troji a měli za úkol každé okno označit souřadnicí XY, kde X je písmeno určující pořadí sloupce (zleva) a Y číslo řádku oken/patra/ (odshora). Náhled zde.
Dnes musím říct, jsem moc vděčný, že jsem byl nucen tento projekt vypracovat. Naučil jsem se základní dovednosti analýzy obrazu.
Řešení:
Nejprve se na obrázek pustí horizontální Sobelův filtr ((-1,0,1),(-2,0,2),(-1,0,1)), který zviditelní horizontální hrany. Nyní smažeme všechny pixely s intenzitou menší než 50 (lze zanedbat) a s intenzitou větší než 200 (ty vznikají většinou díky oknům a zbytečně zeslabují působení vodorovných čar).
Poté se udělá horizontální Houghova transformace následujícím způsobem:
- prostor všech přímek se diskretizuje na přímky (úsečky), které vychází z levého okraje obrázku a končí na pravém okraji obrázku. Je tedy zapotřebí matice "M" o rozměru (maxy X maxy), kde maxy je výška obrázku.
- každým pixelem (intenzita > 0) se proloží přímka začínající vlevo a to pro všechny levé krajní body (těch je maxy), a spočítá se průsečík s pravým okrajem obrázku. Pokud je větší než nula a menší než maxy (úsečka celá leží v obrázku), tak se zvýší hodnota v matici "M" o jedna na místě odpovídajícím průsečíku.
- všechny hodnoty v matici "M", které jsou menší než čtvrtina šířky obrázku se vynulují (ty nás nezajímají).
- nyní se projede matice "M" a pro každý nenulový bod se podívám, zda-li je tento bod lokálně maximální v rámci matice o rozměru 31x31 (musí být jeho středem). K hodnotě 31 jsem došel metodou "pokus a omyl" (prostě to s ní nejlépe funguje). Šlo by ji také dynamicky měnit podle rozměru obrázku. Pokud je lokálně maximální, pak se do spojového seznamu přidá přímka, která bodu odpovídá.
Nyní zbývá projet spojový seznam přímek a nechat jen ty vhodné, což se dělá následovně:
- Zjistím ideální vzdálenost přímek na levé a na pravé straně obrázku (nutno pro obě strany kvůli perspektivě!). Ideální vzdálenost je ta vzdálenost, která má největší pravděpodobnost výskytu. Přímky, které jsou z obou stran vzdálené od ideální vzdálenosti o víc než je "plus/mínus něco málo", se vynechají.
- Poslední, co bylo nutné ošetřit, jsou chybějící přímky (ty se dopočítají podle ideální vzdálenosti) a přímky, které vznikají těsně pod okny (uprostřed panelů). To taky není problém, zjistí se, ktrerá vzdálenost je víc neideální (to je ta mezi spodkem panelu a "pod oknem") a ta horní z nich (pod oknem) se vyhodí.
Nyní vertikální přímky: velmi podobně:
- pustí se vertikální Sobelův filtr ((1,2,1),(0,0,0),(-1,-2,-1)), místo umazávání intenzity větší než 200, mažeme již od 150.
- provede se analogicky Vertikální Houghova transformace (přímky se spouští z horní okraje a počítají se průsečíky s dolním okrajem). Místo hledání lokálního maxima v podmatici 31x31 se hledá v podmatici 41x41 (číslo 41 vzniklo opět na základě experimentů).
- nyní je nutno upravit vertikální přímky (ve spojáku) tak, aby jich bylo buď 13 nebo 9 (protože svislých "panelových bloků" je buď 8 nebo 12). Jsou jisté vyjímky (obrázky, které jsou zprava uříznuté, aniž by barák končil - není problém, zjistí se, že jsem narazil na okraj obrázku či na světlé místo mimo barák). Postupuje se podobným způsobem jako u horizontálních úprav - opět se naleznou ideální vzdálenosti a chybějící přímky se doplní (nadbytečné odstraní). Problém nastává s úplně krajními přímky, které se málo kdy podaří nalézt. Musí být tedy opět dopočítány.
Zbývá spočítat průsečíky a doplnit čísla do jednotlivých rámečků (zřejmé).
Celý program včetně rozboru řešení si můžete stáhnout zde.
V roce 2003 jsem se pod vedením firmy CIANT účastnil projektu eGaLab. Část projektu jsme vyvíjeli ve Španělské Cuence, kde 15.-26.2.2003 proběhlo hlavní soustředění. Na projektu jsem pracoval s kolegou Jardou Adamcem (z CIANTU). Vzpomínám si na velmi veselou příhodu: jelikož jsme při všech zahraničních cestách (především ve Francii v Marseille) byli s Jardou ubytováni na jednom pokoji, přišlo nám samozřejmé, že budeme na bydlet spolu i v Cuence. A tak, když Jarda získal klíč od pokoje, šel jsem automaticky s ním. Sice nám přišlo divné, že tam byla pouze double-bed postel a že musíme spát pod společnou dekou, ale ani jeden z nás to nevyhodnotil jako překážku, a tak jsme první noc spali spolu. Druhý den odpoledne přišel hlavní šéf španělů (José Ramon Alcala) a ptal se hlavního šéfa Čechů (Pavla Smetany), zda dorazil Ullrich, že v jeho pokoji nikdo nespal. Já jsem u dotazu byl, tak jsem se rovnou přihlásil a objasnil situaci. José Ramon velmi zakoulel očima a od té doby jsem spal na samostatném luxusním pokoji, kde jsem měl svojí vlastní double-bed celou sám pro sebe.
eGaLab je zkratkou pro elektronická Galerie a Laboratoř. Projekt eGaLab se primárně zaměřil na vývoj sdílené trojrozměrné (3D) víceúčastnické platformy na internetu, která má nyní dvě základní úrovně:
- sadu tvůrčích nástrojů využitelnou především při tvorbě virtuálních děl v elektronické laboratoři a při interakci s těmito díly v reálném čase,
- sadu komunikačních nástrojů využitelnou převážně pro sdílení audiovizuálního obsahu v elektronické galerii a pro intuitivní navigaci virtuálním prostorem.
Mým úkolem byl první bod: vyrobit ve VRML 3D editor, ve kterém může uživatel přidávat nové objekty a různě je upravovat a manipulovat s nimi. Editor jsem zdárně vyrobil. Umožňuje do 3D virtuálního světa vkládat následující objekty:
- 2D pevné čtvercové plochy
- plochy typu šachovnice, jejíž každý průsečík čar lze 3D posunout a plochu tím zdeformovat, pokřivit
- krychle, ze kterých lze vyrobit libovolný kvádr
- koule
- jehlany
- válce
- libovolný 3D VRML objekt (je možnost jej importovat)
Každý objekt si můžete pojmenovat (10 vám bude muset stačit znaků) a můžete s ním provádět následující úkony:
- vkládat, mazat, vybírat
- polepit jej tapetou (texturou), videem, umístit do jeho středu zvukovou nahrávku, která se bude vy smyčce přehrávat, nebo jej popsat textem
- přemístit v prostoru pomocí 3 os X, Y a Z
- rotovat kolem svého středu
- měnit rozměry ve všech 3 osách nebo v každé ose zvlášť a tím objekt proporčně deformovat (natahovat)
- deformovat plochu typu šachovnice
- měnit průhlednost
- ukládat do paměti a kopírovat
- měnit barvu RGB (všechny odstíny)
Když ještě počítače začínaly, objevila se na nich skvělá hra 3D piškvorky. Hrál jsem ji často s tátou. Je dokonce i možné, že lze postavit konečný automat, který by prokázal, že začínající hráč musí vždy vyhrát. Každopádně mě hra chytla na tolik, že jsem ji musel naprogramovat nejprve v roce 1999 v Borland Builderu a později v roce 2003 ještě pod VRML. Verze v Builderu umožňuje hrát 2 hráčům proti sobě (počítač jako umělá inteligence není implementován). Verze ve VRML naproti tomu umožňuje pouze hrát proti počítači. Žádná z verzí neoplývá nějakým velkým programátorským umem, přesto však jsou dobře hratelné.
Obě verze umožňují krychli složit a pak zase rozložit podle zvolené osy - tedy rozřezat krychli z jiné strany. Dále je možné pohybem myši celou rozřezanou krychlí otáčet (VRML toto umožňuje samo od sebe).
S kolegou ze studií Michalem Tomanem jsem spolupracoval na zápočtovém programu ze 3D garfiky (předmět Grafika II). Program umožňuje realisticky zobrazovat 3 základní 3D objekty - kouli, krychli a válec - pomocí "Rekurzivního sledování paprsku". Uplatňujeme i model "Dokonalého lomu světla" (Snellův zákon), v menu Scéna je standardně zaškrtnuto F,G jako F (Fresnelův člen) a G (faktor vzájemného zastínění mikropološek). Vše je založeno na přednášce RNDr. Josefa Pelikána z MFF UK, především následující slajdy Rekurzivní sledování paprsku a Fyzikální světelné modely.
Ovládání programu:
Aplikace bohužel není 100% ošetřená proti chybně zadaným hodnotám. Specielně pokud se pokusíte umístit libovolný objekt tak, že protíná průmětnu, pak program tvrdě havaruje. Mmusíte dávat pozor i na rozměry objektů a jejich natočení, aby průmětnu nikdy neproťaly. Nikdy nekativujte v menu "Scéna / Koule zvlášť" ani "Scéna / Direct RGB". Vzdálenost průmětny můžete změnit pomocí "Objekty / průmětna".
Přidání nového objektu
Nové objekty můžete přidávat následujícím způsobem:
V menu "Objekty / Přidej objekt". Objeví se dialog "Vlastnosti objektů",
ve kterém standardně vidíte seznam všech vašich objektů a jejich vlastností.
Dokud nedokončíte operaci přidání objektu, dialog nijak neukončujte, jinak program havaruje.
Vyberte typ objektu (koule, kvádr nebo válec), nastavte barvu pomocí RGB hodnot od 0 do 1 (nikoliv od 0 do 255),
zvolte rozměry objektu (parametr 1 = poloměr koule = poloměr válce = šířka kvádru;
parametr2 = výška válce = výška kvádru, parametr 3 = hloubka kvádru) a nastavte vlastnosti (hodnoty 0 až 1,
0 značí "objekt nemá tuto vlastnost", 1 značí "objekt je totálně ovlivněn touto vlastností").
Nakonec musíte kliknout na tlačítko Transformace (viz dále).
Transformace
Každý objekt musí mít aspoň jednu transformaci a to POSUN (jinak by kolidoval s průmětnou!)
Transformace se přidávají dodržováním následujících kroků v následujícím pořadí.
- Vyberte typ transformace (rotace x / rotace y / rotace z / zkosení / posun).
- V list boxu "Seznam transformací" vyberete transformaci, před kterou nebo za kterou chcete tuto novou vložit (pokud nějaká již existuje).
- Pak zmačknete Přidej PŘED nebo Přidej ZA podle toho, kam ji chcete umístit. POZOR: na pořadí záleží! Nejdříve provádějte rotace a teprve nakonec posuny!
- Teprve teď vyplňte hodnoty v pravém dolním rohu dialogu. Pro posun se podívejte na obrázek, abyste věděli, jaké máte vložit souřadnice - všimňete si, že osa Z vede v kladném směru od pozorovatele pryč dozadu. Rotaci vám taktéž napoví obrázek: otáčení probíhá proti směru hodinových ručiček, nesmíte vkládat záporné hodnoty (vždy doplňte vše do 360°).
- Dejte OK nebo pokračujte v přidávání další transformace krokem 1 (hodnoty se uloží automaticky aniž byste dali OK).
Transformace existující objektů můžete měnit rovnou z menu: "Objekty / Transformace" nebo přes vlastnosti objektů. Vlastnosti objektů můžete měnit pomocí menu "Objekty / Základní vlastnosti" (a řiďte se instrukcemi uvedenými u přidávaní nových objektů).
Další možnosti
Uživatel může do scény umísťovat další světelné zdroje. Pomocí dialogu "Světla / Umístění..." můžete lehce přidávat nebo ubírat další světla a dokonce volit i jejich zabarvení. Pomocí menu "Objekty / Posun všeho..." můžete všem objektům hromadně změnit transformaci posun (hodnoty se přičtou ke stávající transformaci). Celou 3D scénu lze ukládat do souboru a později z něj nahrát. Vřele všem doporučuji pravidelně ukládat! Vše provedete v menu "Scéna / Ulož - Ulož jako... - Otevřít".
Celý program si můžete stáhnout zde (včetně pár předvyrobených 3D scén).
Spolu s kolegou Michalem Tomanem jsme v roce 2001 vyvinuli zápočtový program z předmětu Grafika 2D. Program umožnoval warping obrázků a byl napsán v Borland C++ Builderu. Velkou nevýhodou programu je, že umí zpracovávat pouze BMP obrázky. Uživatel si může zvolit jemnost mřížky a podle toho vytvářet jemná nebo hrubá zakřivení.
Celý program si můžete stáhnout zde.
stránky vyrobil Tomáš Ullrich - žonglér a programátor - listopad 2008