560 likes | 715 Views
Del 1 Introduksjon til VTK. VTK - The V isualization T ool k it. Objekt-orientert bibliotek for visualisering Fordeler: Fritt tilgjengelig Stor brukergruppe Godt designet, testet og dokumentert (se VTK brukermanual på kurs-siden!) Rik funksjonalitet, fleksibelt Pedagogisk!
E N D
VTK - The Visualization Toolkit • Objekt-orientert bibliotek for visualisering • Fordeler: • Fritt tilgjengelig • Stor brukergruppe • Godt designet, testet og dokumentert (se VTK brukermanual på kurs-siden!) • Rik funksjonalitet, fleksibelt • Pedagogisk! • Portabelt (MS Windows, SGI, Sun, Linux ...) • Kan brukes fra flere vertsspråk (C++ , Tcl/Tk, Python, Java, ...) • Mulighet for utvidelser med egne C++ klasser INF2340 / V05
VTK • Ulemper: • Dårlig ytelse (i mange tilfeller) • Utnytter ikke visse typer maskinvare for grafikk • ... • Til dels dårlig dokumentasjon... INF2340 / V05
Objektorientering (OO) i C++ • En klasse er en datatype med • tilstand (variable, data, datastrukturer, ...) • algoritmer for å endre tilstanden (prosedyrer, funksjoner, metoder, operasjoner, ...) • Et objekt er en instansiert klasse (instans av en klasse) INF2340 / V05
Eksempel class Adder { public: void Add(int x, int y) {sum = x + y;} int GetSum() {return sum;} private: int sum; }; Adder a1; a1.Add(3, 4); cout << a1.GetSum() << ‘\n’; Adder* a2 = new Adder; a2->Add(5, 6); cout << a2->GetSum() << ‘\n’; INF2340 / V05
A B A B A B A B Litt notasjon for OO-modellering En klasse Et objekt (instans av klassenA) A A A er en generalisering av B (A er en superklasse (baseklasse) av B) B er et spesialtilfelle av A (B er en subklasse (avledet klasse) av A) A har kjennskap til B (assosiasjon) (Egentlig: A har behov for å kjenne til B!) A og B har kjennskap til hverandre (toveis assosiasjon) A består av B, B er en del av A (aggregering - spesiell form for assosiasjon) INF2340 / V05
1 A består av nøyaktig én instans av B A B 0..1 A består av null eller én instans av B A B 0..* A består av null eller flere instanser av B A B Litt OO notasjon (forts.) osv. Tilsvarende for assosiasjon! INF2340 / V05
“Visualization Pipeline” VTK - Overordnet Arkitektur 1 0..1 vtkRenderWindowInteractor vtkRenderWindow 1 1..* 1..* vtkRenderer 1..* vtkActor 1..* 1..* 1 1..* vtkMapper 1 0..* 1 1 vtkLight vtkCamera vtkProperty INF2340 / V05
“Visualization Pipeline” vtkRenderWindow 1 0..1 vtkRenderWindowInteractor vtkRenderWindow 1 1..* 1..* • Ansvarlig for opptegning av all grafikk i et “hovedvindu”. vtkRenderer 1..* vtkActor 1..* 1..* 1 1..* vtkMapper 1 0..* 1 1 vtkLight vtkCamera vtkProperty INF2340 / V05
“Visualization Pipeline” vtkRenderWindowInteractor 1 0..1 vtkRenderWindowInteractor vtkRenderWindow 1 1..* 1..* • Håndterer mus- og tastatur-hendelser (“events”). • Gir vtkRenderWindow-objektet beskjed om ny opptegning der typisk verdier i vtkCamera objektene er endret. vtkRenderer 1..* vtkActor 1..* 1..* 1 1..* vtkMapper 1 0..* 1 1 vtkLight vtkCamera vtkProperty INF2340 / V05
“Visualization Pipeline” vtkActor 1 0..1 vtkRenderWindowInteractor vtkRenderWindow 1 1..* 1..* • Representerer et geometrisk objekt i en 3D “scene”. • Mange operasjoner utføres på en 3D “aktør” som helhet, bl.a. skjuling, deformering og rotasjon. vtkRenderer 1..* vtkActor 1..* 1..* 1 1..* vtkMapper 1 0..* 1 1 vtkLight vtkCamera vtkProperty INF2340 / V05
“Visualization Pipeline” vtkProperty 1 0..1 vtkRenderWindowInteractor vtkRenderWindow 1 1..* 1..* • Definerer egenskaper for flaten til en 3D “aktør”, deriblant • farge • hvordan lys reflekteres • representasjonsform ((fylte) polygoner, linjer eller punkter) • transparens vtkRenderer 1..* vtkActor 1..* 1..* 1 1..* vtkMapper 1 0..* 1 1 vtkLight vtkCamera vtkProperty INF2340 / V05
“Visualization Pipeline” vtkMapper 1 0..1 vtkRenderWindowInteractor vtkRenderWindow 1 1..* 1..* • Representerer “sluttproduktet” i “Visualization Pipeline” i form av et sett med grafiske primitiver. vtkRenderer 1..* vtkActor 1..* 1..* 1 1..* vtkMapper 1 0..* 1 1 vtkLight vtkCamera vtkProperty Flere detaljer om vtkMapper kommer senere! INF2340 / V05
“Visualization Pipeline” vtkRenderer 1 0..1 vtkRenderWindowInteractor vtkRenderWindow 1 1..* 1..* • Ansvarlig for å lage et 2D bilde av 3D ”aktørene” ... • ... eller 2D “aktørene” vtkRenderer 1..* vtkActor 1..* 1..* 1 1..* vtkMapper 1 0..* 1 1 vtkLight vtkCamera vtkProperty 1..* 1..* vtkViewport vtkActor2D vtkRenderer INF2340 / V05
“Visualization Pipeline” vtkLight 1 0..1 vtkRenderWindowInteractor vtkRenderWindow 1 1..* 1..* • Definerer en lyskilde for belysning av 3D “aktørene”. • En lyskilde kan bl.a. ha farge og plassering. vtkRenderer 1..* vtkActor 1..* 1..* 1 1..* vtkMapper 1 0..* 1 1 vtkLight vtkCamera vtkProperty INF2340 / V05
“Visualization Pipeline” vtkCamera 1 0..1 vtkRenderWindowInteractor vtkRenderWindow 1 1..* 1..* • Definerer synsvinkelen vi betrakter 3D ”aktørene” med. • Bl.a. kan graden av perspektiv manipuleres. vtkRenderer 1..* vtkActor 1..* 1..* 1 1..* vtkMapper 1 0..* 1 1 vtkLight vtkCamera vtkProperty INF2340 / V05
Instansiering av objekter • VTK-objekter skal alltid instansieres med New og slettes med Delete! vtkRenderer* rdr = vtkRenderer::New(); rdr->Delete(); • Pga. • Dynamisk minnehåndtering “garbage collection” • Korrekt instansiering av subklasser(se kap. 3.10 i VTK-boka) • ... INF2340 / V05
“Visualization Pipeline” Sammenkobling av objekter SetRenderWindow 1 0..1 vtkRenderWindowInteractor vtkRenderWindow 1 AddRenderer 1..* AddActor 1..* vtkRenderer 1..* SetMapper vtkActor 1..* 1..* 1 AddLight 1..* vtkMapper SetActiveCamera 1 SetProperty 0..* 1 1 vtkLight vtkCamera vtkProperty Disse instansieres (og kobles opp) automatisk INF2340 / V05
vtkMapper SetInput GetOutput vtkSphereSource Sammenkobling av objekter i “Visualization Pipeline” vtkSphereSource* sSphere = vtkSphereSource::New(); vtkPolyDataMapper* mSphere = vtkPolyDataMapper::New(); mSphere->SetInput(sSphere->GetOutput()); Mer om dette senere! INF2340 / V05
Typisk hovedstruktur i et C++/VTK program i INF2340 // Inkludering av nødvendige filer // *** Hovedprogram *** main() { // - Instansiér og koble sammen vtkRenderWindow, vtkRenderer og // evt. vtkRenderWindowInteractor objekter. // - Instansiér “aktør” objekter og deres tilhørende “visualization // pipelines” // - Koble “aktør” objektene til vtkRenderer objektet/objektene // - Sett opp vinduet og start evt. mus/tastatur interaksjon } INF2340 / V05
VTK så langt • Nok informasjon til å lage enkle programmer der fokus ikke er på “visualization pipeline” • Bruk manualsidene! INF2340 / V05
Lys • Elektromagnetisk energi med bølgelengde i intervallet 400- til 700 nm (10-9 m) (nm) 10-6 10-3 10-1 10 103 106 109 1012 Kosmisk stråling Gamma stråling Røntgen Ultrafiolett Infrarødt Mikrobølge Radar Radio Synlig lys 400 450 500 550 600 650 700 (nm) INF2340 / V05
Fargen til et objekt • Definert som bølgelengdene det reflekterer eller transmitterer (genererer selv) INF2340 / V05
Fargeoppfattelse • Defineres typisk vha. tre størrelser: • dominerende bølgelengde • metning (“avstand” fra grått) • intensitet (“lyshet”) INF2340 / V05
Akromatisk lys (gråtoner) • Ingen dominerende bølgelengde • Metning lik null INF2340 / V05
Øyet • To typer fotoreseptorer: • staver (“rods”) • aktive ved svakt lys (om natten etc.) • oppfatter mest gråtoner • tapper (“cones”) • aktive ved normalt lys • oppfatter “alle” farger (inkl. gråtoner) INF2340 / V05
tre typer - mest sensitive for hhv. blått, grønt og rødt 400 700 Bølgelengde (nm) fiolett! INF2340 / V05
Fargesyntese • Additiv • kombinasjon av farget lys • dataskjermer • totalfargen lysere (mer intens) og mer mettet enn enkelt-komponentene • modeller: RGB, HSV • Subtraktiv • refleksjon fra kombinasjon av fargede “pigmenter” • printere • totalfargen mørkere (mindre intens) og mindre mettet enn enkelt-komponentene • modeller: CMY(K) INF2340 / V05
Blue (0, 0, 1) Cyan (0, 1, 1) Magenta (1, 0, 1) White (1, 1, 1) Gråtoner Black (0, 0, 0) Green (0, 1, 0) Red (1, 0, 0) Yellow (1, 1, 0) Fargemodeller (-rom) RGB-kuben INF2340 / V05
Basiskomponenter: R (red), G (green) og B (blue) • Additiv syntese • Fargeskjermer • Fargen oppfattes som hvit når hver komponent har full intensitet • Fargen oppfattes som sort når hver komponent har null intensitet INF2340 / V05
CMY(K)-kuben Yellow (0, 0, 1) Red (0, 1, 1) Green (1, 0, 1) Black (1, 1, 1) Gråtoner White (0, 0, 0) Magenta (0, 1, 0) Cyan (1, 0, 0) Blue (1, 1, 0) INF2340 / V05
Basiskomponenter: C (cyan), M (magenta) og Y (yellow) • Subtraktiv syntese • Printere • Fargen oppfattes som sort når hver komponent har full intensitet • Fargen oppfattes som hvit når hver komponent har null intensitet • I praksis (trykkeribransjen) brukes en fire-farge teknikk med sort (K) som en fjerde farge INF2340 / V05
Fordeler med kubemodellene • Enkel geometri • Korresponderer direkte med maskinvare (RGB-kanonene i skjermen • effektiv! INF2340 / V05
Ulemper med kubemodellen • En gitt RGB-verdi vil ikke nødvendigvis gi samme farge på andre skjermer! • RGB kan i praksis ikke overføres direkte til CMY kun ved å ta inversen (R = 1 - C) • Sammenhengen mellom forskjell i fargeoppfattelse og geometrisk avstand mellom to “fargepunkter” varierer med hvor i kuben man er (f.eks. enklere å skille farger i det “lyse” hjørnet!) • Representerer styrken på RGB-kanonene i skjermen i større grad enn hvordan fotoreseptorene i øyet oppfatter farge • Ikke spesielt intuitiv! INF2340 / V05
HSV-modellen • Basert på “kunstmaler-modell” Blanding med hvitt Ren farge Blanding med både hvitt og sort Gråtoner Blanding med sort INF2340 / V05
V Yellow 60° Green 120° Cyan 180° White 1.0 Red 0° Magenta 300° Blue 240° H S Black 0.0 HSV = generalisert kunstmaler-modell: • Basiskomponenter: H (hue), S (saturation) og V (value) • Additiv syntese • Fargeskjermer INF2340 / V05
Fordeler med HSV-modellen • Intuitiv! • Enkel geometri (nesten like enkel som RGB) • Enkel algoritme for å konvertere til RGB INF2340 / V05
Ulemper med HSV-modellen • En gitt HSV-verdi vil ikke nødvendigvis gi samme farge på andre skjermer! • Sammenhengen mellom forskjell i fargeoppfattelse og geometrisk avstand mellom to “fargepunkter” varierer med hvor man er (spesielt langs “hue”-dimensjonen: langsommere endringer ved RGB-vinklene) • Aksene oppfattes ikke som helt ortogonale (uavhengige). F.eks. vil ulike punkter i HS-planet kunne gi litt ulik intensitet selv om V er numerisk konstant. INF2340 / V05
RGB vs HSV RGB (red, green, blue) and HSV (hue, saturation, value) colour systems. INF2340 / V05
Display controller 000000001000000000 000000111110000000 000011111111100000 000111111111110000 000110011100110000 000110011100110000 000111111111110000 000000000000000000 Video controller Basal Maskinarkitektur for Rastergrafikk Grensesnitt mot vertsmaskin Grafikk kommandoer Interaksjons data Mus / Tastatur Pixel (picture element) “Frame buffer” INF2340 / V05
Skjermoppløsning vs. pixeldybde • Skjermoppløsning = antall pixler • Pixeldybde = antall bit pr pixel • F.eks. en skjerm med oppløsning 1280x1024 og pixeldybde 24, krever 3.75 MB RAM Pixeldybde Skjermoppløsning INF2340 / V05
8 bit 8 bit 8 bit 8 bit 8 bit 8 bit Blue Video controller Green Red 24 bits fargebuffer • (28)3 = 16,777,216 ulike farger i et enkelt pixel • “ubegrenset” antall ulike pixler (med dagens skjermoppløsning!) INF2340 / V05
8 bit Video controller 8 bits fargebuffer - alternativ 1 2 bit 3 bit 3 bit 8 bit • 28 = 256 ulike farger i et enkelt pixel • 28 = 256 ulike pixler INF2340 / V05
8 bit Video controller 8 bits fargebuffer - alternativ 2 (bedre) 0 Colormap (Lookup Table) 1 255 24 bit 8 bit 24 bit • (28)3 = 16,777,216 ulike farger å velge mellom • 28 = 256 ulike pixler INF2340 / V05
Annen bruk av frame buffer’et Bl.a. • “Dobbeltbuffering” (animasjon etc.) • Z-verdi (skjulte flater) • Alpha-verdi (transparens) Mer om dette senere! INF2340 / V05
Grafiske primitiver • Fundamentale • Punkt (node) • Linje (kant) • Mer komplekse • Polylinje • Polygon INF2340 / V05
Linje og triangel-polygon i VTK vtkActor vtkActor vtkPolyDataMapper vtkPolyDataMapper vtkPolyData vtkLineSource vtkFloatPoints vtkCellArray vtkIdList (x, y, z) ID = 2 (x, y, z) ID = 0 vtkPolyData ID = 1 (x, y, z) INF2340 / V05
Rasterisering • Å avgjøre hvilke pixler som blir dekket av et 3D primitiv (“scan-konvertering”) • Å utføre diverse operasjoner relatert til enkelt-pixler (f.eks. korrekt fargelegging i forhold til belysning) 3D primitiv Projisering Rasterisering 2D primitiv Rasterisert 2D primitiv INF2340 / V05
Aliasing(kap. 7.15 VTK-boka) • Rasteriserte primitiver ser generelt “taggete” ut 5 5 4 4 3 3 2 2 1 1 0 0 0 1 2 3 4 5 6 7 8 9 10 11 0 1 2 3 4 5 6 7 8 9 10 11 Ideelt I praksis INF2340 / V05