2 FRÅN VÄRLD TILL SKÄRM

Relevanta dokument
Transformationer i 3D. Gustav Taxén

ORTONORMERADE BASER I PLAN (2D) OCH RUMMET (3D) ORTONORMERAT KOORDINAT SYSTEM

LINJÄRA AVBILDNINGAR

Veckoblad 1, Linjär algebra IT, VT2010

TANA17 Matematiska beräkningar med Matlab

Geometriska vektorer

October 9, Innehållsregister

Vektorgeometri för gymnasister

Vektorgeometri. En vektor v kan representeras genom pilar från en fotpunkt A till en spets B.

TAIU07 Matematiska beräkningar med Matlab

Vektorgeometri för gymnasister

MATEMATIK GU. LLMA60 MATEMATIK FÖR LÄRARE, GYMNASIET Analys, ht Block 5, översikt

Moment 4.2.1, 4.2.2, 4.2.3, Viktiga exempel 4.1, 4.3, 4.4, 4.5, 4.6, 4.13, 4.14 Övningsuppgifter 4.1 a-h, 4.2, 4.3, 4.4, 4.5, 4.

SF1624 Algebra och geometri

Moment 4.11 Viktiga exempel 4.32, 4.33 Övningsuppgifter Ö4.18-Ö4.22, Ö4.30-Ö4.34. Planet Ett plan i rummet är bestämt då

Mer om geometriska transformationer

Linjer och plan (lösningar)

Lösningar till SF1861 Optimeringslära, 28 maj 2012

MULTIPLIKATION AV MATRISER, BASER I RUMMET SAMT FÖRSTA MÖTET MED MATRISINVERSER = = =

z = 4 + 3t P R = (5 + 2t, 4 + 2t, 4 + 3t) (1, 1, 3) = (4 + 2t, 3 + 2t, 1 + 3t)

KOKBOKEN 1. Håkan Strömberg KTH STH

Föreläsning 13 Linjär Algebra och Geometri I

SF1624 Algebra och geometri Tentamen med lösningsförslag onsdag, 11 januari 2017

1 Vektorer i koordinatsystem

Vektorgeometri för gymnasister

Vektorgeometri för gymnasister

Vektorgeometri för gymnasister

Del A. Lösningsförslag, Tentamen 1, SF1663, CFATE,

(d) Mängden av alla x som uppfyller x = s u + t v + (1, 0, 0), där s, t R. (e) Mängden av alla x som uppfyller x = s u där s är ickenegativ, s 0.


Matematik för sjöingenjörsprogrammet

Transformationer i R 2 och R 3

===================================================

1 som går genom punkten (1, 3) och är parallell med vektorn.

1 Grundläggande kalkyler med vektorer och matriser

kan vi uttrycka med a, b och c. Avsnitt 2, Vektorer SA + AB = SB AB = SB SA = b a, Vi ritar först en figur av hur pyramiden måste se ut.

Geometriska transformationer

Chalmers tekniska högskola Datum: kl Telefonvakt: Linnea Hietala MVE480 Linjär algebra S

LYCKA TILL! kl 8 13

.I Minkowskis gitterpunktssats

SKRIVNING I VEKTORGEOMETRI

A = (3 p) (b) Bestäm alla lösningar till Ax = [ 5 3 ] T.. (3 p)

UPPSALA UNIVERSITET Matematiska institutionen Styf. Exempeltenta med lösningar Programmen EI, IT, K, X Linjär algebra juni 2004

Kvalificeringstävling den 30 september 2008

Räta linjer i 3D-rummet: Låt L vara den räta linjen genom som är parallell med

Moment 5.5 Övningsuppgifter I 5.60a. 5.60b, 5.60.c, 61

1. Inledning. x y z. u = xe 1 + ye 2 + ze 3 = e

Linjära avbildningar. Låt R n vara mängden av alla vektorer med n komponenter, d.v.s. x 1 x 2. x = R n = x n

Övningar. MATEMATISKA INSTITUTIONEN STOCKHOLMS UNIVERSITET Avd. Matematik. Linjär algebra 2. Senast korrigerad:

Modul 1: Komplexa tal och Polynomekvationer

Detta cosinusvärde för vinklar i [0, π] motsvarar α = π 4.

SF1624 Algebra och geometri Lösningsförslag till tentamen DEL A

SF1624 Algebra och geometri Lösningsförslag till tentamen Lördagen den 5 juni, 2010 DEL A

Matematik med datalogi, mfl. Linjär algebra ma014a ATM-Matematik Mikael Forsberg

Moment 4.2.1, 4.2.2, 4.2.3, Viktiga exempel 4.4, 4.5, 4.6, 4.7, 4.13 Handräkning 4.1, 4.2, 4.3, 4.4, 4.5, 4.7 Datorräkning 1-9 i detta dokument

e 3 e 2 e 1 Kapitel 3 Vektorer i planet och i rummet precis ett sätt skrivas v = x 1 e 1 + x 2 e 2

SF1624 Algebra och geometri Lösningsförslag till tentamen DEL A

5 Linjär algebra. 5.1 Addition av matriser 5 LINJÄR ALGEBRA

MA2004 Tillämpad Matematik II, 7.5hp,

Linjär Algebra, Föreläsning 2

SF1624 Algebra och geometri Lösningsförslag till tentamen DEL A

SF1624 Algebra och geometri Lösningsförsag till modelltentamen

Moment Viktiga exempel Övningsuppgifter

Övningar. c) Om någon vektor i R n kan skrivas som linjär kombination av v 1,..., v m på precis ett sätt så. m = n.

ax + y + 4z = a x + y + (a 1)z = 1. 2x + 2y + az = 2 Ange dessutom samtliga lösningar då det finns oändligt många.

1. (Dugga 1.1) (a) Bestäm v (3v 2u) om v = . (1p) and u =

Tentamen 1 i Matematik 1, HF okt 2018, Skrivtid: 14:00-18:00 Examinator: Armin Halilovic

Lösningar till utvalda uppgifter i kapitel 1

Mer om analytisk geometri

