• No results found

2 FRÅN VÄRLD TILL SKÄRM

N/A
N/A
Protected

Academic year: 2022

Share "2 FRÅN VÄRLD TILL SKÄRM"

Copied!
10
0
0

Loading.... (view fulltext now)

Full text

(1)

FRÅN VÄRLD TILL SKÄRM

Magnus Bondesson 2000-01-21, 2001-01-08, 2002-01-22, 2002-03-07

1 Översikt

Dethär papprethandlar

omhur koordinaterna förett

objekti entredimensionell världöv

ersättstill

koordinater i

ett tvådimensionellt

plan, typiskt en datorskärm.

Mera påtagligt gäller det att

bestämmavilk enbildpunkt sommotsv

araren tredimensionellpunkt.

Vi använder grundläggande

linjäralgebra, vilket

intehindrar attdet

kankännas tungt.T

röstadig medatt grafikprocessornfår

jobba med sådant här för varje punkt som du anger!

Många k oordinatsystem är inblandade. Schematiskt:

Världskoordinatsystemet (world

coordinatesystem) ärdet

systemi vilket objektenbefinner

sig.

Observatören betraktarobjekten

frånen visspunkt (ögats position)och

meden visssynriktning och

inför härvid ett nytt koordinatsystem, vykoordinatsystemet

(viewing coordinate

system) eller

ögonkoordinatsystemet medz-ax

elni synriktningenoch

medorigo vidög at.

Vid perspektivpro-

jektiontänk erman sigett projektionsplan påa

vståndetD framförög

at.För enkelhets skulltänk

er

vioss tillsvidare attalla objektenligger

framfördet planet.Vyk

ordinatsystemetär ivissa systemett

vänstersystem(med positiva

z-axeln isynriktningen), iandra

etthögerk oordinatsystem(med

posi-

tiva z-axeln iandra riktningen).I

OpenGLhar viett högerkoordinatsystem,

dvsvyk oordinatsyste-

metsz-ax elär motriktadsynriktningen.

Vi tittaralltså ine gati vz-led.

Vi förutsättergenomgående

i

fortsättningen att det är så.

Modellkoordinatsystemet ärdet

systemi vilket vitillv erkarmodeller förobjekten.

Te xen grund-

modellför etthus somsedan skalasoch

roterasinnan detmed translationplaceras

ivärlden.

Ienk-

lare fall kan vi bortse från detta system.

Vi betecknarvärldsk

oordinateribland medinde

xw (somi world), vykordinater medinde

xv och

projektionskoordinater med inde x p.

Över gångenfrån modellkordinatsystem

tillvärldsk oordinatsystemgörs

påett uppenbartsätt

medde

grundläggande transformationerna skalning, translation och rotation och berörs inte vidare här .

Iett 3D-systembehöv

ervi intealls tänkapå detaljernai

transformationerna.Det ärsjälvklart som

det skall vara. Men det är olyckligt pedagogiskt sett, eftersom man bör ha mer än ett hum om dem.

Modellkoordinater Världsk oordinater Vykoordinater Projektionsk

oordinater Skärmkoordinater

w x v x

v x v z

v y Alla synliga punkter

hamnar i enhets- kuben ....

i fönstret

2 Bytea vk oordinatsystem,speciellt

frånvärldsk oordinatsystemettill

vykoordinatsystemet

Vi hartvå rätvinkliga

koordinatsystem, xyz-systemetrespekti

ve x'y'z'-systemet.Skalningen

tänkes

vara densammai

bägge.En punktP

=(x,y,z) (jagskri *

* ver ibetydelsen transponatibland

föratt få

kolumn vektorer pålitet utrymme)har

koordinater givna

idet förstasystemet.

Vi villha redapå

