Lees dit aandachtig door voordat je aan de opdracht begint.

Save this PDF as:
 WORD  PNG  TXT  JPG

Maat: px
Weergave met pagina beginnen:

Download "Lees dit aandachtig door voordat je aan de opdracht begint."

Transcriptie

1 Aanwijzingen vooraf Lees dit aandachtig door voordat je aan de opdracht begint. Deliverables Bij deze opdracht zul je veel met MATLAB werken. Neem je laptop mee en zorg dat MATLAB geïnstalleerd en werkend is. Ook handig: neem de syllabus Introduction to MATLAB van Elżbieta Pękalska mee. Lever een document in met daarin de uitgewerkte antwoorden van alle genummerde opdrachten. Zet op de eerste pagina van het verslag de namen en studentnummers van alle studenten van je groep. Het document moet via Blackboard worden aangeleverd. Verslagen moeten in PDF formaat worden aangeleverd. Andere formaten wordt niet geaccepteerd. Ongenummerde opdrachten hoef je niet in te leveren. Er zijn 5 genummerde opdrachten. Schrijf alle MATLAB code in één script (een bestand met extensie.m). Beoordeling Voor iedere opdracht krijg je twee punten. De case wordt met een voldoende beoordeeld als er tenminste 9 punten zijn behaald. Leerdoelen 1. Het kunnen beschrijven van lijnen en vlakken in de ruimte. 2. Het kunnen berekenen van snijpunten van lijnen en vlakken. 3. Het kunnen gebruiken van MATLAB voor visualisatie van lijnen en punten. printed: 10:36,

2 Inleiding Al vele eeuwen hebben tekenaars en schilders nagedacht over methoden om de drie-dimensionale wereld waarin wij leven over te zetten naar het platte vlak. In de tekening hiernaast zie je hoe Albrecht Dürer met een touwtje probeert een punt op de luit te vertalen naar een punt op een vel papier. In dit practicum gaan we hetzelfde doen, maar dan met een beeldscherm in plaats van papier, en we gebruiken wiskunde in plaats van touw. Het idee is om objecten in de ruimte te definiëren als een verzameling punten en lijnen. De punten beelden we af op Figuur 1: perspectivisch tekenen in de 16 e eeuw, Albrecht Dürer (bron: Wikipedia). een plat vlak, en we verbinden deze daarna met lijnen. We gebruiken MATLAB voor de berekeningen en grafische operaties. Hoewel MATLAB standaard ingebouwde functies heeft voor het maken van perspectivische afbeeldingen, gaan we het helemaal zelf programmeren. Daarna gaan we een driedimensioneel beeld maken met zogenaamde anaglyphen. Perspectivische projectie op een scherm Bij een perspectivische projectie gaan we er van uit dat het licht dat vanuit een punt wordt uitgezonden, wordt opgevangen in één enkel punt, dat we het view point zullen noemen. Het view point is de plaats waar zich normaal gesproken een oog of een camera bevindt. Een lichtstraal zal een rechte lijn volgen van de bron (op positie x) naar het view point en daarbij het projectievlak S snijden. Dit snijpunt noemen we de projectie van x op S. Het projectievlak heeft een eigen assenstelsel: de uv-assen. Van de projectie worden vervolgens de uv coördinaten berekend. Deze kun je gebruiken om bijvoorbeeld de positie te bepalen van een pixel op een beeldscherm. We gaan uit van de situatie zoals getoond in college 3, slide 37. Het view point F ligt op de x-as, op afstand f van het yz-vlak. Door de waarde van f te variëren kun je in- of uitzoomen. Als projectie vlak S wordt het yz vlak gekozen. De u-as is dus hetzelfde als de y-as, en de v-as is gelijk aan de z-as. printed: 10:36,

3 z l S v Q = r(t 0 ) = (0, u, v) P = (x, y, z) u y x F = (f, 0, 0) Figuur 2: projectie van x op S Opdracht 1 Stel een lichtstraal vertrekt vanaf het punt P = x = (x, y, z) en komt aan in F = f = (f, 0, 0). (a) Geef een parametrisatie r(t) van l. Gerbuik F als steunvector. (b) Bepaal het snijpunt Q van l en S: bepaal eerst t 0 zodanig dat r(t 0 ) in het yz-vlak ligt, en bereken daarna r(t 0 ). (c) Bereken u en v als functies van x, y, z en f. Als je met MATLAB in een 2D-plot op plaats (u, v) een punt of klein cirkeltje plot, dan heb je de perspectivische projectie van x getekend (zie fig. 2). Opdracht 2 (a) Schrijf een MATLAB functie pproj([x, y, z], f) die de perspectivische projectie berekent van [x, y, z] op het scherm S. De parameter f is de afstand van het view point tot S. (b) Breid de functie pproj zodanig uit dat deze een array van punten projecteert. Dus als points = [x 1 y 1 z 1 ;... ; x n y n z n ], dan is het resultaat van printed: 10:36,