Avsnitt 6, Egenvärden och egenvektorer. Redan första produktelementet avslöjar att matrisen inte är en ortogonal matris. En matris 1 0.

M0043M Integralkalkyl och Linjär Algebra, H14,

TANA17 Matematiska beräkningar med MATLAB för M, DPU. Fredrik Berntsson, Linköpings Universitet. 9 november 2015 Sida 1 / 28

Uppsala Universitet Matematiska Institutionen Bo Styf. Sammanfattning av föreläsningarna

. b. x + 2 y 3 z = 1 3 x y + 2 z = a x 5 y + 8 z = 1 lösning?

Kompendium om. Mats Neymark

Determinant Vi förekommer bokens avsnitt, som handlar om determinanter eftersom de kommer att användas i detta avsnitt. a 11 a 12 a 21 a 22

SF1624 Algebra och geometri Lösningsförslag till tentamen DEL A

Explorativ övning Vektorer

Lösningsförslag till problem 1

Analys o Linjär algebra. Lektion 7.. p.1/65

DEL I. Matematiska Institutionen KTH. Lösning till tentamensskrivning på kursen Linjär algebra II, SF1604 för D, den 5 juni 2010 kl

För ingenjörs- och distansstudenter Linjär Algebra ma014a ATM-Matematik Mikael Forsberg

Veckoblad 3, Linjär algebra IT, VT2010

. (2p) 2x + 2y + z = 4 y + 2z = 2 4x + 3y = 6

14. Minsta kvadratmetoden

Vektorgeometri för gymnasister

ax + y + 2z = 3 ay = b 3 (b 3) z = 0 har (a) entydig lösning, (b) oändligt många lösningar och (c) ingen lösning.

SKRIVNING I VEKTORGEOMETRI

vilket är intervallet (0, ).

Matematiska Institutionen KTH. Lösning till tentamensskrivning på kursen Linjär algebra II, SF1604, den 9 juni 2011 kl

2+t = 4+s t = 2+s 2 t = s

Uppsala Universitet Matematiska Institutionen Thomas Erlandsson

Frågorna 1 till 6 ska svaras med ett kryss för varje korrekt påstående. Varje uppgift ger 1 poäng. Använd bifogat formulär för dessa 6 frågor.

TENTAMEN. Matematik 1 Kurskod HF1903 Skrivtid 13:15-17:15 Onsdagen 25 september 2013 Tentamen består av 3 sidor

Där a = (1, 2,0), b = (1, 1,2) och c = (0,3, 1) Problem 10. Vilket är det enda värdet hos x för vilket det finns a och b så att

P Q = ( 2, 1, 1), P R = (0, 1, 0) och QR = (2, 2, 1). arean = 1 2 P Q P R

Vektorgeometri för gymnasister

17. Övningar ÖVNINGAR Låt F och G vara avbildningar på rummet, som i basen e = {e 1,e 2,e 3 } ges av. x 1 x 2 2x 2 + 3x 3 2x 1 x 3

SF1624 Algebra och geometri Lösningsförslag till modelltentamen DEL A

Linjär Algebra, Föreläsning 2

Transkript:

Översikt FRÅN VÄRL TILL SKÄRM Magnus Bondesson 2--2, 2--8, 22--22, 22-3-7 et här pappret handlar om hur koordinaterna för ett objekt i en tredimensionell värld översätts till koordinater i ett tvådimensionellt plan, tpiskt en datorskärm. Mera påtagligt gäller det att bestämma vilken bildpunkt som motsvarar en tredimensionell punkt. Vi använder grundläggande linjär algebra, vilket inte hindrar att det kan kännas tungt. Trösta dig med att grafikprocessorn får jobba med sådant här för varje punkt som du anger! Många koordinatsstem är inblandade. Schematiskt: v x v zv Alla snliga punkter hamnar i enhetskuben... i fönstret 2 Bte av koordinatsstem, speciellt från världskoordinatsstemet till vkoordinatsstemet Vi har två rätvinkliga koordinatsstem, xz-sstemet respektive x''z'-sstemet. Skalningen tänkes vara densamma i bägge. En punkt P(x,,z) * (jag skriver * i betdelsen transponat ibland för att få kolumnvektorer på litet utrmme) har koordinater givna i det första sstemet. Vi vill ha reda på koordinaterna (x',',z') * för P i det andra. I den vanligaste datorgrafiska tillämpningen är världskoordinatsstemet det första och vkoordinatsstemet det andra. Följande figur illustrerar i 2 det problem som här formulerats för 3. e 2 ' e 2 P P-P P(x',',z') * e x' x w x v Modellkoordinater Världskoordinater Vkoordinater Projektionskoordinater Skärmkoordinater Figur : Övergång från ett koordinatsstem till ett annat. e x Världskoordinatsstemet (world coordinate sstem) är det sstem i vilket objekten befinner sig. Observatören betraktar objekten från en viss punkt (ögats position) och med en viss snriktning och inför härvid ett ntt koordinatsstem, vkoordinatsstemet (viewing coordinate sstem) eller ögonkoordinatsstemet med z-axeln i snriktningen och med origo vid ögat. Vid perspektivprojektion tänker man sig ett projektionsplan på avståndet framför ögat. För enkelhets skull tänker vi oss tills vidare att alla objekten ligger framför det planet. Vkordinatsstemet är i vissa sstem ett vänstersstem (med positiva z-axeln i snriktningen), i andra ett högerkoordinatsstem (med positiva z-axeln i andra riktningen). I OpenGL har vi ett högerkoordinatsstem, dvs vkoordinatsstemets z-axel är motriktad snriktningen. Vi tittar alltså i negativ z-led. Vi förutsätter genomgående i fortsättningen att det är så. Modellkoordinatsstemet är det sstem i vilket vi tillverkar modeller för objekten. T ex en grundmodell för ett hus som sedan skalas och roteras innan det med translation placeras i världen. I enklare fall kan vi bortse från detta sstem. Vi betecknar världskoordinater ibland med index w (som i world), vkordinater med index v och projektionskoordinater med index p. Övergången från modellkordinatsstem till världskoordinatsstem görs på ett uppenbart sätt med de grundläggande transformationerna skalning, translation och rotation och berörs inte vidare här. I ett 3-sstem behöver vi inte alls tänka på detaljerna i transformationerna. et är självklart som det skall vara. Men det är olckligt pedagogiskt sett, eftersom man bör ha mer än ett hum om dem. et finns flera sätt att ta fram övergången.. Böckerna e flesta läroböcker i datorgrafik för ett resonemang som går ut på upprepade rotationer. Omständligt formelmässigt, men inte tankemässigt. Vi tar oss fram på något av följande två andra sätt. 2. Så här kan vi göra i stället Låt e i och e' i vara enhetsvektorerna längs axlarna, dvs vektorer med längden och låt P [x,, z ] * vara det na koordinatsstemets origo uttrckt i det ursprungliga. Vi förutsätter att de na enhetsvektorerna är kända i xz-sstemet, t ex e' i [a i, b i, c i ] T, i,2,3. För de ursprungliga gäller ju e [,,] * osv. Uppfatta punkterna P och P som vektorer. Nu är ju koordinaterna i x''z'-sstemet projektionerna av vektorn P - P FRÅN VÄRL TILL SKÄRM 2 FRÅN VÄRL TILL SKÄRM

