            Rotacia objektov okolo jedneho bodu pomocou troch uhlov
                     v systeme s pravouhlymi suradnicami
                         Semestralna praca z C-jazyka

Projekt:

   ROTACIA.CPP - hlavny modul, nalinkuje graficky ovladac, nacita teleso
                 a spusti rotaciu
   OPERAT3D.H   - obshauje matice pre otacanie okolo osi a 3 sposoby
   OPERAT3D.CPP   vykreslovania objektov
   TELESO.H   - obsahuje definicu hranoveho a plosneho telesa, implementuje
   TELESO.CPP   pracu s telesami
   MATICA.H   - vytvorenie dynamickej matice
   MATICA.CPP
   3D.H         - obsahuje funkcie pre pracu s 3D obrazom
   3DOPERAT.ASM
   FPMATHF.H    - praca s desatinnymi cislami
   FIXPMFNC.ASM
   OBJECT3D.ASM - globalne operacie s celym objektom
   OBJECT.H
   DRIVER.ASM  - praca s externymi drivermi pre video
   GDRIVER.H   - ovladac grafiky
   GDRIVER.CPP
   POLYGON.H   - kresba polygonov
   POLYGON.CPP
   VIDITEL.H   - viditelnost ploch
   VIDITEL.CPP

Popis:

  - matematicke funkcie implementovane v 2 typoch 16/8/8 a 32/16/16
    (nedokoncene funkcie pre typy 32/24/8)
    (celkovy pocet bitov/bity celej casti/bity desatinnej casti)
  - funkcie FP(I)Sin(x) a FP(I)Cos(x) su tabulkovane
  - praca s 3D obrazom nevykonava maticove operacie, pouziva zjednoduseny
    tvar
  - vykreslovanie objektov sa vykonava len pre hranove modely
  - graficky ovladac je externy *.DRV, linkuje sa pocas behu programu

