QuestionCopyright.org

Cvičenie 04

Cieľom cvičenia je vyskúšať si implementáciu a používanie základných trojrozmerných transformácií a prácu s jednoduchým objektom. Týmto cvičením ukončujeme našu púť svetom DOSu a o dva týždne prechádzame na OpenGL. Dúfam, že aj vďaka postupnému prechádzaniu od zapnutia grafického režimu a vykreslenia jedného pixelu, cez úsečky a kružnice až po jednoduché 3D objekty, všetci oceníte pohodlie a jednoduchosť, ktorú nám knižnica OpenGL ponúka.

Zdroják obsahujúci základné 3D transformácie, ktoré sme robili na cvičení: http://mirror.bwpow.eu/pub/upjs/ugr1/cv04/cv04_3d.cpp

Zadania

CV04_01 (3 body)
Zadanie Vytvorte 2D projekciu 3D kocky, ktorej hrany sú viditeľné a je možné ju rotovať okolo všetkých troch osí a taktiež posúvať v smere všetkých troch osí oboma smermi. Rotácia musí stále prebiehať okolo stredu kocky, nech je posunutá kamkoľvek. Transformácie implementuje pomocou matíc 4x4 a ich aplikovanie cez násobenie matíc.
Funkcie void ugr_asm_setmode(uint8_t mode)
void ugr_grbuffer_enable(uint8_t enabled)
void ugr_grbuffer_clear(void)
void ugr_grbuffer_blit(void)
void ugr_line(uint8_t c,int16_t x1,int16_t y1,int16_t x2,int16_t y2)
EXE http://mirror.bwpow.eu/pub/upjs/ugr1/cv04/cv04.exe
Vzor Priklad 1
Komentár Nemusíte riešiť prípady, ak sa kocka dostane mimo obrazovky alebo za pozorovateľa. Inšpiráciu môžete získať aj v sekcii Pomôcky k 3D transformáciám na podstránke Informácie ku cvičeniam 1, 2, 3 a 4.
CV04_02 (2 body)
Zadanie Vytvorte 2D projekciu 3D kocky, ktorej steny sú viditeľné, pričom každá ma iný index farby. Je možné ju rotovať okolo všetkých troch osí a taktiež posúvať v smere všetkých troch osí oboma smermi. Rotácia musí stále prebiehať okolo stredu kocky, nech je posunutá kamkoľvek. Transformácie implementuje pomocou matíc 4x4 a ich aplikovanie cez násobenie matíc. Steny, ktoré nevidno, naozaj nesmie byť vidno.
Funkcie void ugr_asm_setmode(uint8_t mode)
void ugr_grbuffer_enable(uint8_t enabled)
void ugr_grbuffer_clear(void)
void ugr_grbuffer_blit(void)
void ugr_triangle(uint8_t color,int16_t x1,int16_t y1,int16_t x2,int16_t y2,int16_t x3,int16_t y3)
EXE http://mirror.bwpow.eu/pub/upjs/ugr1/cv04/cv04.exe
Vzor Priklad 2
Komentár Nemusíte riešiť prípady, ak sa kocka dostane mimo obrazovky alebo za pozorovateľa. V ukážkovom programe sa do tohto režimu môžete prepnúť stlačením čísla 2.
CV04_E01 (bonusový príklad)
Zadanie Vytvorte 2D projekciu 3D kocky, ktorej steny sú viditeľné, pričom každá ma iný index farby a čím je viac odvrátená od pozorovateľa, tým je tmavšia. Je možné ju rotovať okolo všetkých troch osí a taktiež posúvať v smere všetkých troch osí oboma smermi. Rotácia musí stále prebiehať okolo stredu kocky, nech je posunutá kamkoľvek. Transformácie implementuje pomocou matíc 4x4 a ich aplikovanie cez násobenie matíc. Steny, ktoré nevidno, naozaj nesmie byť vidno.
Funkcie void ugr_asm_setmode(uint8_t mode)
void ugr_grbuffer_enable(uint8_t enabled)
void ugr_grbuffer_clear(void)
void ugr_grbuffer_blit(void)
void ugr_triangle(uint8_t color,int16_t x1,int16_t y1,int16_t x2,int16_t y2,int16_t x3,int16_t y3)
EXE http://mirror.bwpow.eu/pub/upjs/ugr1/cv04/cv04.exe
Vzor Priklad E01
Komentár Nemusíte riešiť prípady, ak sa kocka dostane mimo obrazovky alebo za pozorovateľa. V ukážkovom programe sa do tohto režimu môžete prepnúť stlačením čísla 3.
CV04_E02 (bonusový príklad)
Zadanie Vytvorte program, ktorý vykreslí dvojrozmernú beziérovu krivku pre ľubovoľný počet bodov väčší ako 2.
Funkcie void ugr_asm_setmode(uint8_t mode)
void ugr_line(uint8_t c,int16_t x1,int16_t y1,int16_t x2,int16_t y2)
void ugr_mem_putpixel(uint8_t color, int16_t x, int16_t y)
EXE http://mirror.bwpow.eu/pub/upjs/ugr1/cv04/cv04_e02.exe
Vzor Priklad E02
Komentár Body vyberajte náhodne, napríklad pomocou niečoho takéhoto:
  float ang=(float)random(360)/3.14;
  for(int i=0;i menej ako NUM_BOD;i++){
  	bod[i].x=sin(ang)*150+160;
  	bod[i].y=cos(ang)*90+100;
  	ang+=(float)random(100)/60;
  }