på respektive enhetsvektor e' i, dvs Eftersom vektorerna [a i, b i, c i ] * är ortonormala följer att x' (P - P ) e', ' (P - P ) e' 2, z' (P - P ) e' 3 där produkterna är skalärprodukter. Annorlunda uttrckt är t ex M a b c a 2 b 2 c 2 a 3 b 3 c 3 x' (x-x )a + (- )b + (z-z )c Vi får därför följande formel x' ' z' a b c a 2 b 2 c 2 a 3 b 3 c 3 x z P Om vi går över till homogena koordinater, dvs t ex P x z Naturligtvis kan vi här använda s k homogena koordinater för att få det enhetligare skrivsättet a x' b c d a x b c d P' ' a 2 b 2 c 2 d 2 a 2 b 2 c 2 d 2 P z' a 3 b 3 c 3 d z 3 a 3 b 3 c 3 d 3 så kan vi skriva där P' a b c a 2 b 2 c 2 a 3 b 3 c 3 x P z a b c d a 2 b 2 c 2 d 2 P a 3 b 3 c 3 d 3 där talen d i kan räknas ut (görs i nästa avsnitt). 3. Ett måhända ännu enklare sätt, som vi använde 999 och 2 Låt origo för vkoordinatsstemet vara punkten P [x,, z ] * i världskoordinatsstemet. Låt enhetsvektorerna för vkoordinatsstemets axlar vara [a, b, c ] *, [a 2, b 2, c 2 ] * respektive [a 3, b 3, c 3 ] * uttrckta i världskoordinater. essa har längden och är naturligtvis sinsemellan vinkelräta, dvs skalärprodukterna e i e j är Låt oss nu se på en godtcklig punkt betecknad P [x,, z] * i världskoordinatsstemet och P [x,, z ] *T i vkoordinatsstemet. Om vi accepterar resonemanget i punkt, så finns det då en 3x3-matris M sådan att P M(P - P ). a i b i c i a j b j c j, i j, i j d d 2 M P d 3 3 Hur bestämmer vi enhetsvektorerna för vkoordinatsstemet? I förra avsnittet betecknade vi dessa enhetsvektorer med e, e 2 och e 3, eftersom vi studerade ett allmänt bte mellan koordinatsstem. Nu använder vi xˆ v, ŷ v och ẑ v. Enhetsvektorn ẑ v : I de flesta sstem anges ögats position och en punkt mot vilken man tittar. Skillnaden ger oss en vektor som efter normalisering blir den sökta vektorn. Om man vill ha ett högerorienterat vkoordinatsstem (vilket är naturligast) skall vektorn vara motsatt tittriktningen. Enhetsvektorn ŷ v : enna vektor skall vara vinkelrät mot ẑ v. Man brukar ange en uppåtvektor u, som i bästa fall är just sådan, men i allmänhet inte är det. å låter man enhetsvektorn vara den normaliserade vinkelräta komponenten, dvs u ( u ẑ v )ẑ v normaliserad. Välj här P så att P - P [a i, b i, c i ] *, i,2,3. å måste Enhetsvektorn xˆ v : Bildar vi som den vektoriella produkten ŷ v ẑ v. M a b c M a 2 b 2 c 2 M a 3 b 3 c 3 Ett par nttiga erinringar:. Om a (a,a 2,a 3 ) och b är icke-parallella vektorer och vektorn a har längden, dvs är normaliserad, så är vektorn c b - (b a)a vinkelrät mot vektorn a och ligger således i det plan som har a som normalvektor. Skalärprodukten b a är a b +a 2 b 2 +a 3 b 3. FRÅN VÄRL TILL SKÄRM 3 4 FRÅN VÄRL TILL SKÄRM

