5. Primitivi polj in njihove lastnosti

Primitivi polj so najbolj prilagodljivi primitivi PEX. Uporabimo jih lahko v preprostih žiènih modelih ali v zapletenih osvetljenih in senèenih scenah. Njihova zunanjost se lahko izrazito spreminja ob le majhnih spremembah lastnosti. Primitivi polj so shematièno enostavni, imajo pa lahko precej kompleksne parametre.

5.1. Primitivi polj

Primitive polj uporabljamo za doloèitev površin in ozadja. Imajo notranjost, robove in prednjo ter zadnjo stran. PEX-u lahko ukažemo, da osenèi površine, kar s èrto ali tekstom ni možno. Najbolj enostaven primitiv polja je polno polje (fill area), najbolj kompleksen pa je neenotna B - ukrivljena površina (B - spline surface).

Primitivi polj nimajo debeline. Pri modeliranju v 3D prostoru predstavimo samo lupino predmeta (npr. krogla, kvader). PEX ne vsebuje volumskih primitivov.

5.1.1. Ploskve primitivov polj

Primitivi polj so sestavljeni iz ene ali veè ploskev. Polno polje (fill area) ima samo eno ploskev.Ta je lahko majhna ali velika. Ko želimo prikazati ukrivljeno površino s primitivi polj, ponavadi doloèimo veèje število majhnih ravnih ploskev. Vsaka od njih predstavlja le majhen del celotne površine.

5.1.2. Prednje in zadnje strani ploskev

Ploskev ima dve strani, prednjo in zadnjo. Prednjo oz. zadnjo stran doloèa geometrijski normalni vektor (geometric normal vector). To je vektor, ki je usmerjen pravokotno na ploskev. Njegova smer je s prednje strani navzven. Izraèuna ga lahko PEX ali pa ga podamo kot normalo prednje strani.

Strani ploskev niso doloèene s tem kako jih vidimo. Prednja stran je prednja neglede na to kako ploskev transformiramo in od kje jo gledamo. Ko gledamo doloèeno ploskev, lahko gledamo prednjo ali zadnjo stran, paè odvisno od samega modeliranja ali transformacij pogleda in orientacije ploskve.

Prednji ali zadnji strani ploskve lahko doloèimo razliène lastnosti, tako da ju loèimo, ko sta prikazani.

5.1.3. Robovi primitivov

Primitivi polj imajo robove. Robovi so meje med posameznimi ploskvami površine. Imajo svoje lastne lastnosti, ki kontrolirajo njihovo zunanjost. Te lastnosti so podobne lastnostim èrtnih primitivov. Doloèimo lahko ali naj se robovi izrišejo ali ne.

5.1.4. Meje polj

Meje polj sovpadajo z robovi. Trikotni deli in pravokotne mreže imajo notranje robove - robovi posameznih trikotnikov in pravokotnikov, ki jih meja ne vsebuje.

Ko doloèen primitiv delno izrežemo ali obrežemo se meja primitiva spremeni, robovi se s tem ne spremenijo.

Meje in robovi so prikazani razlièno. Robovi so narisani z lastnostmi robov - tip, debelina in barva in samo takrat, ko je stikalo za to vkljuèeno (flag is on). Meje pa so narisane samo takrat, ko je notranji stil površine prazen (hollow).

5.1.5. Oblike (Shape Hints)

PEX primitivi polj so definirani tako, da se prilagajajo vsem splošnim oblikam. Da se primitiv pravilno prikaže, mora PEX poznati njegovo obliko. Èe obliko primitiva poznamo jo navedemo in s tem olajšamo delo PEX-u. Povemo lahko ali je površina konveksna, konkavna ali samo - preseèna. Èe oblike ne poznamo lahko navedemo PEXShapeUnknown.

5.2. Lastnosti primitivov polj

5.2.1. Stil notranjosti

Stil notranjosti je lastnost primitiva, ki kontrolira, kako je polje zapolnjeno. Na voljo je pet možnosti.

- Hollow (prazno): je notranji stil, ki naredi notranjost primitiva prazno in prozorno ter nariše le njegove meje. Barva mej je barva doloèena za notranjost. Tip èrte in debelina sta odvisna od PEX izvedbe. Z risanjem brez zapolnitve notranjosti pogosto prihranimo èas, oblika pa je še vedno nekako razvidna. Ta stil notranjosti se pogosto uporablja za žiène modele.

- Solid (trden): je stil, ki zapolni notranjost primitiva z doloèeno barvo ali osenèitvijo. Barve so doloèene v prikazovalnem vodu, tako da se upoštevajo viri svetlobe in senèenje.

- Pattern (vzorèen): je vzorec za stil, ki se ponavlja èez cel primitiv. Vzorec lahko izbiramo z indeksom notranjega stila, ki je lastnost doloèenega primitiva.