Ako to funguje ?

  1.Matematika
    V programe je pouzity sposob reprezentacie realnych cisel s pevnou
    desatinnou ciarkou. Podstata je v tom, ze 32-bitove cislo sa rozdeli
    na dve casti (napr. na 16 a 16 bitov). Prva cast bude zobrazovat celu cast
    cisla a druha desatinnu. Samozrejme, maximalny rozsah celej casti cisla
    je potom obmedzena na interval <0; 65535> alebo <-32768; 32767>. Desatinna
    cast je limitovana na pocet 65536-in v cisle. Praca s takto reprezentovanym
    cislom je vsak maximalne jednoducha a velmi rychla, pretoze operacie 
    scitania, odcitania sa vykonavaju rovnako ako pri praci s celymi cislami;
    nasobenie a delenie podobne, akurat treba vziat do uvahy, ze sa nenasobia
    dve cisla ako 2*3, ale cisla (2*65536)*(3*65536). Pokial teda chceme 
    nasobit cisla a*b, musime vysledok (a*b) vydelit 65536 (inymi slovami,
    vysledok posunieme o 16 bitov doprava). Pri deleni podobne posunieme
    delenec o 16 bitov dolava (toto plati samozrejme len pre 16b/16b 
    (cela/desatinna cast cisla) rozdelenie cisla na dve casti).
    Sinus(x) a Cosinus(x) su tabulkovane na intervale <0; Pi/4>, pricom
    na ostatnych intervaloch su ziskane z tohto zakladneho intervalu.
    SqrT(x) je obycajny Newtonov algoritmus na vypocet druhej odmocniny.

  2.Reprezentacia modelov telies
    Telesa su reprezentovane ako struktura, ktora obsahuje zoznam bodov
    a zoznam ploch telesa, spolu s niektorymi vlastnostami tychto prvkov.
    Zoznam bodov, ploch, ich normaly a smerove vektory vrcholov su 
    reprezentovane ako obycajne pole. K comu sluzia normaly a smerove vektory
    sa dostaneme dalej. Kazda plocha v sebe obsahuje pocet vrcholov, 
    ohranicujucich polygon plochy a zoznam indexov tychto vrcholov v poli
    vrcholov, usporiadanych podla smeru hodinovych ruciciek z viditelnej 
    strany. Ma to velky vyznam pri urcovani viditelnosti, ako bude neskor
    vysvetlene.
 Inymi slovami, vsetky body v ploche usporiadame podla smeru
    hodinovych ruciciek z viditelnej strany plochy a do pola bodov plochy
    zapiseme ich indexy v poli vsetkych bodov.

  3.Vektorove funkcie a (pseudo) maticove funkcie
    Zakladne funkcie sucet, rozdiel, skalarny sucin, vektorovy sucin su 
    doplnene funkciami, ktore normalizuju vektor, vypocitavaju normalu plochy,
    alebo rotuju bod okolo nejakej suradnicovej osi (pripadne okolo vsetkych).
    Maju vyznam pri prepocitavani polohy objektu, pri urcovani viditelnosti
    a tienovani telesa.
    Rotacne funkcie vznikli zjednodusovanim maticovych vypoctov
    kvoli dosiahnutiu co mozno najvyssej rychlosti vypoctu (zjednodusovanim
    v tom zmysle, ze boli zrusene operacie typu a*1 alebo b*0, pripadne tvar
    a*b+a*c bol prevedeny na tvar a*(b+c), cize nie zjednodusovanie, ktore ma
    za nasledok zmenu presnosti vypoctu).

  4.Urcovanie viditelnosti
    Pre konvexne telesa sa da vyuzit jedna vlastnost normalovych vektorov 
    ploch, a to ta, ze skalarny sucet vektora pohladu s normalovym vektorom je
    vacsi ako 0 len pri uhle tychto dvoch vektorov z intervalu <-Pi/2; Pi/2> =
    <-90; 90> stupnov. To je zrejme z definicie skalarneho sucinu, kde plati
    a.b = |a|.|b|.cos(u), kde |a| je velkost vektora a, 
    |a| = Sqrt(a.x^2+a.y^2+a.z^2), a u je uhol, ktory zvieraju vektory a, b.
    Pokial |a| = |b| = 1, cize a, b su jednotkove vektory, potom a.b = cos(u).
    A prave tato vlastnost bude vyuzivana. Normalovovy vektor plochy je 
    jednotkovy vektor, ktory je kolmy na plochu. Vektor pohladu je tiez 
    jednotkovy vektor, potom ich skalarnym sucinom ziskame priamo cos(u),
    ktory nam indikuje, ci je dana plocha viditelna (ak je >= 0, je viditelna,
    inak nie je). Normalovy vektor plochy ziskame vektorovym sucinom dvoch
    lubovolnych vektorov z tejto plochy tak, aby bolo zarucene, ze nasleduju
    v poradi hodinovych ruciciek. Napriklad, ak mame v ploche body a,b,c,d,e,f
    usporiadane podla smeru hodinovych ruciciek, mozeme vybrat napr. vektory
    ab, de, ale nesmieme vybrat vektory ba, cd alebo ef, bc. Ide tu o to,
    ze vektorovy sucin je antikomutativny, to znamena, ze u x v = - v x u
    (x oznacuje operator vektoroveho sucinu). Potom vysledny vektor znormujeme
    (urobime z neho jednotkovy vektor) tak, ze kazdu jeho zlozku podelime
    velkostou vektora.
    Toto uz celkom nestaci pre nekonvexne telesa, pretoze viditelne plochy 
    sa mozu prekryvat. Na korigovanie tohto javu je pouzity jednoduchy 
    algoritmus triedenia poradia ploch pri vykreslovani podla minimalnej
    (maximalnej) z-ovej suradnice bodov v kazdej ploche. Plochy sa zotriedia
    podla minimalnej (maximalnej) hodnoty z-ovej suradnice vrcholov v ploche,
    a potom sa vykresluju v poradi od najvzdialenejsej plochy (da sa s tym
    stretnut ako so zjednodusenym maliarovym algoritmom ;).

  5.Tienovanie ploch v telese
    Zostal uz iba jeden problem, a to tienovanie jednotlivych ploch v telese.
    Pokial by sme chceli, aby plocha bola jedinej farby, ktora zavisi od uhla,
    pod ktorym na nu dopada svetlo, pouzili by sme podobne riesenie, ako pri
    urcovani viditelnosti. Vtedy by nam skalarny sucin medzi normalovym 
    vektorom a jednotkovym vektorom svetla udaval intenzitu farby plochy.
    No v realite nema cela plocha rovnaku farbu. Preto je v tomto programe
    pozity typ tienovania - Gouraudovo tienovanie, ktore robi aspon opticky
    dojem, ze teleso je plynule. Je zalozene na tom, ze vsetkym krajnym bodom
    priradi nejaku farbu a potom ju iba pri vykreslovani plynule meni.
    Farbu ziska tak, ze pre kazdy vrchol spocita smerovy vektor - vektor,
    ktory je priemerom normalovych vektorov vsetkych okolitych ploch. Intenzitu
    Farby vypocita rovnako ako pri zistovani farby celej plochy. Farba je potom
    taka, aka je farba plochy, meni sa iba jej intenzita.

    mail:   alac@frcatel.utc.sk
            http://frcatel.utc.sk/~alac