2. Om a och b är icke-parallella vektorer, så är vektorn (den vektoriella produkten av a och b) c a x b vinkelrät mot både a och b. Vektorn c är riktad som när man vrider en högergängad skruv (kortaste vägen) från a till b. en vektoriella produkten kan i ett högersstem beräknas som "determinanten" (e i ) är enhetsvektorerna I ett vänstersstem får man sätta minustecken framför högerledet. 4 Projektion e e 2 e 3 a a 2 a 3 b b 2 b 3 a 2 b 3 a 3 b 2 a 3 b a b 3 a b 2 a 2 b Huvuduppgiften är att övergå från vkoordinatsstemet till en plan ta. etta görs genom att man låter punkterna i vkoordinatsstemet projiceras på ett plan parallellt med x v v -planet och på avståndet framför origo (observatörens öga). Vid parallellprojektion (ortografisk projektion) görs en ren projektion på x v v -planet (dvs x p x v, p v ). Vid perspektivprojektion sker projektionen längs en linje mellan punkten och origo (ögat). I datorgrafiksammanhang vill man fortfarande oftast ha tillgång till full djupinformation och man låter i sådana fall projektionskoordinatsstemet ha en z-komponent. Observatörens position är origo i vkoordinatsstemet. Observera att matrisen är oberoende av, dvs samma matris kan användas för alla punkter. För att få fram de verkliga projektionskoordinaterna måste vi emellertid dividera med w, dvs den fjärde komponenten i den framräknade vektorn. Vårt mål nu är att hitta ett uttrck för z p som bevarar djupinformationen och som dessutom gör att övergången mellan vkoordinater och projektionskoordinater kan skrivas på formen ovan (med en annan konstant matris). I så fall uppnår vi två viktiga saker:. Hela transformationen från modellkoordinater till projektionskoordinater kan beskrivas med en enda konstant matris. 2. Transformationen avbildar linjer på linjer och plan på plan. etta är en konsekvens av punkt, vilket vi dock inte lägger ned möda på att visa. etta är ett naturligt önskemål och är något som utnttjas i många algoritmer. äremot är det som vi kommer att visa senare inte självklart uppfllt. Ett naturligt val - som bevarar djupinformation - vore z p - (PRELIMINÄR!) men då går det inte att skriva projektionen på matris-vektor-form (med en konstant matris)! I alla riktiga grafiksstem gör man en normalisering som innebär att man ser till att - x p, p och - z p (OpenGL) eller z p (irectx). För detta krävs att man begränsar snfånget till en s k avhuggen snpramid: x v, v v -A x p, p x v, v Projektionsplan (x,,z) v v Θ/2 z p p N z p - z p Figur 2: Perspektivprojektion. Med hjälp av bilden ovan finner man lätt att: x p -x v / p - v / z p - (Ingen bevarad djupinformation!) - Minustecknen kommer sig av att vi tittar i negativ snriktning. Om vi övergår till homogena koordinater, kan vi skriva övergången på matrisform. Sätt w- (>), varigenom (tredje raden är bara en omskrivning av z p - och fjärde raden är just w- ) wx p w p wz p w x v v I OpenGL:s gluperspective anger vi snvinkeln Θ i -led och en snkvot (med vilken snvinkeln i x-led kan räknas ut) samt avstånden N (near)) och F (far) till de båda klipp-planen. Figurens A kan naturligtvis beräknas från Θ: A tan (Θ/2). Vi antar för enkelhets skull att snkvoten är så att snvinkeln och därmed A är samma i x-led. en avhuggna snpramiden kommer att avbildas på den önskade kuben. Vi kan låta t ex det hitre klipp-planet utgöra projektionsplan, dvs N. För att få p i [-,] behöver vi bara dividera det tidigare värdet med halva höjden på det närmsta klipp-planet, dvs AN. Vi får då v p ------------ -------- v AN A och på samma sätt För z skulle vi kunna göra den linjära transformationen 2z + N + F p ---------------------------- N F F x x v p -------- A FRÅN VÄRL TILL SKÄRM 5 6 FRÅN VÄRL TILL SKÄRM

