>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 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ň