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