>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
      Odstraňování neviditelných ploch
    <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<


      Nuže  3d  těleso  máme,  umíme  ho zobrazit ať už za pomoci čar nebo
      polygonů.  Ale  ...ještě  to  stále není ono ...čímže to je ? V prvé
      řadě  tím, že  se zobrazují všechny stěny objektu. I ty které nejsou
      viditelné. Jenže jak je odstranit ? Nic jednoduššího :


      Konvexní tělesa
      ^^^^^^^^^^^^^^^
      Stačí  pouze  ke  každému  polygonu  (tedy  stěně) objektu vypočítat
      normálový  vektor  a  úhel,  který  svírá  tento  vektor  s vektorem
      pohledu. Je-li tento větší než 90o pak se daná stěna nezobrazuje. Je
      li mezi 0 a 90 stěna je viditelná.

      Jak  zjistíme  úhel ? Jednoduše : ze skalárního součinu vektorů, kdy
      platí :

                uu dot vv =   |v| * |u| * cos α

      Ani  není  třeba  používat  šílený  a  šíleně  pomalý fce arccos() ,
      protože  víme, že cos(90) = 0 a cos(0) = 1 ...takže se testuje jenom
      jestli je cos mezi 1 a 0 (vcetne).

      Další vylepšení : pokud se vektor pohledu nemění, pak je zcela možné
      vynechat výše uvedený vzorec a testovat jenom jestli je Z souřadnice
      normálového vektoru větší než nula. Když jo ...zobrazujeme.

      Jenže bacha na takovej menší problém - když je úhel hodně blízkej 90
      stupňům,  počítač  stěnu  zobrazí.  Jenže  nepočítá  s perspektivou,
      takže  se  strana  objevuje  viditelná ještě dřív, než by měla podle
      perspektivy bejt. Lze to řešit dvěma způsoby :

      1)  rozpětí  úhlů  kdy je stěna viditelná bude menší ..např. 0 až 89
          (to sem si právě vymyslel) ...
      2)  a  nebo  stačí úplně jednoduše spočítat normálový vektor ne z 3D
          polygonu, ale až po tom co byl polygon převeden do 2D.

          Takže něco ve smyslu :

              normál_z = (x3 - x1)(y2 - y1) - (x2 - x1)(y3 - y1)

          Když je normál_z větší než nula, potom zobrazujeme ...

      Konkávní tělesa
      ^^^^^^^^^^^^^^^
      Jojo  ...  s  těma  to  nikdy  neni lehký ...protože se výše uvedená
      metoda  nedá  použít  z  jednoho  jediného důvodu ... některé strany
      překrývaji jiné a to neseká dobrotu.

      Existuje víc návodů, jak toto řešit :

      • Painter's algorithm

        Ta  nejjednodušší  (kterou docela rád používám) je, že se vypočítá
        střed  každého polygonu (aritmetický průměr všech souřadnic) ty se
        pak  setřídí  podle  velikosti Z - souřadnice (x,y nás nezajímá) a
        pak  se podle pořadí zobrazují (nejlépe ozdadu :) ) ... na třídění
        je  nejlepší  použít  quicksort  ...ale masochisti můžou jakýkoliv
        jiný třídící algoritmus....

      •  Z-buffering

        Ta  složitější  je  Z-Buffering  . Je to metoda, která dává docela
        pěkné  (vizuálně)  výsledky.  Velice  pěkně  řeší problémy průniků
        těles  (zkuste to s předešlým algoritmem ;-) )... Jde v podstatě o
        to  udělat  si  pole  stejně  velké s obrazovkou (není podmínka) a
        nastavit  ho  na  nějaké  vysoké  hodnoty . Mno a pak jak počítáme
        postupně  to,  co se bude vykreslovat na screen, tak barvu každého
        bodu,  který  má  menší  Z-souřadnici  než ten předešlý umístěný v
        bufferu  (do  bufferu můžeme zapisovat jak Z-souřadnice tak barvu,
        ne  ?)  zapíšeme  do  té  pozice v bufferu místo toho starého. Pak
        jenom překopírujeme barvy z bufferu na obrazovku.

      No  pak  se třeba používaj BSP stromy (Binary space partition tree).
      Jsou   obzvláště  výhodné,  když  máte  těleso,  které  se  nehýbe a
      pohybuje  se  jenom viewpoint, nebo zdroj světla. Je založen na bázi
      předešlého  způsobu  a odstraňuje některé jeho nedostatky. Já s nima
      nedělám, ale až se je naučim, tak o nich něco napíšu.


            výheň