4 pproj[points, f] het array [u 1 v 1 ;... ; u n v n ] waarbij [u k v k ] de projectie is van [x k y k z k ] op het scherm S. Tip: omdat je van tevoren weet hoe groot het array [u 1 v 1 ;... ; u n v n ] gaat worden is het aan te raden om voor dit array ruimte te pre-alloceren. Hoe je dit doet lees je in paragraaf 11.2 van [PEK]. Wireframe plots De figuren die we in dit practicum gaan tekenen zijn zogenaamde wireframes. Dit zijn figuren die zijn samengesteld uit lijnstukken. Om deze met MATLAB te kunnen plotten definiëren we een wireframe met behulp van twee arrays. 1. Het vertex array: een array met de coördinaten van de hoekpunten. 2. Het edge array: een array met paren getallen die aangeven tussen welk tweetal hoekpunten een lijn moet worden getekend. De getallen die we hierbij gebruiken zijn de indices van de punten van het vertex array. Voorbeeld Stel we willen het vierkant met hoekpunten (0, 0), (1, 0), (1, 1) en (0, 1) tekenen. Dan leggen we dit vierkant vast met de volgende twee arrays: 1. Het vertex array: p = [0 0; 1 0; 1 1; 0 1]. 2. Het edge array: e = [1 2; 4 3; 2 3; 1 4]. Het array p heeft vier rijen. Iedere rij [x y] representeert een hoekpunt (x, y). Een andere zienswijze is: het array p heeft twee kolommen. De eerste kolom van p bevat de x-coördinaten van de hoekpunten, en de tweede kolom de y- coördinaten. De getallen in de matrix e zijn geen coördinaten maar indices. Bijvooorbeeld: de tweede rij van e is [4 3], dit geeft aan dat er een lijn moet worden getekend van p(4) naar p(3), dus van (0, 1) naar (1, 1). Het array e heeft vier rijen, dus moet je in totaal vier lijnstukken tekenen. Het eindresultaat is een vierkant: printed: 10:36,

5 y p(4) e(2) p(3) e(4) e(3) p(1) e(1) p(2) x Opdracht 3 (a) Schrijf een MATLAB functie wireframe(p,e) die de lijnen tekent van het wireframe gedefinieerd door vertex array p en edge array e. Aanwijzing: gebruik de MATLAB functie line. (b) Gebruik wireframe om een huisje te tekenen: 2 y 1 x Zorg er voor dat de assen gelijk schaal hebben. Dit doe je met axis equal. De functie axis kun je ook gebruiken om het plotvenster mee vast te leggen. Gebruik axis([xmin xmax ymin ymax]). Het punt linksonder in het venster is (xmin, ymin), en het punt rechtsboven is dan (xmax, ymax). Gebruik grid off als je de rasterlijnen wilt verbergen. Vergeet niet de plot leeg te maken met clf. (c) Voor het tekenen van anaglyphen moeten we de lijnkleur kunnen specificeren. Breid daarom wireframe uit met een derde parameter waarmee je de kleur van de lijnen kunt bepalen. Deze parameter moet optioneel zijn: als hij printed: 10:36,

6 niet aanwezig is wordt de default waarde 'b' (zwart) gekozen. Met andere woorden: wireframe(p,e) wireframe(p,e,col) tekent alle lijnen in de kleur zwart, tekent alle lijnen in de kleur col. y y x x wireframe(p, e) wireframe(p, e, 'r') Aanwijzing: gebruik nargin om de optionele parameter mee te programmeren. Zie [PEK], paragraaf 8.2.1, blz. 53. Wireframes kunnen ook drie-dimensionaal zijn. Dit bijvoorbeeld is het vertex array van een kubus: cube = [0 0 0; 1 0 0; 1 1 0; 0 1 0; 0 0 1; 1 0 1; 1 1 1; 0 1 1] Opdracht Deze opdracht hoef je niet in te leveren Wat is het edge array van de kubus? Door de hoekpunten van de kubus perspectivisch te projecteren maak je van cube, het vertex array van de kubus, een 2 8 matrix, die je vervolgens met wireframe kunt plotten. Merk op dat het edge-array niet hoeft te worden aangepast! Opdracht 4 (a) Combineer wireframe met de functie pproj van opdracht 2 tot de functie wireframe3d(p, e, f, col) waarmee je een driedimensionaal wireframe kunt plotten. Gebruik deze functie om de kubus met vertex array cube te plotten in kleur col. printed: 10:36,