som överför -N och -F i z p - resp z p, men precis som för z p - går det inte att skriva transformationen på matris-form. I stället gör vi den olinjära transformationen (formen kan motiveras på olika sätt; ett pragmatiskt sätt är att vi vill ha division med precis som för x v och v ) z p 2--- z z N v + N v + --- + 2N F -------------- ------------------------------------- N --- N F z v --- F en första termen i mellanledet transformerar z-n till och z-f till 2 och subtraktionen med ser sedan till att intervallet i stället blir [-,]. Med w- som förut kan vi skriva dvs nu klarar vi oss med en konstant matris. Och precis som förut måste vi göra en division per punkt för att få fram de verkliga koordinaterna. Vi utgick ovan från att hitre klipp-planet var projektionsplanet. I själva verket har det dock ingen som helst betdelse för formeln ovan. I många läroböcker behandlar man allmännare snsituationer, vilket bara leder till en litet annorlunda matris. En linje (ett plan) i vkoordinatsstemet blir inte säkert en linje (plan) i det preliminära (det med z p - ) projektionskoordinatsstemet. äremot fortsätter den att vara en linje (plan) i det normaliserade sstemet (vi visar det inte). etta är en fördel eftersom vi vill göra en massa linjära saker i det normaliserade sstemet, t ex interpolera. En annan fördel med det normaliserade sstemet är att klippning sker mot plan som är parallella med koordinatplanen (i OpenGL sker klippningen före divisionen med w, dvs precis före normaliseringen, men formelmässigt blir det nästan samma sak). Vi kan nu komma hela vägen från modellkoordinatsstemet till det normaliserade sstemet med en konstant matris genom att bara på slutet dividera en gång per punkt. en slutliga avbildningen till fönster/skärm-koordinater är trivialt linjär (se avsnitt 6). Övning: Hur ser matrisen vid parallellprojektion med liknande normalisering ut? 5 OpenGL wx p w p wz p w --- A Ā -- F + N 2NF ------------- -------------- F N F N Naturligtvis bör vi belsa teorin ovan genom att se på hur det verkligen är i OpenGL. Vi utnttjar rutinen void CheckMatrix(GLenum M) (från avsnitt 8 i OpenGL-häftet) som tar en parameter som är antingen GL_MOELVIEW_MATRIX eller GL_PROJECTION_MATRIX och skriver ut motsvarande matris, dvs modell-v-matrisen resp projektionsmatrisen, rad för rad. x v v Jag ser till att fönstret är kvadratiskt från början och låter det så förbli (dvs den omständligt skrivna snkvoten i proceduren nedan är, vilket vi ju för enkelhets skull förutsatte vid framtagningen av matriserna). Omskalningsproceduren ser ut så här: void mreshape(int width, int height) {... glmatrixmode(gl_projection); glloadidentit(); gluperspective(2.,((glfloat)width)/((glfloat)height),.,9.); glmatrixmode(gl_moelview); glloadidentit(); glulookat(.,.,.,.,.,-3.,.,.,.); Och omritningsproceduren void displa(void) { glclearcolor(.,.,.,.); glclear(gl_color_buffer_bit GL_EPTH_BUFFER_BIT); CheckMatrix(GL_MOELVIEW_MATRIX); CheckMatrix(GL_PROJECTION_MATRIX); RitaNgt(); glpushmatrix(); glrotatef(45.,.,.,.); CheckMatrix(GL_MOELVIEW_MATRIX); CheckMatrix(GL_PROJECTION_MATRIX); RitaNgt(); glpopmatrix(); glflush(); I omritningsproceduren skriver vi först ut modell-v- och projektionsmatriserna. ärefter ritar vi något (godtckligt vad, så ritproceduren finns inte med). Utskrift av modell-v-matris........... -..... Utskrift av projektionsmatris.57735.....57735.... -.25-2.25.. -.. Modellv-matrisen skall först vara sådan att x- och -värdena inte förändras medan z w - (vkoordinatsstemets origo ligger ju i z w ). etta ger den först utskrivna matrisen. Låt oss även verifiera den utskrivna projektionsmatrisen. Vi har N, F9 och A tan 6 o. Som ger /A.5774 och -(F+N)/(F-N) -/8 -.25 och -2NF/(F-N) -8/8-2.25. Praktik och teori stämmer alltså när det gäller projektionsmatrisen. FRÅN VÄRL TILL SKÄRM 7 8 FRÅN VÄRL TILL SKÄRM

Sedan säger vi att allt som skall ritas skall roteras 45 grader runt z-axeln (i världskoordinatsstemet). Vi skriver återigen ut modell-v- och projektionsmatriserna. Projektionsmatrisen blir identiska, eftersom perspektivet inte ändras, varför vi nu bara tar med den första utskriften. Utskrift av modellv-matris.777 -.777...777.777..... -..... Vi har ju gjort en rotation med 45 grader motsols kring z-axeln, vilket bara påverkar x och. ärmed är även den andra modellvmatrisen som den skall vara enligt teorin. 6 Från reella 2-koordinater till heltaliga Vi har nu transformerat alla snliga punkter till att hamna i en enhetskub i projektionskoordinatsstemet. Återstår att transformera dessa värden (x p, p,z p ) till heltaliga skärmkoordinater (fönsterkoordinater vore kanske numera ett bättre namn). Punkter med olika z p men samma (x p, p ) hamnar i samma bildpunkt. p p - p x p - x p H E I x p G H T Och vi inser omedelbart att transformationerna col trunc(.5with( + x p )) där funktionen trunc tänkes hugga av till närmsta lägre heltal, uträttar det vi vill. Varje bildpunkt motsvarar en liten kvadrat i (x p, p )-planet. Se nästa avsnitt för kodning i C. (,) WITH row HEIGHT trunc(.5height ( + p )) 7 Ett eget 3-sstem et är lätt att med utgångspunkt från våra transformationsmatriser göra ett litet 3-sstem ovanpå ett befintligt 2-sstem. Låt oss utgå ifrån att vi har ett kvadratiskt fönster med en given storlek #define windowwidth 2 #define windowheight 2 där bildpunkterna numreras med ett heltalskoordinatsstem och att vi har en färdig rutin rawline(int x,int,int x,int ) som drar ett streck från bildpunkten (x,) till (x,). Låt datatpen Point3 beskriva en punkt i 3, t ex tpedef struct { double x,, z; Point3; Vi behöver nu tillverka väsentligen 2 procedurer: void rawline3(point3 p, Point3 p) void Camera(Point3 ee, Point3 at, double A, double N, double F) där A, N och F är som i avsnittet om projektion. en första ritar ett streck i 3. en andra placerar kameran etc. Vi tänker oss för enkelhets skull att kamerans kvadratiska snfält skall avbildas på fönstret. Vi behöver också en global variabel (matris) double T[4][4] som innehåller den matris som transformerar från världskoordinater till normaliserade projektionskoordinater. För att rita ett koordinatsstem sett från (2,2,2) i världskoordinatsstemet behöver vi bara anropa Camera(makePoint3(2.,2.,2.), makepoint3(.,.,.), makepoint3(.,.,.),,,); rawline3(makepoint3(,,),makepoint3(,,)); rawline3(makepoint3(,,),makepoint3(,,)); rawline3(makepoint3(,,),makepoint3(,,)); där makepoint3 är en funktion som returnerar ett värde av tpen Point3 motsvarande de tre parametrarna. I det följande krånglar vi inte till det utan skriver "rakt-på-kod" utan att tänka på effektivitet eller generalitet. Proceduren Camera bgger upp matrisen T. e använda funktionerna Normalize och VectorProduct normaliserar en vektor respektive bildar en vektoriell produkt: void Camera(Point3 ee, Point3 at, double A, double N, double F) { Point3 e, e2, e3; double e3_dot_up; double V[4][4], M[4][4]; // Beräkna enhetsvektorn för vkoordinatsstemets z-axel e3.x ee.x - at.x; e3. ee. - at.; e3.z ee.z - at.z; e3 Normalize(e3); e3_dot_up e3.x*up.x+e3.*up.+e3.z*up.z; // Beräkna enhetsvektorn för vkoordinatsstemets -axel e2.x up.x - e3_dot_up*e3.x; e2. up. - e3_dot_up*e3.; e2.z up.z - e3_dot_up*e3.z; e2 Normalize(e2); // Beräkna enhetsvektorn för vkoordinatsstemets x-axel e VectorProduct(e2,e3); // Nu kan vi omedelbart beräkna matrisen M (M-tilde) som beskriver // övergången från världskoordinater till vkoordinater och sedan // matrisen V som beskriver övergången från vkoordinater till // perspektivkoordinater. Slutligen beräknas T VM.... Proceduren rawline3 blir som följer och utnttjar de därpå två följande procedurerna. FRÅN VÄRL TILL SKÄRM 9 FRÅN VÄRL TILL SKÄRM

void rawline3(point3 p, Point3 p) { Point3 p, q; int x,, x, ; toproj(p,&p); toproj(p,&q); toscreen(p,&x,&); toscreen(q,&x,&); rawline(x,,x,); void toscreen(point3 p, int* x, int* ) { // -<p.x,p.< is the relevant portion *x (int) (.5*windowwidth*(p.x + )); // (int) hugger av * windowheight - (int) (.5*windowheight*(p. + )); void toproj(point3 p, Point3* q) { double w; q->xt[][]*p.x+t[][]*p.+t[][2]*p.z+t[][3]; q->t[][]*p.x+t[][]*p.+t[][2]*p.z+t[][3]; q->zt[2][]*p.x+t[2][]*p.+t[2][2]*p.z+t[2][3]; w T[3][]*p.x+T[3][]*p.+T[3][2]*p.z+T[3][3]; q->xq->x/w; q->q->/w; q->zq->z/w; Med den här enkla tekniken kan vi komma att rita sådant som inte skall snas. et enda som skall snas är ju det som rms inom den avhuggna snpramiden, dvs kuben i normaliserade projektionskoordinater, dvs vi måste klippa bort allt som ligger närmre användaren än det hitre klipp-planet, dvs planet z p -. Gör vi inte det kommer de delarna att ritas upp och ner. Klippning av en punkt är lätt, men betdligt mer komplicerad för t ex linjer. Vi måste naturligtvis också förhindra (annars blir det ju division med ). Skall vårt sstem även lösa snlighetsproblemet behöver vi en simulerad djupbuffert med åtminstone en punktritningsprocedur. // epth-buffer part double dbuff[windowheight][windowwidth]; void ClearBuffer() { int i,j; for (i;i<windowheight;i++) { for (j;j<windowwidth;j++) dbuff[i][j]-3.; void rawpoint3(point3 p) { Point3 p; int x, ; toproj(p,&p); toscreen(p,&x,&); if (p.z>dbuff[x][]) { rawpoint(x,); dbuff[x][]p.z; där rawpoint, som ritar i fönsterkoordinater, tänkes finnas färdig Och så här kan vi fortsätta i all oändlighet till dess vi nått det fulländade grafiksstemet! Grafiksstemet som det beskrivits här finns i en X -version Xex3.c i ~graf/emos. Koden är tvärr inte strukturerad så att man lätt bter till t ex Windows. Figuren ovan innehållande tre koordinataxlar och fra olikfärgade kubsidor är ritad med det. 8 Transformation av normaler Vi vet nu att man transformerar punkter från ett modell- eller världskoordinatsstem (koordinater (x w, w,z w )) till ett vkoordinatsstem och vidare till ett normaliserat projektionskoordinatsstem (koordinater (x p, p,z p ) med P v TP w respektive wp p TP w, där T är någon 4x4-matris, som kan ses som sammansatt av matriser för translation, rotation och skalning. Hur är det då med normaler. Behöver vi br oss? Egentligen inte, men om vi vill veta hur OpenGL bär sig åt är frågan befogad. et finns dessutom en - enligt min mening - smart tillämpning av sådan kunskap i samband med snpramidgallring ("rita bara sådana föremål som berör snpramiden"), vilken jag tcker förtjänar ett eget avsnitt 9. Betrakta som inledning planet PLAN i figuren nedan med tillhörande normal N. Låt oss göra en olikformig skalning, som består i att alla -koordinater halveras medan x-koordinaterna bevaras. å övergår planet i det streckade na planet. Transformationen kan beskrivas med matrisen. T.5 Normal N till planet PLAN Äkta normal till na planet Falsk normal till na planet Na planet et givna planet PLAN FRÅN VÄRL TILL SKÄRM 2 FRÅN VÄRL TILL SKÄRM

et ligger möjligen nära till hands att tro att normalen till det na planet fås genom att låter samma transformation verka på N, men resultatet blir då i stället den vektor som i figuren kallas "falsk normal". äremot ser vi att en äkta normal är T - N (i figuren är den något kortare), vilket visar sig vara nästan sant även allmänt. et allmänna resultatet är att om wp TP, så är N (T - ) * N, där * betder transponat (som ju innebär att matriselementet a ij bter plats med a ji ). Här är alla matriser 4x4 och alla vektorer 4x, vilket innebär att N har en fjärde komponent, vars värde strax anges. Vi använder i fortsättningen det bekvämare skrivsättet (a,b) för skalärprodukten a b mellan två vektorer a och b (3-dimensionella eller 4-dimensionella), dvs n ( a, b) a i b i i där n 3 eller n 4. Vi kommer att utnttja att om A är en matris, så är (Aa,b) (a,a * b) och (A * ) - (A - ) *. Låt oss först se på fallet att inga homogena koordinater behövs, dvs att inga translationer är inblandade. å har vektorerna tre komponenter och matriserna är 3x3. Vi utgår från ett plan med känd normal N, som alltså är vinkelrät mot planet. Alla punkter P transformeras enligt TP. Om P och P är punkter på planet gäller alltså (N,P-P ). etta är inget annat än planets ekvation. Jag hävdar nu att N (T * ) - N (T - ) * N är en normal till det transformerade planet. etta följer av att (N,T(P-P )) (T * N,P-P ) (T * (T * ) - N, P-P ) (N, P-P ) Slutligen tittar vi på det allmänna fallet med homogena koordinater, som ju behövs för att klara hela transformationskedjan. Vi har w x' ' z' wp' TP T Normalen N skall nu ha fra komponenter. Vi vill ha en motsvarighet till (N,P-P ) i det tidigare fallet. Om planets ekvation är Ax + B +Cz +, vet vi att (A,B,C) * är en normal och sätter N å är (N,P) för punkter P på planet och med samma tp av resonemang som tidigare får man att det transformerade planet har parametrarna A' B' C' ' A B C x z A N' ( T * ) N ( T * ) B C etta kan alternativt uttrckas på formen Vi har alltså direkta samband inte bara mellan normalerna utan även mellan planen. Omedvetet har vi faktiskt samtidigt visat att ett plan förblir ett plan under de transformationer som är aktuella. Övning: Visa att om punkten P ligger på framsidan av planet definerat av N (samma som att (N,P)>), så ligger TP på framsidan av det transformerade planet (T * ) - N och omvänt. 9 Snpramidgallring A B C T * A' B' C' ' et är ju onödigt att försöka rita sådant som inte kommer att snas. Annorlunda uttrckt är det onödigt att skicka objekt som ligger helt utanför snpramiden till grafikprocessorn. en stora frågan som inte kommer att besvaras här är vilket som går fortast: test eller ritande. Men låt oss i alla fall se hur detta kan gå till (jag påstår inte att sättet här är det praktiskt bästa). Låt oss först tänka oss att objekten är kända i världskoordinatsstemet. et är inte särskilt svårt att givet positionen för betraktaren, betraktningsrikning och snvinklar räkna ut ekvationer för de sex begränsande planen i snpramiden (inklusive hitre och bortre klipp-plan). Om objektet är en sfär med viss radie och med mittpunkten i en viss position, är det sedan bara att räkna ut avståndet mellan mittpunkten och ett av planen. Om punkten ligger på utsidan och avståndet är större än radien, ligger sfären i sin helhet utanför just detta plan. Processen upprepas för övriga plan. Avståndet mellan en punkt P (x,,z) och planet (A,B,C,) ges av F(x,,z) Ax + B +Cz + om A 2 + B 2 + C 2, dvs om den riktiga normalen är normaliserad. Om objektet i stället är en allmän konvex poleder, kan vi kontrollera hörn efter hörn genom att stoppa in i planens ekvationer. Eller också använder vi en omskriven sfär. Men vi arbetar normalt inte med koordinater i världskoordinatsstemet när det gäller de grafiska objekten utan i modellkoordinatsstemet. Visst skulle vi kunna räkna ut världskoordinater, men det är ju ett arbete som vi gärna överlåter på grafikprocessorn. I stället kan vi göra de olika testen i modellkoordinatsstemet om vi uttrcker snpramidens plan i det. Verkar lika illa eftersom i så fall den inverterade modelltransformationen förefaller att behöva användas. Och då kan vi ju lika väl ta steget fullt ut och utgå från snpramiden i projektionskoordinatsstemet. En strålande idé. I projektionskoordinatsstemet känner vi ju de begränsande planen (jfr fig sid 6). Transformationsmatrisen TProj*M (från modellkoordinater till projektionskoordinater) kan vi beräkna genom att FRÅN VÄRL TILL SKÄRM 3 4 FRÅN VÄRL TILL SKÄRM

läsa av dels projektionsmatrisen Proj, dels modell-v-matrisen M på det sätt som beskrivs i avsnitt 8 i OpenGL-häftet (användes även i avsnitt 5 här). ärefter kan vi beräkna planen i modellkoordinatsstemet eller världskoordinater (om vi inte har någon modelltransformation) med Vi har en linje med ändpunkterna P (x,,v ) * och P (x,,v ) * i vkoordinatsstemet men med den tredje axeln i snriktningen (härigenom slipper vi ett tankesteg), dvs v i -z i >. t t 2 t 3 t 4 N T * N' t 2 t 22 t 32 t 42 t 3 t 23 t 33 t 43 N' t 4 t 24 t 34 t 44 et hitre klipp-planet har ekvationen -z - (med utåtriktad normal), dvs (A,B,C,) (,,-,- ). etta tillsammans med sambandet mellan N och N ger kolumnen för Hitre i tabellen nedan. Övriga kolumner fås på motsvarande sätt. N i projektionskoordinater N i modellkoordinater Hitre Bortre Undre Övre Vänster Höger t 3 + t 4 t 32 + t 42 t 33 + t 43 t 34 + t 44 t 3 t 4 t 32 t 42 t 33 t 43 t 34 t 44 t 2 t 4 t 22 t 42 t 23 t 43 t 24 t 44 v v v För en godtcklig punkt (x,,v) på linjen finns det ett tal α, sådant att ( ) + α( ), x x + α( x x ), v v + α( v v ). etta är ju helt enkelt en parameterframställning av linjen. På motsvarande sätt gäller för motsvarande punkt (x,,) på den perspektivprojicerade linjen att det finns ett tal β, sådant att ( 2) ' ' + β( ' ' ), x' x' + β( x' x' ). et är uppenbart att om α så är β och vice versa. Likaledes är α om och endast om β. Om transformation hade varit linjär hade det genomgående gällt att αβ. (P punkt på linjen med ändpunkter P och P, dvs PP +α(p -P ), P MP ger P MP +α(mp -MP )P +α(p -P )). Men nu är den inte det. Vi söker ett samband mellan α och β. Rastrering etta avsnitt blir aktuellt först när vi tittar på texturer. et som är en linje i vår värld fortsätter att vara en linje på vår skärm (eller i skärm+djup). et innebär att vi bara behöver transformera ändpunkterna och sedan kan generera linjen på skärmen. Motsvarande gäller trianglar och polgoner. Men säg att vi har något som varierar linjärt utmed en linje eller över en triangel i den verkliga världen, t ex djup, färg eller en textur (precisare en texturkoordinat). Som framgår av exemplet räcker det inte att linjärinterpolera texturkoordinater om vi vill ha (,) (,) perspektivistiskt korrekt texturering (bilden är korrekt), eftersom objekt skall "krmpa" när avståndet till betraktaren ökar. Vi skall här reda ut hur vi (eller grafikkretsen) måste gå tillväga..(s,t) (,) (,) Bilden är litet missledande eftersom det kan finnas en tterligare transformationer (normalisering och övergång till skärmkoordinater), men dessa är ju linjära (i x och ; vi skalar ju bara x och ). Ekvationen (2) säger att Eftersom (från figuren; likformiga trianglar) får vi ' ' β ----------------- ' ' Om vi här stoppar in uttrcket för från () och räknar på litet, finner man att ' --- -- v -- ---- v v β ---------------- ---- ---- v v β α v ---- v FRÅN VÄRL TILL SKÄRM 5 6 FRÅN VÄRL TILL SKÄRM

vilket väl också borde kunna tas fram med likformighet. Stoppar vi sedan in uttrcket för v från () blir det αv β ------------------------------------ v + α( v v ) eller om vi så vill βv α ----------------------------------- v + β( v v ) Vi kan slutligen skriva ---- β ---- ( 3) + α( ) ----------------------------------- βv v + β( v v ) v + ( ) v v ------------------------------------- ---- β ---- v v v Vi kan här ersätta med vilken annan storhet som helst som varierar linjärt längs linjen. Speciellt med v i stället för fås v ------------------------------------ ---- β ---- v v v Texturkoordinaterna är kända i hörnen. Men vi kan inte beräkna dem i en godtcklig punkt på skärmen med vanlig linjär interpolation. äremot med s ---- β s s ---- ---- t + ---- β t t ---- v ( 4) s v v v ------------------------------------ ---- β ---- t v v ------------------------------------ + ---- ---- β ---- v v v v v v som innebär en flttalsdivision per n bildpunkt och texturkoordinat. Flttalsdivisioner har hittills alltid varit extremt dra i förhållande till andra operationer. Ett trick i den tidiga datorspelsindustrin där man framför allt lade texturer på vertikala väggar och horisontella tak och golv, var att rita väggarna i form av successiva vertikala streck, längs vilka ju v är konstant. Härigenom räcker det med en division per streck eftersom övriga kan ersättas av multiplikationer. Om klippning i 3 Vi skall här beröra några principiella frågor kring klippning, dvs förhindrande av att sådant som inte skall snas ritas. Vi går inte för närvarande in på några effektivitetsresonemang och inte heller på algoritmer. I avancerade grafiska sstem sköts klippningen liksom mcket av en grafisk processor. -Az/ eller -- v ---- β ---- v v v Formeln (3) kan formuleras som v -------- v Az/ där täljare och nämnare var för sig kan framräknas med linjär interpolation med β mellan värdena vid ändpunkterna. Vi får ta till sådana här formler t ex när vi vill ha perspektivistiskt korrekt texturering. Tag t ex följande situation med en kvadrat (,) (,).(s,t) (,) (,) Vi gör först klart för oss vad som skall snas och hur ett par parametrar påverkar vår bild. Figuren ovan visar vkoordinatsstemet med origo där observatören (ögat) befinner sig. På avståndet från ögat finns ett projektionsplan. Föremålen projiceras på detta plan, t ex övergår punkten P i P'. Våra tredimensionella objekt förs på detta vis över till tvådimensionella avbildningar. En del av projektionsplanet avbildas sedan på ett aktuellt rifönster hos en datskärm. Hur stor del av projektionsplanet som tas med bestäms enligt tidigare diskussion av vad vi sätter snvinkeln till. et är uppenbart att ju större A är, desto mindre ter sig ett föremål av en given storlek. Vidare blir intrcket av ett föremål mindre om det avlägsnas från observatören eller om projektionsplanet närmar sig observatören. Allt som finns utanför en pramid (som i figuren visas som en triangel) begränsad av bl a de sneda planen ±Az/, x±az/ med z är osnligt eftersom sådana punkter projiceras utanför den valda delen av projektionsplanet. T ex är hela det högra tjocka strecket snligt, medan bara den undre delen av det vänstra är det. FRÅN VÄRL TILL SKÄRM 7 8 FRÅN VÄRL TILL SKÄRM

Frågan är då vilka åtgärder som behöver vidtas. Vi skall först se att klippning av objekt som finns bakom observatören måste ske. Vi erinrar oss formlerna för perspektivprojektionen, dvs övergången från vkoordinatsstem till perspektivkoordinatsstem. vi får lov att leva med. et finns fall där man låter klippningsplanet sammanfalla med projektionsplanet. etta kan försvaras med att man ser paret observatör/projektionsplanet som en observatör utrustad med en kamera (tubkikare är väl kanske en bättre analogi). x p x v /, p v /, z p preliminära eller definitiva vilka vi tagit fram med det underförstådda antagandet att är större än, vilket naturligtvis inte gäller för punkter bakom observatören. Geometriskt betder dessa formler det som åskådliggörs i nästa figur. En punkt P framför ögat projiceras på projektionsplanets P'. En motsvarande punkt Q bakom ögat men med samma (x v, v ) hamnar på projektionsplanets Q' och kan därför efter projektionen inte skiljas från punkten R:s projektion. Punkter bakom ögat måste således klippas före perspektivprojektionen. Notera även att linjen PQ vid projektion utan klippning skulle brtas ned i två segment, vara det ena sträcker sig från P' till och det andra från Q' till. zv zv Men punkter mellan x-planet och pramiden behöver de klippas? Matematiskt sett behövs det inte. e hamnar ju utanför gränserna i användarkoordinatsstemet och ritas därför inte heller om 2-ritningen fungerar som den skall. Men inte alla grafiksstem sköter sitt jobb korrekt. T ex arbetar X med 6-bitars heltal när det gäller heltalskoordinater och därför uppfattas t ex x66 (65536+464) och x464 som samma tal. etta är lätt att kontrollera med t ex XrawLine(Xdp,window,Xgc,,,2,); XrawLine(Xdp,window,Xgc,65536+,4,65536+2,4); som ger två horisontella linjer under varandra, trots att den ena ligger helt utanför fönstret. Ytterligare ett skäl är effektivitetsmässigt: man vill bli av med punkter som inte skall visas så tidigt som möjligt i transformationskedjan så att man inte behöver räkna så mcket på dem. Nu lägger man oftast inte klippningsplanet vid, utan någonstans mellan det planet och projektionsplanet. Härigenom undviker vi de problem som små -värden skulle ställa till med vid tillämpandet av formlerna ovan (egentligen är det bara en omgivning till origo som är "farlig"). Men klippning med > introducerar ett ntt problem, som illustreras i nästa figur. Nu kan plötsligt delar av föremål framför observatören bli snliga, trots att de egentligen döljs av av andra föremål. När vi i figuren klipper föremål F mot klippningsplanet så blir övre delen av föremål F2 snlig. Problemet blir naturligtvis mera accentuerat ju längre bort klippningsplanet placeras. et är något FRÅN VÄRL TILL SKÄRM 9 2 FRÅN VÄRL TILL SKÄRM