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