Upload
others
View
3
Download
0
Embed Size (px)
Citation preview
Računarska grafika
SPHIGS
01.04.2015.SPHIGS2
Uvod
� PHIGS je kompleksan grafički standardni paket za 3D grafiku� Skraćenica: Programmer’s Hierarchical Interactive Graphics System� PHIGS je grafički standard sledećih organizacija:
– ANSI (American National Standards Institute) i – ISO (International Standards Organization)
� Paket koji se ovde proučava (SPHIGS) je pojednostavljeni PHIGS– za potrebe akademskog proučavanja koncepata– podskup standardnog PHIGS-a + neke mogućnosti PHIGS-ekstenzija
� Tri osnovne razlike SPHIGS u odnosu na SRGP:– SPHIGS koristi 3D koordinatni sistem čije su koordinate realni brojevi– SPHIGS upravlja modelom (omogućava editovanje baze grafičkih struktura)– SPHIGS ne omogućava direktnu manipulaciju pikselima
01.04.2015.SPHIGS3
Grafičke s trukture
� SPHIGS podržava hijerarhiju grafičkih struktura – struktura je logičko grupisanje primitiva, njihovih atributa i drugih informacija– programer može da edituje strukture u bazi komandama za editovanje– SPHIGS obezbeđuje da je slika na ekranu
stvarna reprezentacija sadržaja baze struktura– strukture sadrže primitive, atribute i "pozive" podstruktura
� poziv podstrukture daje strukturi sličnost sa procedurom nekog programskog jezika– mogućnost kontrole geometrije i pojave svakog poziva podstrukture
� geometrija: pozicija, orijentacija, veličina � pojava (atributi): boja, stil linije, debljina linije
– pogodnost za aplikacije zasnovane na modelima hijerarhije među komponentama
� Prema režimu rada grafički paketi se dele na one koji rade u:– neposrednom režimu – ne pamte primitive koje im se prosleđuju (npr. SRGP)– režimu sa memorijom – pamte primitive i druge informacije (npr. SPHIGS)
� grafički paketi sa memorijom omogućavaju automatsko osvežavanje prikaza (čime rasterećuju aplikaciju te vrste posla)
01.04.2015.SPHIGS4
Mogućnosti paketa SPHIGS
� SPHIGS omogućava:– otvaranje i zatvaranje struktura
– specificiranje primitiva i njihovih atributa koji pripadaju strukturi– geometrijske modelirajuće transformacije
– editovanje hijerarhije struktura
– označavanje struktura za prikaz– definisanje prikaznih transformacija
� višestruki pogledi na sistem preko tabele prizora
– interakciju � tastatura, lokator, pik-korelacija, izbor iz menija – choice
01.04.2015.SPHIGS5
Otvaranje i zatvaranje struktura
� Struktura treba da sadrži logički kohezivan skup elemenata– elementi strukture definišu jedan (složeni) objekat
� Inicijalno postoji konačan broj praznih struktura – programer ne brine o njihovom stvaranju i uništavanju
� Editovanje strukture se vrši između njenog otvaranja i zatvaranja� Samo jedna struktura u jednom trenutku može biti otvorena za editovanje� Struktura može sadržati proizvoljan broj elemenata� Operacija SPHIGS-a za otvaranje strukture
void SPH_openStructure(int structureID);� Operacija za zatvaranje strukture
void SPH_closeStructure(void);� Nakon zatvaranja struktura može biti ponovo otvorena za editovanje
01.04.2015.SPHIGS6
Specificiranje primitiva
� Tačke se specificiraju pomoću tri realna broja dvostruke tačnosti (x,y,z)� Operacije smeštaju primitive u tekuće otvorenu strukturu
(a ne direktno na izlazni uređaj)� Dok se struktura ne zatvori – ona se ne prikazuje� SPHIGS "izvršava" primitivni element transformišući koordinate primitive
– modelirajućim geometrijskim transformacijama i– prikaznim transformacijama (viewing), uključujući odsecanje i rasterizaciju
� Svaki tip primitive ima svoje atribute – npr. atribut boje za liniju i poliedar je različit
01.04.2015.SPHIGS7
Primitive
� Operacija za definisanje polilinije void SPH_polyLine(int vertexCount, Point *vertices) ;
� Operacija za definisanje polimarkera void SPH_polyMarker(int vertexCount, Point *vertice s);
� Operacija za definisanje popunjenog poligona (stranice tela)void SPH_fillArea(int vertexCount, Point *vertices) ;
– SPHIGS ne proverava da li su popunjeni poligoni planarni � rezultati su nedefinisani ako nisu
� Operacija za definisanje teksta (koji nije potpuno 3D) void SPH_text(Point origin, char *str);
01.04.2015.SPHIGS8
Poliedar
� Operacija za definisanje poliedra void SPH_polyhedron(int vertexCount, int facetCount ,
Point *vertices, VertexIndex *facets);
� Poliedar se definiše tako što se definiše – vektor svih temena Point *vertices– vektor indeksa temena koja obrazuju stranice VertexIndex *facets
� Vektor indeksa: – indeksi temena koji obrazuju stranice poliedra– između stranica poliedra – negativna numerička vrednost kao separator (-1)
� Na primer, vektor indeksa: 0,1,2,3,4,-1,1,6,7,2,-1,... sadrži:– indekse temena koji obrazuju stranice (prva:0,1,2,3,4; druga: 1,6,7,2)– separatore (–1) između stranica poliedra
� Redosled temena na stranici mora biti određen pravilom desne ruke– posmatrano iz spoljašnosti tela
01.04.2015.SPHIGS9
� Primer:Point nizTemenaKuce[10] = {{0.,0.,0.},{5.,0.,0.},.. .};
VertexIndex nizStranicaKuce[36] = {0,1,2,3,4,-1,1,6,7,2,-1,...};
SPH_openStructure(KUCA);
SPH_polyhedron(10,7,nizTemenaKuce,nizStranicaKuce);
SPH_closeStructure();
Primer poliedra
X
Y
Z
01.04.2015.SPHIGS10
Specificiranje atributa
� Atributi su specifični za pojedine tipove primitiva– svaka vrsta primitiva ima nezavisan atribut boje– polilinija i kontrastna ivica poligona imaju različite atribute
� Atributi su modalni: – kada se za vreme obilaska strukture za prikaz "izvrši" postavljanje atributa,
vrednost ostaje do sledeće eksplicitne izmene u datoj strukturi� Atributi se vezuju za primitive za vreme obilaska struktura za prikaz � Debljina linije i veličina markera
– ne zadaju se ni u realnom svetu ni u pikselima– nisu podložni modelirajućim geometrijskim transformacijama– zadaju se u realnim multiplima (skala faktorima) nominalne debljine/veličine
� SPHIGS ne podržava teksture
01.04.2015.SPHIGS11
Atributi polilinije i polimarkera
� Operacije za postavljanje atributa polilinijetypedef enum {CONTINOUS, DASHED, DOTTED,...} LineSty le;
void SPH_setLineStyle(LineStyle lineStyle);
void SPH_setLineWidthScaleFactor(double scaleFactor );
void SPH_setLineColor(int colorIndex);
� Operacije za postavljanje atributa polimarkeratypedef enum {MARKER_CIRCLE, MARKER_SQUARE,...} Mar kerStyle;
void SPH_setMarkerStyle(MarkerStyle markerStyle);
void SPH_setMarkerSizeScaleFactor(double scaleFacto r);
void SPH_setMarkerColor(int colorIndex);
01.04.2015.SPHIGS12
Atributi popunjavanja i teksta
� Operacije za postavljanje atributa popunjenih površina i poliedaravoid SPH_setInteriorColor(int colorIndex);typedef enum {EDGE_VISIBLE,EDGE_INVISIBLE} EdgeVisi bility;void SPH_setEdgeFlag(EdgeVisibility flag);void SPH_setEdgeStyle(LineStyle edgeStyle);void SPH_setEdgeWidthScaleFactor(double scaleFactor );void SPH_setEdgeColor(int colorIndex);
� Operacije za postavljanje atributa tekstavoid SPH_setTextFont(int fontIndex);void SPH_setTextColor(int colorIndex);
01.04.2015.SPHIGS13
Strukture za prikaz ivanje
� Kada se struktura kreira u CSS (Central Structure Storage)ona se neće prikazivati odmah
� SPHIGS će prikazati samo one strukture koje su prosleđene odgovarajućoj specifikaciji prikaza (prizoru, view)
� SPHIGS obilazi strukture u prizoru i to element po element:– izvršenje elementa koji definiše primitivu doprinosi slici
(ako je bar deo primitive u prozoru za prikaz)– izvršenje elementa koji definiše atribut
menja stanje atributa koji se primenjuje na naredne primitive u strukturi� atributi se primenjuju na primitive po redosledu obilaska prilikom prikaza
01.04.2015.SPHIGS14
Prosle đivanje strukture prizoru
� Tabela prizora je niz čiji svaki element definiše– način prikaza za dati prizor
� definiše kako će se koordinate primitiva strukture preslikati u ekranske koordinate– listu struktura koje se prikazuju u datom prizoru
� Operacija za dodavanje strukture na listu prizoravoid SPH_postRoot(int structureID, int viewIndex);
� Prosleđivanjem neke strukture koja je složena – prosleđuje se cela hijerarhija za prikaz
� Indeks viewIndex prizora određuje poziciju u tabeli prizora� Operacija za uklanjanje strukture iz liste za prikaz
void SPH_unpostRoot(int structureID, int viewIndex) ;
01.04.2015.SPHIGS15
Definisanje prikaza – RWC
� Koordinatni sistem realnog sveta (real world coordinate, RWC) – 3D Dekartov desni koordinatni sistem
� Projekciona ravan (view plane, VP) – ravan na koju se vrši projektovanje
iz nekog centra projekcije
� Projekciona ravan je određena – referentnom tačkom (view reference point, VRP)
� tačkom koja se nalazi u projekcionoj ravni i
– normalom na ravan (view-plane normal, VPN)
� Vektor uspravnosti (view-up, VUP) – najčešće se poklapa sa y osom RWC sistema, ali nije neophodno
XRWC
ZRWC
YRWCVP
VPN
VUP
VRP
01.04.2015.SPHIGS16
Definisanje prikaza – VRC (1)
� 3D koordinatni sistem prikaza (viewing-reference coordinate, VRC):– koordinatni početak u VRP– jedna osa (n) se poklapa sa VPN– druga osa (v) se dobija kao projekcija VUP vektora na VP,
takva da leži u ravni (VPN,VUP)– treća osa (u) se dobija tako da formira desni koordinatni sistem (u,v,n)
VP
VPN
v
VRP
VUPu
n
01.04.2015.SPHIGS17
Definisanje prikaza – VRC (2)
� Prozor (window) na projekcionoj ravni – njegov sadržaj se preslikava u prikazni prozor (viewport)
� Prozor u VP se definiše pomoću opsega [umin, umax] i [vmin,vmax]� Centar prozora (center of the window, CW)� Centar projekcije (projection reference point, PRP)
– specificira se u VRC, ne u RWC
� Smer projekcije (direction of projection, DOP) – vektor od PRP do CW– u slučaju ortografske projekcije
DOP je paralelan sa VPN
VP
v
u
n
(umin,vmin)
(umax,vmax)
CW
PRP
DOP
01.04.2015.SPHIGS18
Definisanje prikaza – VRC (3)
� Posmatrana zapremina (view volume) – deo prostora koji se iseca za prikaz– za projekciju sa perspektivom
� polubeskonačna piramida sa temenom u PRP i ivicama koje prolaze kroz temena prozora u projekcionoj ravni
– za paralelnu projekciju � beskonačan paralelopiped sa stranicama paralelnim DOP
koje prolaze kroz ivice prozora
PRP
VP
CW
VP
CW
01.04.2015.SPHIGS19
Definisanje prikaza – VRC (4)
� Limitirana posmatrana zapremina se dobija tako što se postavljaju dve ravni paralelne VP:
– prednja odsecajuća ravan (front clipping plane, FCP) sa rastojanjem F (front distance) od VRP
– zadnja odsecajuća ravan (back clipping plane, BCP) sa rastojanjem B (back distance) od VRP
– F odnosno B su algebarske veličine � pozitivne su u smeru VPN (n ose) VP
F-B
01.04.2015.SPHIGS20
Definisanje prikaza – NPC
� Normalizovane koordinate projekcije (normalized projection coordinates, NPC) – jedinična kocka
� Posmatrana zapremina se transformiše u 3D prikazni prozor (viewport)unutar jedinične kocke NPC tako što:
– FCP i BCP se transformišu u zmax i zmin ravni, respektivno– umin i umax stranice se transformišu u xmin i xmax stranice– vmin i vmax stranice se transformišu u ymin i ymax stranice
VP 1
1
ZNPC
XNPC
YNPC
1
01.04.2015.SPHIGS21
Totalna transformacija prikaza
� Totalna transformacija se opisuje pomoću dve matrice– matrica orijentacije prizora (view orientation matrix)
� transformiše tačku iz RWC u VRC sistem� formira se na osnovu VRP, VPN i VUP
– matrica preslikavanja prizora (view mapping matrix) � transformiše tačke iz VRC u NPC
� Tačke iz 3D prikaznog prozora u NPC sistemu se preslikavaju na 2D uređaj:– jedinična kocka sa temenom u tački (0,0,0) i drugim (dijagonalnim) u tački (1,1,1)
se peslikava u najveći kvadrat koji se može upisati u ekran (prozor)– preslikavanje se obavlja jednostavno - tako što se z-koordinata ignoriše
� Primer: – na uređaju sa rezolucijom 1024x800, (0.5,0.75,z)NPC se mapira u (511,599)DC
RWC VRC NPC
01.04.2015.SPHIGS22
SPHIGS tabela prizora
� Može se specificirati više prizora za strukture u sceni– aplikacija može da podeli ekran (prozor) u nekoliko prikaznih prozora– tabela prizora – svaki ulaz tabele definiše poseban prizor (view) – strukture u različitim prizorima se prikazuju u različitim delovima ekrana
� Svaki prizor u tabeli sadrži:– reprezentaciju prizora
� specifikaciju orijentacije prizora (RWC�VRC)� specifikaciju preslikavanja prikazne zapremine u prikazni prozor (VRC�NPC)
– listu struktura koje su prosleđene za prikazivanje datom prizoru
� Ulaz 0 tabele prizora definiše podrazumevani prikaz
01.04.2015.SPHIGS23
Podrazumevani prikaz
� Prikaz u ulazu 0 tabele prizora je definisan:– VRP(0,0,0)– VUP ≡ YRWC � VRC(u,v,n) ≡ RWC(x,y,z)
– VPN ≡ ZRWC
– prozor W je definisan sa x ≡ u∈[0,1] i y ≡ v∈[0,1]– PRP(0.5,0.5,1.0) – prikazna zapremina z ≡ n∈[0, -∞]– prikazni prozor je cela NPC jedinična kocka
01.04.2015.SPHIGS24
SPHIGS reprezentacija prizora
� Operacija za definisanje reprezentacije prizora:void SPH_setViewRepresentation(int viewIndex,
Matrix_4x4 voMatrix, Matrix_4x4 vmMatrix,double NPCviewport_minX, double NPCviewport_maxX,double NPCviewport_minY, double NPCviewport_maxY,double NPCviewport_minZ, double NPCviewport_maxZ
);
� Operacija za definisanje matrice orijentacije prizora voMatrix– definiše se transformacija iz RWC u VRC sistem
Matrix_4x4 SPH_evaluateViewOrientationMatrix(
Point viewRefPoint, Vector_3D viewPlaneNormal,
Vector_3D viewUpVector, Matrix_4x4 voMatrix);
01.04.2015.SPHIGS25
Matrica preslikavanja prikaza
� Operacija za definisanje matrice preslikavanja prizora vmMatrix– definiše se transformacija iz VRC u NPC sistem
typedef enum {PARALLEL, PERSPECTIVE} ProjectionType ;Matrix_4x4 SPH_evaluateViewMappingMatrix(
/* specifikacija prikazne zapremine u VRC */double umin, double umax, double vmin, double vmax,ProjectionType projectionType,Point projectionReferencePoint, /* u VRC sistemu */double frontPlaneDistance, double backPlaneDistance ,
/* specifikacija NPC prikaznog prozora */double NPCvp_minX, double NPCvp_maxX, double NPCvp_minY, double NPCvp_maxY, double NPCvp_minZ, double NPCvp_maxZ, Matrix_4x4 vmMatrix
);
01.04.2015.SPHIGS26
Transformacije
� Standardizovani objekat: – jednim temenom u koordinatnom početku i – većinom ivica poravnat sa koordinatnim osama
� Standardizovani objekat je jednostavniji za definisanje i za manipulaciju� Promena položaja i orijentacije objekta se postiže
moćnom tehnikom modelirajućih (geometrijskih) transformacija� Primitive (kao poligon ili poliedar) se transformišu
tako što se transformiše svako njihovo teme (tačka) � Transformacija tačke se obavlja množenjem:
(transformaciona matrica)*(vektor-kolona tačke) � Vektor originala i vektor transformisane tačke
su u homogenim koordinatama
∗=
11
'
'
'
z
y
x
Mz
y
x
01.04.2015.SPHIGS27
Elementarne transformacije
� Sledeće operacije služe za definisanje elementarnih transformacija:matrix_4x4 SPH_scale(double scaleX, double scaleY,
double scaleZ, matrix_4x4 result);matrix_4x4 SPH_rotateX(double angle, matrix_4x4 res ult);matrix_4x4 SPH_rotateY(double angle, matrix_4x4 res ult);matrix_4x4 SPH_rotateZ(double angle, matrix_4x4 res ult);matrix_4x4 SPH_translate(double deltaX, double delt aY,
double deltaZ, matrix_4x4 result);
� Pozitivan smer parametra angle – određen je pravilom desne zavojnice vezane za posmatranu osu
� Matrice se koriste da se u strukturu smesti transformacioni element� Generalno, standardizovani objekti se
– najpre skaliraju, zatim rotiraju i najzad transliraju
01.04.2015.SPHIGS28
Lokalna transformacija
� Operacija za definisanje lokalne transformacione matrice strukture:typedef enum {REPLACE, PRECONCATENATE, POSTCONCATEN ATE}
TransformMode;void SPH_setLocalTransformation(matrix_4x4 matrix,
TransformMode mode);
� Kada SPHIGS obilazi strukture radi prikaza on postavlja lokalne matrice transformacije
� Matrica transformacije je lokalna – deluje samo na (naredne) elemente strukture gde je definisana
� Za vreme obilaska strukture na temena njenih primitiva se primenjuje lokalna transformacija
� Nakon obavljanja lokalne transformacije obavlja se prikazna transformacija � Inicijalno, matrica transformacije je postavljena na jediničnu matricu
01.04.2015.SPHIGS29
Primer transformacija
� Primer: kuća rotirana oko Y ose i zatim postavljena na proizvoljnu poziciju SPH_openStructure(TRANSFORMISANA_KUCA);
SPH_setLocalTransformation(SPH_rotateY(...), REPLAC E);SPH_setLocalTransformation(SPH_translate(...),
PRECONCATENATE);SPH_polyhedron(10,7,nizTemenaKuce, nizStranicaKuce) ;
SPH_closeStructure();SPH_postRoot(TRANSFORMISANA_KUCA,0);
X
Y
Z
X
Y
Z
01.04.2015.SPHIGS30
Kompozitna matrica
� Prekonkateniranje matrica se koristi da bi se podržao prirodan redosled transformacija
– razlog: tačka se predstavlja vektorom-kolonom
� Kompozicija matrice se obavlja u vreme obilaska za prikaz – nije efikasno, jer se pri svakom iscrtavanju matrice transformacija množe
� Kompozicija se može obaviti i u vreme specifikacije strukturematrix_4x4 SPH_composeMatrix(
matrix_4x4 m1, matrix_4x4 m2, matrix_4x4 result);
� Na ovaj način se množenje matrica obavlja u vreme specifikacije– a ne u vreme obilaska, kao u prethodnom primeru
– dobija se na efikasnosti
01.04.2015.SPHIGS31
Hijerarhijske mreže struktura
� Operacija za poziv podstrukture iz neke strukturevoid SPH_executeStructure(int structureID);
� Primer: ulica sa tri različito orijentisane kuće različitih veličina void izgradiStandardizovanuKucu(){
SPH_openStructure(KUCA); SPH_polyhedron(...);
SPH_closeStructure();}...izgradiStandardizovanuKucu();SPH_openStructure(ULICA);
SPH_executeStructure(KUCA);SPH_setLocalTransformation(...);SPH_executeStructure(KUCA);SPH_setLocalTransformation(...);SPH_executeStructure(KUCA);
SPH_closeStructure();SPH_postRoot(ULICA,0);
X
Y
Z
01.04.2015.SPHIGS32
Dogradnja scene
� Ako je kasnije potrebno dodati dimnjak na kuću:void izgradiStandardizovanuKucu(){
SPH_openStructure(JEDNOSTAVNA_KUCA);SPH_polyhedron(...);
SPH_closeStructure();SPH_openStructure(DIMNJAK);
SPH_polyhedron(...);SPH_closeStructure();SPH_openStructure(KUCA);
SPH_executeStructure(JEDNOSTAVNA_KUCA);SPH_setLocalTransformation(...); /* za dimnjak */SPH_executeStructure(DIMNJAK);
SPH_closeStructure();}
� Poenta: struktura ulice uopšte nije morala da se menja� Atributi strukture se modalno primenjuju i na podstrukturu
– važno naročito zbog modelirajućih transformacija
01.04.2015.SPHIGS33
Pristup elementima strukture
� Pristup elementima se obavlja pomoću indeksa i labela� Elementi struktura su indeksirani celim brojevima od 1 do N� Pri umetanju ili brisanju elementa iz strukture
– svi veći indeksi se menjaju� Postoji jedinstveni tekući element
– na njega ukazuje celobrojni pokazivač tekućeg elementa– pokazivač tekućeg elementa sadrži indeks tekućeg elementa
� Kada se struktura otvori, tekući element je poslednji – sa indeksom N, za nepraznu strukturu – sa indeksom 0, za praznu strukturu
� Dodavanje elementa iza tekućeg– pokazivač na tekući element se inkrementira
� Brisanje tekućeg elementa– pokazivač na tekući element se dekrementira
01.04.2015.SPHIGS34
Pozicioniranje pomo ću indeksa
� Apsolutno postavljanje pokazivača na tekući element:void SPH_setElementPointer(int index);
� Relativno postavljanje pokazivača na tekući element:void SPH_offsetElementPointer(int delta);
/* + unapred, - unazad */
01.04.2015.SPHIGS35
Labele
� Pozicioniranje pomoću indeksa nije robusno – zbog promene indeksa pri umetanju i brisanju elemenata
� Zato SPHIGS daje mogućnost postavljanja labela u strukturi– labela je poseban element
� Labeli se dodeljuje celobrojna vrednost u trenutku definisanja� Operacija za dodelu labele:
void SPH_label(int id);
� Operacija za premeštanje pokazivača na element labele:void SPH_moveElementPointerToLabel(int id);
� Pomeranje se vrši isključivo unapred – neuspeh ako se labela ne pronađe do kraja strukture
� Preporučljivo je postaviti pokazivač na početak strukture pre ove operacije
01.04.2015.SPHIGS36
Editovanje strukture
� Element strukture se uvek dodaje iza tekućeg elementa – pokazivač tekućeg elementa se premešta na dodati element– PHIGS podržava i režime:
� umetanja (insert) i � zamene (replace) elementa
� Ne može se promeniti podatak unutar nekog elementa– kada je potrebno promeniti teme nekog poliedra:
� ceo poliedar se mora najpre obrisati � zatim ponovo definisati (dodati strukturi)
� Operacija za kopiranje svih elemenata strukture u tekuće otvorenuvoid SPH_copyStructure(int idStructure);
– elementi se kopiraju iza tekućeg elementa tekuće otvorene strukture– pokazivač tekućeg elementa pokazuje na poslednji kopirani element
01.04.2015.SPHIGS37
Operacije za brisanje elemenata
� Brisanje tekućeg elemenatavoid SPH_deleteElement(void);
� Brisanje elemenata u opsegu indeksavoid SPH_deleteElementsInRange(
int firstIndex, int secondIndex);– brisanje uključuje i elemente sa zadatim indeksima
� Brisanje elemenata između labelavoid SPH_deleteElementsBetweenLabels(
int firstLabel, int secondLabel);– brisanje ne uključuje elemente labela
� Pokazivač se premešta na element koji prethodi obrisanim elementima
� Preživeli elementi se renumerišu
01.04.2015.SPHIGS38
SPHIGS interakcija
� SPHIGS tastatura – identična kao SRGP tastatura sa jednim izuzetkom– početna pozicija za eho se specificira u NPC prostoru, uz ignorisanje z
� SPHIGS lokator – sličan SRGP lokatoru– glavna razlika: kroz mere lokatora se vraća informacija o indeksu prizora
� Nove mogućnosti– pik-korelacija:
� proširuje funkcionalnost lokatora da vrati identifikaciju objekta kojeg je korisnik izabrao lokatorom
– uređaj izbora (choice) � podržava menije
01.04.2015.SPHIGS39
Lokator
� SPHIGS lokator vraća poziciju kurzora u NPC prostoru sa ZNPC=0– u sistemu PHIGS – lokator vraća poziciju u RWC prostoru
� SPHIGS lokator vraća i indeks na najprioritetniji prizor– indeks u tabeli prizora za prizor čiji prikazni prozor obuhvata kurzor– kada se prikazni prozori preklapaju na mestu gde se nalazi kurzor
� vraća se indeks prizora sa većim rednim brojem
� Mera lokatora:typedef struct{
Point position; // [x,y,0] NPC
int viewIndex;int buttonOfMostRecentTransition;enum {UP, DOWN} buttonChord[MAX_BUTTON_COUNT];
} LocatorMeasure;
01.04.2015.SPHIGS40
Pik-korelacija
� U 2D svetu, dvosmislenost izbora kod preklopljenih primitiva serazrešava izborom primitive u inverznom vremenskom redosledu crtanja
� U 3D svetu, pik-korelacija je kompleksnija
� 2 pitanja:– koja informacija treba da se vrati da se identifikuje objekat?
� samo ID strukture nije dovoljan zbog višestrukih poziva iste strukture� potrebna je cela putanja – od korene strukture do izabrane primitive
– kada izabere neku primitivu, na koji nivo hijerarhije misli korisnik?� ovo aplikacija može da reši tako što ponudi korisniku naknadni izbor
01.04.2015.SPHIGS41
Kriterijum komparacije
� Pošto lokator ne vraća koordinate u RWC, SPHIGS može da poredi samo poziciju kurzora sa slikama primitiva na ekranu
� Kandidat za korelaciju – svaka “pogođena” primitiva
� U žičnom modelu prikaza – SPHIGS bira prvog kandidata na kojeg naiđe za vreme obilaska
(korisnik ni ne očekuje informaciju “dubine”)
� U senčenom modelu prikaza – SPHIGS bira kandidata čija je selektovana tačka najbliža tački posmatranja
01.04.2015.SPHIGS42
Funkcija pik -korelacije
void SPH_pickCorelate(Point position, int viewIndex , PickInformation *pickInfo);
typedef struct{
int structureID; // identifikator strukture
int elementIndex;// indeks elementa u strukturi
ElementTypeCode elementType;//Polyline,Polyhedron,e xec…
int pickID; // dodeljeni pik-identifikator
} PickPathItem;
typedef PickPathItem PickPath[MAX_HIERARCHY_LEVEL];
typedef struct {
int pickLevel;
PickPath path;
} PickInformation;
01.04.2015.SPHIGS43
Nivo pogotka i putanja
� pickLevel
– = 0 kada su sve primitive dovoljno daleko,
– inače dužina puta od korena do izabrane primitive
� path
– ulazi od [1] do [pickLevel ] � identifikacija elemenata strukture od korena do izabrane primitive
– na nivou pickLevel je primitiva, a na prethodnim-izvršenja strukture
01.04.2015.SPHIGS44
Primer hijerarhijske strukture
� Neka je definisana struktura “robot”
robot ima telo, glavu i dve ruke sa po jednim prstom
izvršenje(desna)
translacija
rotacija
skaliranje
izvršenje(leva)
translacija
rotacija
skaliranje
Poliedar “glava”
rotacija
Poliedar “trup”
Telo
izvršenje
translacija
Poliedar “ruka”
Ruka
Poliedar “prst”
Prst
01.04.2015.SPHIGS45
Primer pik -korelacije
� (a) prst leve rukelevel=3
path[1]: struct Telo, element 7, izvršenje
path[2]: struct Ruka, element 3, izvršenje
path[3]: struct Prst, element 1, poliedar
� (b) desna rukalevel=2
path[1]: struct Telo, element 11, izvršenje
path[2]: struct Ruka, element 1, poliedar
� (c) promašajlevel=0
� (d) prst desne rukelevel=3
path[1]: struct Telo, element 11, izvršenje
path[2]: struct Ruka, element 3, izvršenje
path[3]: struct Prst, element 1, poliedar
01.04.2015.SPHIGS46
Pik-identifikator
� Sličan labeli – element strukture koji se ignoriše u obilasku
� Indeks elementa u strukturi je nepouzdan zbog editovanja� Podrazumevana vrednost pickID je 0 i modalno je postavljen u strukturi
� Postavlja se pomoću:void SPH_setPickIdentifier(int id);
� Ne nasleđuje se u podstrukturi (za razliku od atributa)– uvek je inicijalno 0 bez obzira da li je reč o korenoj strukturi ili podstrukturi
� Omogućava željenu finoću rezolucije pik-korelacije unutar strukture� Više primitiva u strukturi može da ima isti pickID ili svaka svoj
� Labele i pik-identifikatori su različiti mehanizmi, ali se često koriste zajedno