7 (b) Op Blackboard vind je bestanden met daarin de vertex- en edge-arrays van de vijf platonische lichamen. Dit zijn regelmatige veelhoeken, waarvan de zijvlakken bestaan uit gelijke regelmatige veelhoeken. tetraeder kubus octaeder dodecaeder icosaeder Om de data uit deze bestanden te kunnen laden kun je het best gebruik maken van importdata. Stel je wilt de coördinaten van het octaeder laden en toekennen aan de variabele oct_vrts, dan zeg je oct_vrts = importdata('octahedron_vertices.txt', ' ') Het eerste argument is de bestandsnaam, het tweede argument is het gebruikte scheidingsteken. In ons geval is dat een spatie. Anaglyphische projectie Omdat we twee ogen hebben die op enige afstand van elkaar staan, zien onze ogen ruimtelijke objecten op verschillende wijze. Dit verschijnsel heet parallax. Ons brein gebruikt het verschil tussen de beelden om diepte te kunnen bepalen. We kunnen de dieptewerking simuleren met zogenaamde anaglyphen. Dit zijn tweekleurige afbeeldingen, vaak in de combinatie rood/blauw of rood/cyaan. Je bekijkt anaglyphen met het gekleurde brilletje. In figuur 3 zie je de wereldberoemde Bremer stadsmuzikanten. De hond en de haan zijn rood, en de ezel en de kat zijn lichtblauw. Deze kleur heet officieel cyaan. Houd het rode filter voor het linker oog, en het blauwe voor het rechter oog. Dek nu je rechter oog af. Met het linkeroog zie je alleen de ezel en de kat (waarom?). De haan en de hand zijn onzichtbaar. Merk op dat kat en ezel zwart zijn. Dek nu je linker oog af. Nu zie je alleen de haan en de hond. Misschien heb je het niet opgemerkt, maar de voetjes van de de bovenste drie dieren zijn zwart. Daardoor zijn ze te zien door zowel het rode als het blauwe filter. In figuur 4 zie je een voorbeeld van een rood/cyaan-anaglyph. Als je printed: 10:36,

8 Figuur 3: de Bremer stadsmuzikanten dit plaatje bekijkt met het tweekleurige brilletje ontstaat een kunstmatige wijze parallax en kun je diepte zien. Anaglyphen maak je zelf door een object te projecteren op twee verschillende vlakken, één voor het linker oog en één voor het rechter oog. Je kunt parallax eenvoudig bewerkstelligen door het uv-vlak langs de y-as naar links of rechts te verschuiven. In figuur 5 zie je hoe dit werkt voor het rechter oog. De v-as is over een afstand h naar rechts verschoven. De u-as verandert niet: die blijft steeds gelijk aan de y-as. Je kunt nu de hele berekening opnieuw doen, maar het kan slimmer: in plaats van de v-as naar rechts te verplaatsen, verschuif je de tijger over een afstand h naar links. Opdracht 5 (a) Breid pproj uit met een optionele derde parameter h waarmee de positie van het scherm in de horizontale richting (langs de y-as) kan worden verschoven over een afstand h. Als h < 0, dan schuift het scherm naar links (of equivalent: de tijger schuift naar rechts). De functieaanroep pproj(x, f, h) projecteert de punten x op een vlak S met centrum (0, h, 0). Voor het toevoegen van een optionele parameter verwijzen we weer naar paragraaf uit [PEK]. (b) Combineer de nieuwe versie van pproj met de functie wireframe3d van opgave 4 om een anaglyphische projectie van cube te maken. printed: 10:36,

