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'
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 2 ’ oche 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 ˆ ×
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 –
- ---- - ---- - ---- - ---- - ----
- --- =
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.
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.
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.
Då
ö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
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'
=
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 ’=MP +α 1 (MP 0 -MP )=P 0 ’ +α(P 1 ’ 0 -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 - ---- =
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
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