- Hatch (šrafiran): je notranji stil, ki napolni notranjost primitiva s paralelnimi èrtami. Izbiro šrafure doloèa indeks notranjega stila. Od izvedbe PEX-a pa je odvisno ali se skozi podroèje šrafure vidi. Šrafiranje se izvede po fazi modeliranja, doloèitvi pogledov in NPC - to - viewport transformaciji. Šrafiranje je postavljeno pod kotom 45 stopinj glede na robove okna. Orientacija primitiva ni pomembna. Nekatere izvedbe PEX-a pa transformirajo tudi šrafure.

- Empty (prazno): je notranji stil, ki naredi notranjost primitiva prazno. Narišejo se samo robovi, èe to zahtevamo. V primerjavi s hollow stilom bolj nadzira primitiv. Kontroliramo lahko debelino, barvo in tip èrte za robove, èesar pri stilu hollow ne moremo. Stil je primeren za žièno modeliranje.

Vse izvedbe PEX-a ne podpirajo vseh zgoraj naštetih stilov. Informacijo o tem lahko dobimo s klicanjem funkcije PEXGetEnumTypeInfo.

Notranji stil doloèimo s funkcijo PEXSetInteriorStyle:

void    PEXSetInteriorStyle(
        Display                 *dpy,
        XID                     resource_id,
        PEXOCRequestType        request_type,
        int                     style)

Argument style se izbere med:

PEXInteriorStyleHollow
PEXInteriorStyleSolid
PEXInteriorStylePattern
PEXInteriorStyleHatch
PEXInteriorStyleEmpty

Osnovni (splošno nastavljen) stil je PEXInteriorStyleHollow.

5.2.2. Indeks stila notranjosti

Indeks stila notranjosti uporabimo kadar doloèamo stil pattern ali hatch.

5.2.3. Barva notranjosti

Za nastavitev barve notranjosti klièemo funkcijo PEXSetSurfaceColor.

void    PEXSetSurfaceColor(
        Display                 *dpy,
        XID                     resource_id,
        PEXOCRequestType        request_type,
        int                     color_type,
        PEXColor                *color)

Argumenti so znani že od prej.

5.2.4. Stikalo za robove (Edge Flag)

Z lastnostjo "edge flag" lahko doloèimo ali naj se robovi ploskev izrišejo ali ne. Stikalo je lahko "on" (robovi se prikažejo) ali "off" (robovi se ne prikažejo). Zaèetna (splošna nastavitev je off. Nekateri primitivi dopušèajo, da se ta nastavitev opravi za vsako ploskev posebej. Nastavljanje robov se opravi s funkcijo PEXSetSurfaceEdgeFlag.

void PEXSetSurfaceEdgeFlag(
        Dysplay                 *dpy,
        XID                     resource_id,
        PEXOCRequestType        request_type,
        int                     edge_flag)

Nov je argument edge_flag, ki ima lahko vrednosti PEXOn ali PEXOff.

Tip robov, njegovo debelino in barvo pa doloèamo s funkcijami:

PEXSetSurfaceEdgeType
PEXSetSurfaceEdgeWidth
PEXSetSurfaceEdgeColor

podobno kot pri doloèitvi lastnosti èrtnega primitiva polyline.

5.3. Primitiv Fill area

Primitivi fill area so preprosti poligoni. Ta primitiv lahko uporabimo za prikaz ploskve, poligonske oblike z luknjami in prikažemo lahko tudi ukrivljene površine s tem, da jih razdelimo na manjše ravne dele.

Fill area je doloèen s svojim nizom toèk, ki doloèa mejne toèke nekega poligona. PEX sam zakljuèi poligon s tem, da izenaèi konèno toèko z zaèetno.

Notranjost polja je doloèena s pravilom lihega obrata (odd-winding role). To pravilo pravi, da je notranjost polja tisto mesto od kjer je do zunanjosti liho število mej. Glej sliko 14.

Slika 14. Pravilo lihega obrata

Primitiv fill area naj bi bil raven. V primeru neravnih površin je rezultat smešen. V teh primerih moramo uporabiti primitive kot so: fill area sets, triangle strip ali quadrilateral mesh.

Primitiv fill area kreiramo s funkcijo PEXFillArea ali s PEXFillArea2D.

void    PEXFillArea2D(
        Display                 *dpy,
        XID                     resource_id,
        PEXOCRequestType        request_type,
        int                     shape_hint,
        int                     ignore_edges,
        unsigned int            num_vertices,
        PEXCoord2D              vertices)

Neznani argumenti so:

shape_hint ... doloèa obliko fill area in je lahko: PEXShapeComplex, PEXShapeConvex, PEXShapeNonConvex, PEXShapeUnknown

ignore_edges ... doloèa ali ima fill area prikazane robove (False) ali ne (True)

num_vertices ... število toèk

vertices ... polje toèk, ki doloèajo fill area