koordinaterna (x',y',z')

förP * idet andra.I denv anligaste datorgrafiska tillämpningenär

världskoor-

dinatsystemetdet förstaoch vykoordinatsystemet detandra.

Följandefigur illustrerari

2Ddet pro-

blem som här formulerats för 3D.

Figur 1: Öv ergång från ett k oordinatsystem till ett annat.

Det finns flera sätt att ta fram över gången.

1.

Böcker na

Deflesta läroböcker

idator grafikför

ettresonemang somgår

utpå upprepaderotationer

.Omständ-

ligt formelmässigt, men inte tankemässigt. V i tar oss fram på något av följande två andra sätt.

2.

Så här kan vi göra i stället

i Låte oche i' vara enhetsv ektorerna längs axlarna, dvs vektorer med längden 1 och låt

0 P 0 =[x 0 ,y 0 ,z

* ] vara detn yak oordinatsystemetsorigo

uttryckti detursprunglig a.V

iförutsätter att

de nya enhetsv ektorerna är kända i xyz-systemet, t ex

i e' = [a , b i , c i ] i , i=1,2,3. T

För de ursprungliga gäller ju 1 e = [1,0,0]

osv. *

Uppfatta punkternaP

0 ochP somv ektorer.

Nuär juk oordinaternai

x'y'z'-systemetprojektionerna

av v ektorn P - 0 P

x

y 1 e

2 e

1 e’

2 e’

P=(

x',y',z')

*

0 P

0 P-P x'

y'

(2)

på respektiv e enhetsvektor i e' , dvs

x' = (P 0 -P )•

1 e' , y' = (P 0 -P )•

2 e' , z' = (P 0 -P )•

3 e'

där produkterna är skalärprodukter. Annorlunda uttryckt är t e x

x' = (x-x )a 0 + (y-y 1 )b 0 + (z-z 1 )c 0 1

Vi får därför följande formel Naturligtvis kan vi här använda s k homogena k

oordinater för att få det enhetligare skri vsättet

där talen d kan räknas ut (görs i nästa avsnitt). i

3.

Ett måhända ännu enklare sätt, som vi an vände 1999 och 2000

Låtorigo förvyk oordinatsystemetv

arapunkten 0 P

0 =[x 0 ,y 0 ,z

* ] ivärldsk oordinatsystemet.Låt

enhetsvektorerna förvyk

oordinatsystemetsaxlar vara 1 [a 1 ,b 1 ,c

* ] 2 ,[a 2 ,b 2 ,c

* ] respektiv 3 e[a 3 ,b ,

3 c

* ] uttrycktai världskoordinater .Dessa harlängden

1och ärnaturligtvis sinsemellanvink

elräta,

dvs skalärprodukternae

i j e är

Låt oss nu se på en godtycklig punkt betecknadP =[x, y, z]

i världskoordinatsystemet och *

P’=[x’, y’, z’]

i vykoordinatsystemet. *T Om vi accepterar resonemanget i punkt 1, så finns det då en 3x3-matris M sådan att

P’ = M(

P - 0 P ).

Välj härP så attP 0 -P = [a , b i , c i ] i , i = 1,2,3. Då måste *

x' y' z'

1 a

1 b

1 c

2 a

2 b

2 c

3 a

3 b

3 c x y z

0 P

 

 

 

 

=

P' x' y' z' 1

1 a 1 b 1 c 1 d

2 a 2 b 2 c 2 d

3 a 3 b 3 c 3 d

0 0 0 1

x y z 1

1 a 1 b 1 c 1 d

2 a 2 b 2 c 2 d

3 a 3 b 3 c 3 d

0 0 0 1

P = = =

i a

i b

i c

j a

j b

j c

1

i ,

j =

0

i ,

j ≠ 

 =

M

1 a

1 b

1 c 1 0 0

= M

2 a

2 b

2 c 0 1 0

= M

3 a

3 b

3 c 0 0 1

=

4 FRÅNVÄRLD

TILLSKÄRM

Eftersom vektorerna [a , b i

, c i ] i är ortonormala följer att *

Om vi går över till homogena k oordinater, dvs t e

x

så kan vi skriva där

3 Hur bestämmer vi enhetsvektor erna för vyk oordinatsystemet?

Iförra avsnittet betecknadevi

dessaenhetsv ektorermed

1 e’

,e 2oche 3 ’ ,eftersom vistuderade

ett

allmänt byte mellan koordinatsystem. Nu an vänder vi

, och .

Enhetsvektor n :I deflesta systemanges

ögats positionoch

enpunkt motvilk

enman tittar.Skill-

nadenger ossen vektor somefter normaliseringblir

densökta vektorn.

Omman villha etthöger-

orienterat vykoordinatsystem (vilk et är naturligast) skall v

ektorn vara motsatt tittriktningen.

Enhetsvektor n :Denna vektor skallv aravink elrätmot .Man brukarange

enuppåtv ektoru

,

somi bästaf allär justsådan, meni

allmänhetinte ärdet.

Dålåter manenhetsv ektornv

araden nor-

maliserade vinkelräta k omponenten, dvs

normaliserad.

Enhetsvektor n : Bildar vi som den vektoriella produkten

.

Ett par nyttiga erinringar:

1.

Oma = (a ,a 1 ,a 2 ) ochb 3 är icke-parallella v

ektorer och vektorn a har längden 1, dvs är

normaliserad, så är vektorn

c = b - (

b•a)a vinkelrät mot v

ektorna och ligger således i det plan som hara

som normalvektor . Skalär-

produktenb

•a är a b 1 +a 1 b 2 +a 2 b 3 . 3

M

1 a

1 b

1 c

2 a

2 b

2 c

3 a

3 b

3 c

= P x y z 1

=

P'

1 a

1 b

1 c 0

2 a

2 b

2 c 0

3 a

3 b

3 c 0

0 0 0 1

10 0

0 x

01 0

0 y

00 1

0 z

00 0 1

P

1 a

1 b

1 c

1 d

2 a

2 b

2 c

2 d

3 a

3 b

3 c

3 d 0 0 0 1

P = =

1 d

2 d

3 d

0 MP – =

v x ˆ

v y ˆ

v z ˆ

v z ˆ

v y ˆ

v z ˆ

u u

v z ˆ • (

)

v z ˆ

v x ˆ

v y ˆ

v z ˆ ×

(3)

2.

Oma ochb är icke-parallella v ektorer, så är v

ektorn (den vektoriella produkten a va

ochb )

c = a x b

vinkelrät mot både a och

b. V ektornc är riktad som när man vrider en högergäng

ad skruv

(kortaste vägen) från a till

b. Den v ektoriella produkten kan i ett högersystem beräknas som

"determinanten" (e ) är enhetsvektorerna i

I ett vänstersystem får man sätta minustecken framför högerledet.

4 Projektion

Huvuduppgiftenär attöv ergå frånvyk oordinatsystemettill

enplan yta.Detta görsgenom

attman

låter punkterna

i vykoordinatsystemet projiceras

på ett plan parallellt med v x v y -planet och på

avståndet Dframför

origo(observ atörensög

a).V idparallellpr ojektion(ortografisk

projektion)

görsen renprojektion v påx

v y -planet(dvs p x v =x p ,y v =y ).V idperspekti vprojektion

sker projektio-

nenlängs enlinje mellanpunkten

ochorigo (ögat).

Idator grafiksammanhangvill

manfortf arande

oftastha tillgångtill

fulldjupinformation ochman

låteri sådanaf allprojektionsk oordinatsystemet

ha en z-komponent. Observ atörens position är origo i vykoordinatsystemet.

Figur 2: Perspekti vprojektion.

Med hjälp av bilden o van finner man lätt att:

p x = -x D/z v v

p y = -y D/z v v

p z = -D(Ingen be varad djupinformation!)

Minustecknenk ommersig av attvi tittari neg ativ synriktning.Om

viöv ergår tillhomogena koordi-

nater, kanvi skriva över gångenpå matrisform.Sätt

v w=-z (>0),v arigenom(tredje

radenär baraen

omskrivning a p v z

=-D och fjärde raden är just w=-z ) v

1 e 2 e 3 e

1 a 2 a 3 a

1 b 2 b 3 b

2 a 3 b 3 a

2 b

3 a 1 b 1 a

3 b

1 a 2 b 2 a

1 b

=

v z

v x v ,y (x,y,z)

v v y

p y D v -z

Projektionsplan

p wx

p wy

p wz w

D 0 0 0

0 D 0 0

0 0 D 0

0 0 1 – 0

v x

v y

v z 1

=

Observera attmatrisen äroberoende

av v z ,dvs sammamatris

kanan vändasför allapunkter .För att

fåfram dev erkliga projektionskoordinaterna

måstevi emellertiddi

videramed w, dvsden fjärde

komponenten iden

framräknadev ektorn.Vårt målnu äratt hittaett uttryckför

p z sombe varar djup-

informationenoch somdessutom göratt

över gångenmellan vykoordinater

ochprojektionsk oordi-

naterkan skrivas påformen ov an(med enannan konstant matris).I

såf alluppnår vitvå viktiga

saker:

1.

Hela transformationen från modellkoordinater till projektionsk oordinater kan beskrivas

med en enda konstant matris.

2.

Transformationen a vbildar linjer på linjer och plan på plan. Detta är en konsekv

ens av

punkt 1, vilket vi dock inte lägger ned möda på att visa. Detta är ett naturligt önsk emål

och är något som utnyttjas i mång a algoritmer. Däremot är det som vi k

ommer att visa

senare inte självklart uppfyllt.

Ett naturligt val - som be varar djupinformation - v

ore

p z = -z (PRELIMINÄR!) v

men då går det inte att skriva projektionen på matris-v ektor-form (med en k

onstant matris)!

Ialla riktiga grafiksystemgör

manen normaliseringsom

innebäratt manser tillatt

≤ -1 p x p ,y

≤ 1

och-1

p z

≤ 1(OpenGL) eller0

p z

≤ 1(DirectX).

Fördetta krävsatt

manbe gränsarsynfånget till

en s k avhuggen synp yramid:

IOpenGL:s gluPer

spectiveanger visyn vinkeln Θ iy-led ochen synkvot (medvilk ensyn vinkeln i

x-ledkan räknasut)

samta vståndenN

(near))och F(f ar)till debåda klipp-planen.Figurens

Akan

naturligtvisberäknas Θ:A från

(Θ/2).V =tan iantar förenk elhetsskull attsynkv otenär

1så attsyn-

vinkeln ochdärmed Aär

sammai x-led.Den avhuggna synpyramiden

kommer atta vbildaspå den

önskade kuben.

Vi kanlåta te xdet hitreklipp-planet utgöraprojektionsplan,

dvsD=N.

Föratt p fåy i[-1,1]

behöver

vibara dividera dettidig arevärdet medhalv

ahöjden pådet närmstaklipp-planet,

dvsAN.

Vifår då

och på samma sätt För z skulle vi kunna göra den linjära transformationen

v z

v x v ,y N F

Θ/2

v y v =-Az

p x p ,y p z

p z

=-1 p z

=1

p y

v y D

AN

v z - ---- - ----

- -- –

v y

v Az - ----

- -- – = =

p x

v x

v Az - ----

- -- – =

p z

v 2z N

F + +

N

F

- ---- - ---- - ---- - ---- - ----

- --- =

(4)

somöv erförz

=-Noch v v z

=-Fi p z

=-1resp p z

=1,men precissom

p förz v =-z gårdet inteatt skriva

transformationen på matris-form.

Istället görvi

denolinjära transformationen

(formenkan motiv eraspå olikasätt;

ettpragmatiskt

sätt är att vi vill ha division med z precis som för x v

och y v ) v

Denförsta termeni

mellanledettransformerar z=-Ntill

0och z=-Ftill 2och subtraktionenmed

1

ser sedan till att intervallet i stället blir [-1,1].

Med w=-z som förut kan vi skriva v

dvsnu klararvi ossmed enk onstantmatris.

Ochprecis somförut

måstevi göraen division per

punktför attfå framde verklig ak oordinaterna.V

iutgick ov anfrån atthitre klipp-planetv

arprojek-

tionsplanet.I själva verk ethar detdock ingensom

helstbetydelse förformeln

ov an.I många läro-

böcker behandlar man allmännare synsituationer , vilket bara leder till en litet annorlunda matris.

Enlinje (ettplan) ivyk oordinatsystemetblir

intesäk erten linje(plan) idet preliminära(det

med

p z v =-z )projektionsk oordinatsystemet.Däremot

fortsätterden attv araen linje(plan) idet normali-

seradesystemet (vivisar

detinte).

Dettaär enfördel eftersomvi

villgöra enmassa linjärasak

eri

detnormaliserade systemet,t

ex interpolera.En

annanfördel meddet

normaliseradesystemet äratt

klippningsk ermot plansom ärparallella medk

oordinatplanen(i OpenGLsk

erklippningen före

divisionen med w , dvs precis före normaliseringen, men formelmässigt blir det nästan samma sak).

Vi kannu komma helavägen

frånmodellk oordinatsystemettill

detnormaliserade systemetmed

en

konstant matrisgenom

attbara påslutet dividera engång perpunkt.

Denslutlig aa vbildningentill

fönster/skärm-koordinater är tri vialt linjär (se avsnitt 6).

Övning: Hur ser matrisen vid parallellprojektion med liknande normalisering ut?

5 OpenGL

Naturligtvisbör vibelysa teorino

van genomatt sepå hurdet verkligen äri

OpenGL.V iutn yttjar

rutinen void CheckMatrix(GLenum

(fråna M) vsnitt8 iOpenGL-häftet) somtar

enparameter

som är antingen GL_MODELVIEW_MATRIX

eller GL_PROJECTION_MATRIX

och skriv er ut

motsvarande matris, dvs modell-vy-matrisen resp projektionsmatrisen, rad för rad.

p z 1 2

v z - ---

v z

N +

N 1

F - --- –

- ---- - ---- - ----

1 –

v z N 1

F - --- + 

 

2N +

v z N 1

F - --- – 

 

- ---- - ---- - ---- - ---- - ---- - ---- - ----

- -- = =

p wx

p wy

p wz w

1 A - -- 0 0 0

1 0 A - -- 0 0

0 F 0

N +

F

N

- ---- - ----

- --- –

2N

F

F

N

- ---- - ---- - ---

0 0 1 – 0

v x

v y

v z 1

=

8 FRÅNVÄRLD

TILLSKÄRM

Jagser tillatt fönstretär

kvadratiskt frånbörjan

ochlåter detså förbli(dvs denomständligt skrivna

synkvoten iproceduren nedanär

1,vilk etvi juför enkelhets skullförutsatte

vidframtagningen av

matriserna). Omskalningsproceduren ser ut så här:

void myReshape(int width, int height)

{ ...

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

gluPerspective(120.0,((GLfloat)width)/((GLfloat)height),1.0,9.0);

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

gluLookAt(0.0,0.0,1.0, 0.0,0.0,-3.0, 0.0,1.0,0.0);

} Och omritningsproceduren

void display(void)

{ glClearColor(1.0,1.0,1.0,1.0);

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

CheckMatrix(GL_MODELVIEW_MATRIX);

CheckMatrix(GL_PROJECTION_MATRIX);

RitaNgt();

glPushMatrix();

glRotatef(45.0,0.0,0.0,1.0);

CheckMatrix(GL_MODELVIEW_MATRIX);

CheckMatrix(GL_PROJECTION_MATRIX);

RitaNgt();

glPopMatrix();

glFlush();

} Iomritningsproceduren skriv

ervi förstut modell-vy-och

projektionsmatriserna.Därefter ritarvi

något (godtyckligt vad, så ritproceduren finns inte med).

Utskrift av modell-vy-matris 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 -1.000000 0.000000 0.000000 0.000000 1.000000 Utskrift av projektionsmatris 0.577350 0.000000 0.000000 0.000000 0.000000 0.577350 0.000000 0.000000 0.000000 0.000000 -1.250000 -2.250000 0.000000 0.000000 -1.000000 0.000000

Modellvy-matrisenskall förstv

arasådan attx- ochy-värdena inteförändras

medanz

=z v -1 w

(vykoordinatsystemets origo ligger ju i z = 1). Detta ger den först utskrivna matrisen. w

Låtoss även verifiera denutskri

vnaprojektionsmatrisen.

Vi harN=1, F=9och A=

tan60 .Som o ger

1/A=0.5774och -(F+N)/(F-N)=

-10/8=

-1.25och -2NF/(F-N)=

-18/8=

-2.25.Praktik ochteori

stämmer alltså när det gäller projektionsmatrisen.

(5)

Sedansäger viatt alltsom skallritas skallroteras 45grader

runtz-ax eln(i världskoordinatsyste-

met).V iskri ver återigenut

modell-vy-och projektionsmatriserna.Projektionsmatrisen

bliriden-

tiska, eftersom perspektiv et inte ändras, varför vi nu bara tar med den första utskriften.

Utskrift av modellvy-matris 0.707107 -0.707107 0.000000 0.000000 0.707107 0.707107 0.000000 0.000000 0.000000 0.000000 1.000000 -1.000000 0.000000 0.000000 0.000000 1.000000

Vi harju gjorten rotationmed

45grader motsolskring

z-axeln, vilket barapåv erkarx ochy .Där-

med är även den andra modellvymatrisen som den skall v ara enligt teorin.

6 Från reella 2D-k oordinater till heltaliga

Vi harnu transformeratalla

synliga punktertill atthamna ien enhetskubi

projektionskoordinatsys-

temet.Återstår atttransformera

dessavärden p (x

p ,y p ,z )till heltaliga

skärmkoordinater (fönsterkoor-

dinaterv orekansk enumera ettbättre

namn).Punkter medolika

p z mensamma p (x

p ,y )hamnar i

samma bildpunkt. Och vi inser omedelbart att transformationerna

därfunktionen trunctänk

eshugg aa vtill närmstalägre

heltal,uträttar detvi

vill.V arjebildpunkt

motsvarar en liten kv adrat i (x

,y p )-planet. Se nästa avsnitt för k p odning i C.

p x

p y

p x

=-1 x

=1 p

p y

=1 p y

=-1

(0,0) WIDTH

H E I G H T

co l tr un c 0.5W ID TH 1

p x + (

) (

) =

ro w HE IG HT tr un c0.5 HE IG HT 1

p y + (

) (

) – =

7 Ett eget 3D-system

Detär lättatt medutgångspunkt frånvåra

transformationsmatrisergöra ettlitet 3D-systemo

vanpå

ett befintligt 2D-system. Låt oss utgå ifrån att vi har ett kvadratiskt fönster med en gi ven storlek

#define windowwidth 200

#define windowheight 200 där bildpunkterna numreras med ett heltalskoordinatsystem och att vi har en färdig rutin DrawLine(int x0,int y0,int x1,int y1)

som drar ett streck från bildpunkten (x0,y0) till (x1,y1).

Låt datatypenP oint3D beskri va en punkt i 3D, t e x

typedef struct { double x, y, z; } Point3D;

Vi behöv er nu tillverka väsentligen 2 procedurer:

void DrawLine3D(Point3D p0, Point3D p1) void Camera(Point3D eye, Point3D at, double A, double N, double F)

därA, Noch Fär somi avsnittet omprojektion.

Denförsta ritarett

strecki 3D.Den andraplacerar

kameranetc.

Vi tänker ossför enkelhets skullatt

kameranskv adratiskasynfält

skalla vbildaspå

fönstret. Vi behöv er också en global variabel (matris)

double T[4][4]

sominnehåller denmatris

somtransformerar frånvärldsk

oordinatertill nor-

maliserade projektionskoordinater .

För att rita ett koordinatsystem sett från (2,2,2) i världsk oordinatsystemet behöver vi bara anropa

Camera(makePoint3D(2.0,2.0,2.0), makePoint3D(0.0,0.0,0.0),

makePoint3D(0.0,1.0,0.0), 1,1,10);

DrawLine3D(makePoint3D(0,0,0),makePoint3D(1,0,0));

DrawLine3D(makePoint3D(0,0,0),makePoint3D(0,1,0));

DrawLine3D(makePoint3D(0,0,0),makePoint3D(0,0,1));

därmak ePoint3D ären funktionsom

returnerarett värdea vtypen Point3D motsvarande

detre para-

metrarna.I detföljande krånglarvi

intetill detutan skriv er"rakt-på-k od"utan

atttänka påef fektivi-

tet eller generalitet.

Proceduren Camera bygger upp matrisen T.

De använda funktionerna

Normalize och V ectorPr oduct normaliserar en v

ektor respektiv e bildar en vektoriell produkt:

void Camera(Point3D eye, Point3D at, double A, double N, double F) {

Point3D e1, e2, e3;

double e3_dot_up;

double V[4][4], M[4][4];

// Beräkna enhetsvektorn för vykoordinatsystemets z-axel e3.x = eye.x - at.x; e3.y = eye.y - at.y; e3.z = eye.z - at.z;

e3 = Normalize(e3);

e3_dot_up = e3.x*up.x+e3.y*up.y+e3.z*up.z;

// Beräkna enhetsvektorn för vykoordinatsystemets y-axel e2.x = up.x - e3_dot_up*e3.x; e2.y = up.y - e3_dot_up*e3.y;

e2.z = up.z - e3_dot_up*e3.z; e2 = Normalize(e2);

// Beräkna enhetsvektorn för vykoordinatsystemets x-axel

e1 = VectorProduct(e2,e3);

// Nu kan vi omedelbart beräkna matrisen M (M-tilde) som beskriver // övergången från världskoordinater till vykoordinater och sedan // matrisen V som beskriver övergången från vykoordinater till

// perspektivkoordinater. Slutligen beräknas T = VM.

...

} ProcedurenDr awLine3D blir som följer och utn

yttjar de därpå två följande procedurerna.

(6)

void DrawLine3D(Point3D p0, Point3D p1) { Point3D p, q; int x0, y0, x1, y1; toProj(p0,&p); toProj(p1,&q); toScreen(p,&x0,&y0); toScreen(q,&x1,&y1);

DrawLine(x0,y0,x1,y1);

} void toScreen(Point3D p, int* x, int* y) {

// -1<p.x,p.y<1 is the relevant portion

*x = (int) (0.5*windowwidth*(p.x + 1)); // (int) hugger av

*y = windowheight - (int) (0.5*windowheight*(p.y + 1));

} void toProj(Point3D p, Point3D* q) {

double w;

q->x=T[0][0]*p.x+T[0][1]*p.y+T[0][2]*p.z+T[0][3]; q->y=T[1][0]*p.x+T[1][1]*p.y+T[1][2]*p.z+T[1][3]; q->z=T[2][0]*p.x+T[2][1]*p.y+T[2][2]*p.z+T[2][3]; w = T[3][0]*p.x+T[3][1]*p.y+T[3][2]*p.z+T[3][3];

q->x=q->x/w; q->y=q->y/w; q->z=q->z/w;

} Medden härenkla tekniken

kanvi komma attrita sådantsom

inteskall synas.Det

endasom skall

synasär judet somryms inomden

avhuggna synpyramiden,

dvskuben inormaliserade projektions-

koordinater ,dvs

vimåste klippabort

alltsom liggernärmre

användaren ändet

hitreklipp-planet,

dvsplanet p z

=-1.Gör viinte detk ommerde delarnaatt

ritasupp ochner .Klippning av

enpunkt är

lätt,men betydligtmer

komplicerad fört

ex linjer.

Vi måstenaturligtvis ocksåförhindra

v z

=0

(annars blir det ju division med 0).

Skallvårt systemäv

enlösa synlighetsproblemetbehöv

ervi ensimulerad djupbuf

fertmed åtmins-

tone en punktritningsprocedur. // Depth-buffer part double dbuff[windowheight][windowwidth];

void ClearBuffer() { int i,j; for (i=0;i<windowheight;i++) {

for (j=0;j<windowwidth;j++) dbuff[i][j]=-30.0;

} } void DrawPoint3D(Point3D p0) {

Point3D p; int x0, y0; toProj(p0,&p); toScreen(p,&x0,&y0); if (p.z>dbuff[x0][y0]) { DrawPoint(x0,y0); dbuff[x0][y0]=p.z;

} } därDr awPoint , som ritar i fönsterkoordinater

, tänkes finnas färdig

12 FRÅNVÄRLD

TILLSKÄRM

Ochså härkan vifortsätta iall oändlighettill

dessvi nåttdet fulländadegrafiksystemet!

Grafiksys-

temetsom detbeskri vitshär finnsi enX -version Xex3D.c

i

~graf/DEMOS .K odenär tyvärrinte

struktureradså attman lättbyter tillt ex Windo ws.

Figureno van innehållandetre

koordinataxlar

och fyra olikfärg ade kubsidor är ritad med det.

8 Transf ormation av normaler

Vi vet nuatt mantransformerar punkterfrån

ettmodell- ellervärldsk

oordinatsystem(k oordinater

w (x w ,y w ,z ))till ettvyk oordinatsystemoch

vidaretill ettnormaliserat projektionskoordinatsystem

(koordinater p (x

p ,y p ,z )med v P

=T w P respektiv ew p P

=T w P ,där Tär någon4x4-matris, somkan

ses som sammansatt av matriser för translation, rotation och skalning.

Hurär detdå mednormaler .Behöv ervi bryoss?

Egentligeninte, menom vivill veta hurOpenGL

bärsig åtär frågan befogad.

Detfinns dessutomen

-enligt minmening -smart tillämpninga

vsådan

kunskapi sambandmed

synpyramidg allring("rita

barasådana föremålsom

berörsynp yramiden"),

vilken jag tyck er förtjänar ett eget a

vsnitt 9.

Betraktasom inledningplanet

PLANi figurennedan medtillhörande

normalN .Låt ossgöra en

olikformigskalning, sombestår

iatt allay-k oordinaterhalv

erasmedan x-koordinaterna

bevaras.

över går planet i det streckade nya planet. T

ransformationen kan beskrivas med matrisen.

1 T 0

00.5

= Normal N till planet PLAN

Falsk normal till nya planet Nya planet Det givna planet PLAN

Äkta normal till nya planet

(7)

Detligger möjligennära

tillhands atttro attnormalen tilldet

nya planetfås genomatt

låtersamma

transformationv erkapå N, menresultatet blirdå

istället denv

ektorsom ifiguren kallas"f

alsknor-

mal".Däremot servi

atten äktanormal -1 ärT

N(i figurenär dennågot kortare), vilket

visarsig vara

nästan sant även allmänt. Detallmänna resultatetär

attom wP

’=

TP ,så ärN

’=

-1 (T

* ) N, där*

betydertransponat (somju

innebäratt matriselementeta

byterplats ij ji meda

).Här äralla matriser4x4

ochalla vektorer 4x1,

vilket innebär att N har en fjärde k

omponent, vars värde strax anges.

Vi använder ifortsättningen detbekvämare

skrivsättet (a ,b )för skalärproduktena

•bmellan två

vektorer a och b (3-dimensionella eller 4-dimensionella), dvs

där n = 3 eller n = 4. Vi k ommer att utnyttja att om A är en matris, så är (A

a,b ) = (a

* ,A b) och

* (A -1 ) = (A ) -1 . *

Låtoss förstse påf alletatt inga homogenak

oordinaterbehövs, dvsatt

inga translationerär

inblan-

dade.Då harv ektorernatre

komponenter ochmatriserna

är3x3.

Vi utgårfrån ettplan medkänd

normalN ,som alltsåär

vinkelrät motplanet.

Allapunkter Ptransformeras enligtT

P .Om 0 P ochP

ärpunkter påplanet

gälleralltså (N ,P 0 -P )=0.Detta äringet annatän

planetsekv ation.Jag hävdarnu

attN

’ = (T ) * N = (T -1 ) -1 N är en normal till det transformerade planet. Detta följer a * v att

(N

’,T(P 0 -P )) = (T N’, * 0 P-P ) = (T (T * ) * N, -1 0 P-P ) = (N ,P 0 -P ) = 0

Slutligentittar vipå detallmänna fallet

medhomogena koordinater

,som jubehövs föratt

klarahela

transformationskedjan. V i har

NormalenN skallnu hafyra komponenter .V

ivill haen motsvarighet till(

N,P 0 -P )=0i dettidig are

fallet. Om planets ekv ation är Ax + By +Cz +D = 0, vet vi att (A,B,C)

är en normal och sätter *

Dåär (N ,P )=

0för punkterP

påplanet ochmed

sammatyp av resonemangsom

tidigare fårman att

det transformerade planet har parametrarna

a

b , (

)

i a

i b

i

1 =

n

=

w x' y' z' 1 wP ' TP T x y z 1

=

=

=

N A B C D

=

A' B' C' D' N'

* T (

1 – ) N

* T (

1 – ) A B C D

=

=

=

Detta kan alternativt uttryckas på formen

Vi haralltså direktasamband

intebara mellannormalerna

utanäv enmellan planen.Omedv

etethar

vi faktiskt samtidigt visat att ett plan förblir ett plan under de transformationer som är aktuella.

Övning:

Visa attom punktenP

liggerpå framsidana

vplanet definerata

vN (sammasom

att

(N ,P )>0), så ligger TP

på framsidan av det transformerade planet (T ) *

N och omvänt. -1

9 Synpyramidgallring

Detär juonödigt attförsöka

ritasådant sominte

kommer attsynas.

Annorlundauttryckt ärdet

onö-

digtatt skickaobjekt somligger

heltutanför synpyramiden

tillgrafikprocessorn.

Denstora frågan

sominte kommer attbesv arashär ärvilk etsom gårfortast:

testeller ritande.Men

låtoss ialla fall se

hur detta kan gå till (jag påstår inte att sättet här är det praktiskt bästa).

Låtoss försttänka ossatt objektenär

kändai världskoordinatsystemet.

Detär intesärskilt svårtatt

giv etpositionen förbetraktaren,

betraktningsrikningoch synvinklar räknaut

ekvationer förde sex

begränsande planen i synp yramiden (inklusiv

e hitre och bortre klipp-plan).

Omobjektet ären

sfärmed vissradie ochmed mittpunkteni

enviss position,är

detsedan baraatt

räknaut avståndet mellanmittpunkten

ochett av planen.Om punktenligger

påutsidan ocha

vstån-

detär störreän radien,ligger

sfäreni sinhelhet utanförjust

dettaplan.

Processenupprepas för

övriga plan.A vståndetmellan enpunkt P=

(x,y,z) ochplanet (A,B,C,D)ges

av F(x,y,z)

=Ax +By

+Cz +D om A + B 2 + C 2 = 1, dvs om den riktiga normalen är normaliserad. 2

Omobjektet istället ären allmänk

onve xpolyeder ,kan vik ontrollerahörn

efterhörn genomatt

stoppa in i planens ekvationer . Eller också använder vi en omskri

ven sfär .

Menvi arbetarnormalt intemed

koordinater ivärldsk

oordinatsystemetnär detgäller degrafiska

objektenutan imodellk oordinatsystemet.V

isstskulle vikunna räknaut

världskoordinater ,men

det

ärju ettarbete somvi

gärnaöv erlåterpå grafikprocessorn.I

ställetkan vigöra deolika testeni

modellkoordinatsystemet omvi

uttrycker synpyramidens plani

det.V erkarlika illaeftersom iså

fall denin verterade modelltransformationenföref

alleratt behöva användas.

Ochdå kanvi julika

välta steget fulltut ochutgå frånsynp yramideni

projektionskoordinatsystemet.

Enstrålande idé.I

projektionskoordinatsystemet kännervi

jude begränsande planen(jfr

figsid 6).T ransformations-

matrisenT=

Proj

*M (frånmodellk oordinatertill

projektionskoordinater) kanvi

beräknagenom att

A B C D

* T A' B' C' D'

=

(8)

läsaa vdels projektionsmatrisenPr

oj, delsmodell-vy-matrisen Mpå

detsätt sombeskri vsi avsnitt

8i OpenGL-häftet(an

vändesäv eni avsnitt 5här).

Därefterkan viberäkna planeni

modellkoordi-

natsystemet eller världskoordinater (om vi inte har någon modelltransformation) med

Dethitre klipp-planethar

ekvationen -z- 1=

0(med utåtriktadnormal),

dvs(A,B,C,D)

=(0,0,-1,-

1).Detta tillsammansmed

sambandetmellan Noch N’

gerk olumnenför

Hitrei tabellennedan.

Övriga k olumner fås på motsvarande sätt.

10 Rastrering

Detta avsnitt blir aktuellt först när vi tittar på te xturer.

Detsom ären linjei vårvärld fortsätteratt

vara enlinje påvår skärm(eller iskärm+djup).

Detinne-

bäratt vibara behöver

transformeraändpunkterna ochsedan

kangenerera linjenpå

skärmen.Mot-

svarande gällertrianglar

ochpolygoner .Men

sägatt vihar någotsom varierar linjärtutmed

enlinje

elleröv eren triangeli

denv erkliga världen,t ex djup,fär geller ente xtur(precisare ente

xturkoord-

inat).Som framgåra

ve xemplet räcker

detinte attlinjärinterpolera texturk

oordinaterom vivill ha

perspektivistiskt korrekt texturering (bildenär

korrekt), eftersomobjekt

skall"krympa"

nära vstån-

det till betraktaren ökar. V i skall här reda ut hur vi (eller grafikkretsen) måste gå tillväga.

Hitre Bortre

Undre Övre

Vänster Höger

N’

i projek- tionskoor- dinater N i modell- koordina- ter

N

* T N' 11 t 21 t 31 t 41 t

12 t 22 t 32 t 42 t

13 t 23 t 33 t 43 t

14 t 24 t 34 t 44 t

N' = =

0 0 1 – 1 –

0 0 1 1 –

0 1 –

0 1 –

0 1 0 1 –

1 – 0 0 1 –

1 0 0 1 –

31 t

41 t +

32 t

42 t +

33 t

43 t +

34 t

44 t +

31 t

41 t

32 t

42 t

33 t

43 t

34 t

44 t

21 t

41 t

22 t

42 t

23 t

43 t

24 t

44 t

.(s,t) (0,0) (1,0)

(0,1) (1,1)

16 FRÅNVÄRLD

TILLSKÄRM

Vi haren linjemed ändpunkternaP

=(x 0 ,y 0 ,v 0 ) 0 ochP *

=(x 1 ,y 1 ,v 1 ) 1 ivyk * oordinatsystemetmen

med den tredje axeln i synriktningen (härigenom slipper vi ett tank esteg), dvs v

= -z i > 0. i

För en godtycklig punkt (x,y,v) på linjen finns det ett tal 0

≤α≤1, sådant att .

Detta är ju helt enkelt en parameterframställning a v linjen.

Påmotsv arandesätt

gällerför motsvarande punkt(x’,y’,D)

påden perspektivprojicerade

linjenatt

det finns ett tal 0≤β≤

1, sådant att .

Detär uppenbartatt

α=0så om β=0och är vicev

ersa.Likaledes α är

=1om ochendast β om

=1.

Omtransformation hadev

aritlinjär hadedet

genomgåendegällt α att

=β.(

Ppunkt pålinjen med

ändpunkterP ochP 0 ,dvs 1 P=

0 P +α(P -P 1 ),P 0

’=

MP gerP 0 ’=MP1 (MP 0 -MP )=P 0 ’ +α(P 10 -P’

)).

Men nu är den inte det. Vi sök er ett samband mellan

α β. och

Bildenär litetmissledande eftersomdet

kanfinnas enytterlig aretransformationer

(normalisering

och över gång till skärmkoordinater), men dessa är ju linjära (i x och y; vi skalar ju bara x och y).

Ekvationen (2) säger att Eftersom (från figuren; likformiga trianglar)

får vi Om vi här stoppar in uttrycket för y från (1) och räknar på litet, finner man att

y 1 y

’ y’

0 y

1 y y

0 y 0 v v v 1

D

1 () y

0 y α

1 y

0 y – (

) + =

x

0 x α

1 x

0 x – (

) + = ,

v

0 v α

1 v

0 v – (

) + = ,

2 () y'

0 y' β

1 y'

0 y' – (

) + =

x'

0 x' β

1 x'

0 x' – (

) + = ,

y' β

0 y'

1 y'

0 y'

- ---- - ---- - ----

- -- =

y' D - --- y

v- - =

β y v- -

0 y

0 v

- ---- –

1 y

1 v - ----

0 y

0 v

- ---- –

- ---- - ---- - ----

- - =

β v α

1

v - ---- =

(9)

vilket välockså bordekunna

tasfram medlikformighet.

Stopparvi sedanin uttrycket förv från(1)

blir det eller om vi så vill

Vi kan slutligen skri va

Vi kanhär ersättay

medvilk enannan storhetsom

helstsom varierar linjärtlängs

linjen.Speciellt

med v i stället för y fås

eller Formeln (3) kan formuleras som därtäljare ochnämnare

var försig kanframräknas medlinjär

interpolationmed β mellanvärdena

vid ändpunkterna.

Vi fårta tillsådana härformler

te xnär vivill haperspekti vistisktk

orrektte xturering.T

agt ex föl-

jande situation med en kvadrat

α β

1 v

0 v α

1 v

0 v – (

) +

- ---- - ---- - ---- - ---- - ---- - ---- - ----

- =

β α

0 v

1 v β

0 v

1 v – (

) +

- ---- - ---- - ---- - ---- - ---- - ----

- --- =

3 () y

0 y α

1 y

0 y – (

) +

0 y β

0 v

1 v β

0 v

1 v – (

) +

- ---- - ---- - ---- - ---- - ---- - ---- - ---

1 y

0 y – (

) +

0 y

0 v - ---- y β

1 1 v - ----

0 y

0 v

- ---- – 

 

 +

1

0 v - ---- 1 β

1 v - ---- 1

0 v

- ---- – 

 

 +

- ---- - ---- - ---- - ---- - ---- - ---- - ----

- - - = = =

1 v 1

0 v - ---- 1 β

1 v - ---- 1

0 v

- ---- – 

 

 +

- ---- - ---- - ---- - ---- - ---- - ---- - ----

- - =

1 v- - - 1

0 v - ---- 1 β

1 v - ---- 1

0 v

- ---- – 

 

 + =

y y

v ⁄ 1

v

- ----

- --- =

.(s,t) (0,0) (1,0)

(0,1) (1,1)

Texturk oordinaternaär

kändai hörnen.Men vikan inteberäkna demi

engodtycklig punktpå

skär-

men med vanlig linjär interpolation. Däremot med sominnebär enflyttalsdi

visionper ny bildpunktoch

texturk oordinat.Flyttalsdi

visionerhar hittills

alltidv arite xtremtdyra iförhållande tillandra

operationer.Ett tricki dentidig adatorspelsindustrin

därman framförallt

ladete xturerpå vertikala väggar

ochhorisontella takoch

golv,v aratt ritaväg-

garna iform av successiva vertikala streck,längs

vilkaju vär konstant.

Härigenomräck erdet med

en division per streck eftersom övrig a kan ersättas av multiplikationer

.

11 Om klippning i 3D

Viskall härberöra någraprincipiella

frågorkring klippning,dvs

förhindrandea vatt sådantsom inte

skallsynas ritas.V

igår inteför närvarande inpå någraef fektivitetsresonemang ochinte

hellerpå

algoritmer. I a vancerade grafiska system sköts klippningen liksom myck et av en grafisk processor

.

Vi görförst klartför ossv adsom skallsynas ochhur ettpar parametrarpåv

erkarvår bild.Figuren

ov anvisar vykoordinatsystemet medorigo

därobserv atören(ög

at)befinner sig.På

avståndet Dfrån

ögat finnsett projektionsplan.Föremålen

projiceraspå dettaplan, te xöv ergår punktenP

iP '.Våra

tredimensionellaobjekt förspå

dettavis över tilltvådimensionella avbildning

ar.

Endel av projek-

tionsplaneta vbildassedan påett aktuelltrifönster

hosen datskärm.Hur

stordel av projektionspla-

net som tas med bestäms enligt tidigare diskussion a v vad vi sätter syn

vinkeln till.

Detär uppenbartatt

justörre Aär ,desto mindreter

sigett föremåla

ven giv enstorlek.

Vidare blir

intrycket av ettföremål mindreom

deta vlägsnasfrån observatören

ellerom projektionsplanetnär-

mar sig observatören.

Alltsom finnsutanför enp

yramid(som ifiguren visassom

entriangel) begränsad

av bla desneda

planeny=

± Az/D,x=

±Az/Dmed z≥

0är osynligteftersom

sådanapunkter projicerasutanför

den

valda delena vprojektionsplanet.

Te xär heladet högratjocka strecket

synligt,medan baraden

undre delen av det vänstra är det.

4 () s

0 s

0 v - ---- s β

1 1 v - ----

0 s

0 v

- ---- – 

 

 +

1

0 v - ---- 1 β

1 v - ---- 1

0 v

- ---- – 

 

 +

- ---- - ---- - ---- - ---- - ---- - ---- - ----

- - =

t

0 t

0 v - ---- t β

1 1 v - ----

0 t

0 v

- ---- – 

 

 +

1

0 v - ---- 1 β

1 v - ---- 1

0 v

- ---- – 

 

 +

- ---- - ---- - ---- - ---- - ---- - ---- - ----

- - =

D

y=-Az/D y=Az/D

v z

(10)

Frågan ärdå vilkaåtgärder sombehöv

ervidtas.

Vi skallförst seatt klippninga

vobjekt somfinns

bakom observatören måstesk

e.V ierinrar ossformlerna

förperspekti vprojektionen,dvs

över gången

från vykoordinatsystem till perspekti vkoordinatsystem.

p x v = x v D/z p , y v = y v D/z p , z = preliminära eller definitiva

vilkavi tagitfram meddet underförståddaantag

andetatt v z ärstörre än0, vilket naturligtvisinte

gällerför punkterbak

omobserv atören.Geometriskt

betyderdessa formlerdet

somåskådliggörs i

nästafigur .En punktP framförög atprojiceras påprojektionsplanets

P'.

Enmotsv arandepunkt

Q

bakom ögat menmed samma(x

,y v )hamnar v påprojektionsplanets

Q' ochkan därförefter

projek-

tioneninte skiljasfrån

punktenR :sprojektion.

Punkterbak omög atmåste såledesklippas

föreper-

spektivprojektionen.

Noteraäv enatt linjenPQ vidprojektion utanklippning

skullebrytas nedi

två

segment, v ara det ena sträcker sig från

P' till

∞ och det andra frånQ ' till

∞ .

Menpunkter mellanxy-planet

ochp yramidenbehöv

erde klippas?Matematiskt

settbehövs detinte.

Dehamnar juutanför gränsernai

användark oordinatsystemetoch

ritasdärför inteheller

om2D-rit-

ningenfungerar somden

skall.Men intealla grafiksystemsköter

sittjobb korrekt.

Te xarbetar X

med 16-bitars heltal när det gäller heltalskoordinater och

därför uppfattas t ex x=66000

(65536+464) och x=464 som samma tal. Detta är lätt att kontrollera med t e x

XDrawLine(Xdpy,window,Xgc,100,10,200,10); XDrawLine(Xdpy,window,Xgc,65536+100,40,65536+200,40);

somger tvåhorisontella linjerunder

varandra, trotsatt

denena liggerhelt

utanförfönstret.

Ytterli-

gare ettskäl äref fektivitetsmässigt:

manvill blia vmed punktersom

inteskall visasså

tidigtsom

möjligt i transformationskedjan så att man inte behöv er räkna så mycket på dem.

Nulägger manoftast

inteklippningsplanet v vidz

=0,utan någonstansmellan

detplanet ochprojek-

tionsplanet.Härigenom undviker

vide problemsom

v småz -värdenskulle ställatill

medvid tilläm-

pandet av formlerna o van (e

gentligen är det bara en omgivning till origo som är "f arlig").

Menklippning medD>0

introducerarett nytt problem,som

illustrerasi nästafigur .Nu kanplötsligt

delara vföremål framförobserv

atörenbli synliga, trotsatt dee gentligendöljs

av av andraföremål.

Närvi ifiguren klipperföremål

F1mot klippningsplanetså

blirövre delena

vföremål F2synlig.

Problemetblir naturligtvismera

accentueratju längrebort klippningsplanetplaceras.

Detär något

zv zv zv v z

20 FRÅNVÄRLD

TILLSKÄRM

vifår lov attle va med.Det finnsf alldär manlåter klippningsplanetsammanf

allamed projektions-

planet.Detta kanförsv arasmed attman serparet observatör/projektionsplanet

somen observatör

utrustad med en kamera (tubkikare är väl kanske en bättre analogi).

z zvz v

References

Related documents

Gratis läromedel från KlassKlur – KlassKlur.weebly.com – Kolla in vår hemsida för fler gratis läromedel – 2018-08-21 16:03.. Steg 1: Grundläggande

För elever som byter skolform det vill säga gör en övergång från grundskola till grundsärskola är det också av vikt att samverkan med vårdnadshavarna utgörs av

Till skillnad från de övriga bolagen har Ericsson Microwave Systems AB ännu inte påbörjat planeringen av övergången till IAS/IFRS. Företaget har planer på att

Att inte kunna förstå förrän man upplever det och känna ansvar Att vara rädd för sina egna känslor och inte vara glad nog?. Att uppleva krav på att

Den direkta metoden 12 upplyser om in- och utbetalningar som integreras med rörelsen, till exempel inbetalningar från kunder och utbetalningar till leverantörer, anställda och

Som ledtr˚ adar anger A f˚ agel, fisk eller mittemellan f¨or att ange nyckelns h¨ojd (h¨ogt, l˚ agt, mitten), samt om det det blir varmare respektive kallare om B n¨armar sig

sekretess, är det bra att tänka på att inte lagra affärskritisk data i molnet. Detta är mycket

Välj ut en undervisningserfarenhet (aktivitet) som du vill beskriva ytterligare.. Förklara vad för slags aktivitet