>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Transformace 3D ==> 2D
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Mnozí již jistě pocítili ten drobný nedostatek starších VGA karet (a
v některých případech i těch novějších ) a to že jaksi nepodporují
práci s 3D grafikou. A tak se to musí řešit víceméně softwarově. To
znamená, že co si neuděláte, to nemáte ... Nuže, máme-li nějaký bod
v 3D - např. p [x,y,z] většinou se jak na potvoru stane, že ho
potřebujeme zobrazit na obrazovce, která je jen 2D. A tak je třeba
"něco" co převede 3D koordináty do 2D ....
Líp to asi vynikne na obrázku :
Obrázek 2d->3d transformace
Vysvětlení k obrázku: Z je vzdálenost bodu od středu průmětny (v
našem případě obrazovka) , VZDAL je vzdálenost oka (pozorovatele) od
průmětny. R je obraz 3D bodu P v 2D soustavě. Body A a B jsou jenom
pomocné a to kvůli následujícím úvahám.
V obrázku je možné při troše snahy vidět dva trojúhelníky, které
jsou si podobné. Jsou to troj. OKO A P a OKO B R. Vyjdeme-li ze
známé věty o podobnosti trojúhelníků můžeme napsat první
transformační rovnici :
x x'
----------- = ---------- // to samé pro Y
(z+vzdal) vzdal
z čehož dostaneme :
x' = vzdal * x / ( z+vzdal )
y' = vzdal * y / ( z+vzdal )
To je nejzákladnější transformační rovnice. Co se týče proměnné
Vzdal, já volím nejčastěji hodnotu 256, abych nemusel násobit kdoví
čím, ale rychle a efektivně jenom shiftnul o 8 bitů doleva :
x'= (x SHL 8)/(z+vzdal)...
Jenže tahle rovnice nám moc komfortu nepřináší, neboť předpokládá že
oko pozorovatele je rovnoběžné s osou Z, ba co víc, leží na ní.
To však můžou napravit následující vzorce :
x'= vzdal * (x + vzd_x ) / (z + vzdal) + x_stred
y'= - vzdal * (y + vzd_y ) / (z + vzdal) + y_stred
kde vzd_x a vzd_y jsou koordináty pozorovatelny[vzd_x,vzd_y,vzdal]
Proměnné x_stred a y_stred jsou definovány proto, aby došlo k
posunutí obrazu y[0,0] do [x_stred,y_stred] , což je většinou střed
obrazovky (v 320x200 je to x_stred=160 a y_stred = 100).
Proč je v druhé rovnici mínus? To vyplývá z rozložení os v 2D a 3D:
^
-+--------------> +X +Y| / +Z
| | /
| | /
| |/
| +Y /+---------------------->
v / | +X
2D (obrazovka) 3D
Všimněte si, že na obrazovce jde osa Y zhora dolů, kdežto v mnou
definovaném 3D systému jde zdola nahoru ... proto to mínus. Ok ?
výheň