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