Vježbe 3
Animacije u Javi -
Matrična reprezentacija geometrijskih transformacija u 3D -
Ortogonalno projiciranje
Primjer indirektnog crtanja (blisko metodi dvostrukog spremnika
-
double buffering) s ciljem da se smanji treperenje:
applet
source
3.1. Upotrijebite klasu matričnih transformacija u 2D
MT2D
(zadatak 2.2.) i klasu
GKS
(zadatak 1.4.), te rutinu za crtanje
elipsi (zadatak 2.1.) da bi isprogramirali animirani ventilator:
applet
3.2. Implementirajte klasu
MT3D
matričnih reprezentacija geometrijskih
transformacija u 3D: rotacija oko osi
x,
y i
z, translacije i
skaliranja, te njihovu kompoziciju putem matričnog produkta (proširenje zadataka
2.2. i 2.4. na 3D).
pomakni(double px, double py, double pz)
– translacija za pomak (px, py, pz);
skaliraj(double sx, double sy, double sz)
– skaliranje s faktorima sx, sy i sz;
rotirajX(double kut)
– rotacija oko osi x za kut u stupnjevima;
rotirajY(double kut)
– rotacija oko osi y za kut u stupnjevima;
rotirajZ(double kut)
– rotacija oko osi z za kut u stupnjevima;
identitet()
– postavlja matricu transformacije na jediničnu;
mult(MT3D m)
- matrica m množi matricu već sadržanu u klasi MT3D s desna.
Napomena: nešto složenija, ali elegantnija implementacija gornjih metoda je da one u sebi
već sadrže implicitno množenje, tj. kompoziciju transformacija. Dakle, umjesto da se kod poziva
metode prebriše sadržaj matrice, postojeća matrice se množi s desna s matricom željene
transformacije, što znači kompoziciju već sadržane transformacije u objektu klase
MT3D
s transformacijom koja odgovara pozvanoj metodi (u tom slučaju treba
paziti da se matrica transformacije na početku inicijalizira kao jedinična).
3.3. Implementirajte klasu
Ortho
koja omogućava ortogonalnu projekciju
linija definiranih u 3D globalnom koordinatnom sustavu na
xy-ravninu sa sljedećim
metodama (modificirajte klasu
GKS
!):
postaviNa(double x, double y, double z)
– postavlja početak
linije na poziciju (x, y, z) u 3D globalnim koordinatama;
linijaDo(double x, double y, double z)
– povlači liniju
od posljednje zapamćene pozicije do (x, y, z) u 3D globalnim koordinatama;
trans(MT3D m)
– zadaje se matrica transformacije koja se
primjenjuje prije crtanja u globalnim koordinatama (to je zapravo
transformacija iz lokalnih u globalne koordinate - po defaultu postaviti
identitet, tj. jediničnu matricu);
postaviBoju(Color c)
– postavlja boju linije;
- Konstruktorom
Ortho(Graphics g, double xmin, double xmax,
double ymin, double ymax, int xsize, int ysize)
zadaje se raspon
projiciranih koordinata koje će biti prikazane u prozoru (appletu)
veličine xsize, ysize
(podatak o veličini prozora nužan je da bi se mogle izračunati odgovarajuće
transformacije iz projiciranih koordinata u koordinate prozora).
Radi testiranja klasa
MT3D
i
Ortho
nacrtajte ortogonalne
projekcije kocke zarotirane oko različitih osi u različitim bojama:
- Rotacija oko osi x za 30° - crveno
- Rotacija oko osi y za 30° - zeleno
- Rotacija oko osi z za 30° - plavo
- Rotacija najprije oko osi x, pa y, pa z, svaki put za 30° - crno
applet
3.4. Animirajte rotaciju kocke i to tako da se kocka istovremeno okreće oko sve tri
koordinatne osi:
applet
3.5. Klasi
MT3D
matričnih reprezentacija geometrijskih transformacija
u 3D (zadatak 3.2) dodajte rotaciju oko proizvoljne osi koja se zadaje dvjema točkama:
rotiraj(double x1, double y1, double z1, double x2, double y2, double z2,
double kut)
.
Animirajte rotaciju kocke oko osi zadane točkama P
1 = (2, -5, 2)
i P
2 = (-3, 5, -3). U početnom položaju, lijevi donji vrh kocke je
u ishodištu, a stranice duljine a = 2 su na koordinatnim osima.
applet