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