9 Figuur 4: anaglyphische projectie van een reeks kubussen De kleuren die in de brillen zijn gebruikt zijn rood (voor het linker-oog) en cyaan (voor het rechter-oog). In MATLAB gebruik je hiervoor 'r' respektievelijk 'c'. Combineer plots met behulp van hold on en hold off. Zie ook paragraaf 4.2 van [PEK]. Verdere verkenning In deze paragraaf beschrijven we enkele uitbreidingen waar je ook aandacht en tijd aan zou kunnen besteden. Dit is facultatief: doe dit alleen als je tijd over hebt en als je het leuk vindt. Je hoeft hiervan niets in te leveren. Projecteer meerdere figuren in één venster. Om te voorkomen dat je de vectoren u, v en n steeds opnieuw moet uitrekenen kun je er voor kiezen twee (of meer) wireframes te combineren tot één nieuw wireframe. Je printed: 10:36,

10 z l S R v Q R P = (x, y, z) u y x h F = (f, h, 0) parallax = 2h Figuur 5: projectie van x op S R kunt een functie schrijven mergewf schrijven die twee wireframes p1,e1 en p2,e2 combineert, met aanroep [p, e] = mergewf(p1, e1, p2, e2) Kun je figuren op een eenvoudige manier verschuiven? Kun je figuren groter of kleiner maken? Bedenk dat simpelweg schalen mogelijk ongewenste neveneffecten heeft. Als je in fig. 5 simpelweg alle coordinaten ven de tijger met 0.5 vermenigvuldigt, komt de tijger ook dichter bij de oorsprong te staan! Probeer de punten van een wireframe met een matrixtransformatie te verplaatsen. Voor transformaties van punten in R 3 heb je wel een 3 3-matrix nodig. Door met homogene coördinaten te werken kun je translaties met een matrixtransformatie beschrijven. Zie [SYL], hoofdstuk 4, blz Evaluatie en discussie De projectietechniek die we in deze case gebruiken, is rechttoe-rechtaan. Zo is er geen aandacht besteed aan de vertekening die je krijgt bij een grote kijkhoek. printed: 10:36,

11 Ruimtewiskunde Perspectivische projectie UNIVERSITEIT TWENTE. Verder zal het je opgevallen zijn dat er vreemde dingen gebeuren als projecties van punten van je object buiten het scherm terechtkomen. Dit soort anomaliën kun je voorkomen door gebruik te maken van clipping, een techniek waarbij je slechts het zichtbare deel van een lijn afbeeldt. Een ander probleem is dat de projecties over elkaar heen worden getekend. De overlappende gedeeltes worden afgeschermd door de tweede plot, en hierdoor onstaan er gaten in het beeld. Dit kan je voorkomen door alle overlappende delen zwart te maken (denk aan de voetjes van de Bremer stadsmuzikanten). Helaas biedt MATLAB geen simpele oplossing om dit te bewerkstelligen. Het overlap-verschijnsel blijkt vooral een probleem te zijn als lijnen evenwijdig zijn aan de y -as. in dat geval vallen hele stukken van een lijn weg. Het is dus raadzaam om lijnen die evenwijdig zijn met de y -as zoveel mogelijk te vermijden. Tenslotte: mogelijk ben je tegen de division by 0 foutmelding aangelopen (wanneer gebeurt dit?) Een mogelijke oplossing is: zorg er voor dat je niet hoeft te delen. Dit doe je door gebruik te maken van homogene coördinaten. In college 7 wordt hierin een summiere inleiding op gegeven. Homogene coördinaten kom je ook tegen als je je verder gaat verdiepen in geavanceerde rendering technieken zoals OpenGL. Het gebruik van 3D vision in de zorg komt steeds meer in de belangstelling, mede door de ontwikkeling van virtual reality en augmented reality technieken. Het grote voordeel van virtual reality boven anaglyphen is dat je de beelden in kleur kunt bekijken. Bij virtual reality ervaar je bovendien een gevoel van onderdompeling ( immersion ) omdat het beeld meebeweegt met de beweging van je hoofd. Het principe is echter hetzelfde als die van het maken van anaglyphen, namelijk: maak voor elk oog een aparte projectie. Figuur 6: Da Vinci Surgical System met Firefly Fluorescence Imaging (bron: printed: 10:36,

12 Referenties [PEK] Elżbieta Pękalska Introduction to MATLAB, Syllabus, TUD ( ). [SYL] M. Boldy, Ruimtewiskunde, Syllabus, Universiteit Twente (2017). [THO] G.B. Thomas, M.D. Weir, J.R. Hass Thomas Calculus, Early transcendentals, Pearson, 12th international edition. Webpagina: boldymc/rw/17-18/case/ printed: 10:36,