10 Van werkelijkheid naar computerscherm. (The viewing pipeline)
Figuur 12: De viewing pipeline
In figuur 12 zie je wat er moet gebeuren om een werkelijkheid op het beeldscherm weer te geven. Stap 1:
Eerst ziet het oog (kijkpunt) een werkelijkheid die wordt geprojecteerd op het kijkvlak. Alle punten in
deze actie (kijkpunt, punten in werkelijkheid en punten van afbeelding in kijkvlak) hebben
wereldcoördinaten. Stap 2: De punten in het kijkvlak moeten dan nog vertaald worden naar
schermcooördinaten.
We zullen de volledige bewerking doen aan de hand van het voorbeeld in figuur 13. In het voorbeeld is het kijkvlak
het kijkpunt
en de
werkelijkheid .
Figuur 13: Voorbeeld
Stap 1: Deze stap is eigenlijk gelijk aan wat we in de 2D situatie hebben gedaan. Er is een kijkpunt
en een werkelijkheid
die wordt afgebeeld
op een punt in
het kijkvlak
gebruikmakende van homogene coördinaten (projectieve ruimte). Zonder bewijs
kan deze stap worden gegeven door de volgende matrixvermenigvuldiging:
waarin
Voorbeeld: homogene coördinaten:
In de euclidische ruimte is dit dus het punt
Opgaven:
74.
Bereken in het voorbeeld de coördinaten van het beeldpunt voor de werkelijke punten
en
75.
Bepaal bij het voorbeeld de projectie matrix
voor een ander kijkpunt namelijk
en bereken de coördinaten van de beeldpunten voor
en .
Stap 2: Deze stap is iets lastiger. Eigenlijk moet deze in twee stukken worden gedaan:
Stap 2a:Het kijkvlak moet een 2D assenstelsel krijgen zodat we het 3D beeldpunt
in 2D
in het kijkvlak coördinaten stelsel weergeven. Stap 2b: Vertaal het kijkvlak coördinatenstelsel naar het
beeldscherm coördinatenstelsel.
Stap 2a: Hier gaan we als volgt te werk: We zoeken een matrix
die de homogene 3D
coördinaten van omzet in
homogene 2D coördinaten voor
(noem deze ) in het
kijkvlak. Ofwel . Voor het bepalen van is bedacht dat
het handiger is om eerst de matrix
die in
omzet te bepalen.
Ofwel . Daarna
kunnen we op
basis van
uitrekenen. Bepalen van de matrix :
De matrix
moet een
matrix zijn. (waarom?) Gegeven een kijkvlak .
In het kijkvlak moeten we een punt en twee vectoren kiezen die, voor het assenstelsel binnen
, de
oorsprong en de assen worden.
We kiezen willekeurige een oorsprong
in dit vlak:
algemeen
voorbeeld
Figuur 14: Voorbeeld assenstelsel
Kies een richtingsvector
voor de -as in dit vlak
en een richtingsvector
voor de -as
in dit vlak zodanig dat deze loodrecht op elkaar staan (twee vectoren staan loodrecht op elkaar als het inproduct
).
algemeen
voorbeeld 2D: -as
door
langs de 3D snijlijn van
met
vlak. 2D: -as
door
en door 3D snijpunt van
met -as
De laatste coördinaten van
en zijn
gelijk aan 0. In de projectieve ruimte willen we hier een richting en niet een punt. Eerder hebben we
gemeld dat een 0 als laatste coördinaat inhield dat een punt op de horizon ligt. Een andere
betekenis is dat het de richting aangeeft van alle lijnen die een zelfde snijpunt op de horizon
krijgen.
Maak van
en
eenheidsvectoren
door te delen door hun lengte. (De lengte (of norm) van een vector kan worden
berekend met behulp van de stelling van Pythagoras, maar handiger als lengte
).
algemeen
voorbeeld
In de projectieve ruimte is de het euclidische vlak een driedimensionale structuur. Je weet dat een lijn door
twee punten wordt bepaald, voor een vlak heb je drie punten nodig. Het is dus niet verwonderlijk dat we
voor een driedimensionale structuur nog een vierde punt nodig hebben. We kiezen daartoe het punt
dat gelijk is
aan .
In de projectieve vlak versie van het kijkvlak moeten de 2D homogene coördinaten van
en
in het assenstelsel
in het kijkvlak
gelijk zijn aan:
Voor de terugweg
moet nu gelden dat
en door
worden
afgebeeld op
en ,
ofwel
Het is eenvoudig in te zien dat
er als volgt uit ziet:
Zonder een bewijs te geven dat dit echt zo is, kan de matrix
voor
als
volgt worden berekend:
Terug naar het voorbeeld: De matrix
wordt:
Dus in het assenstelsel dat we in het kijkvlak hebben gekozen zijn de coördinaten
() voor het
beeldpunt
gelijk aan
ofwel
Stap 2b: Wat rest is
om te zetten in schermcoördinaten. Dit hebben we al gedaan in voorbeeld 1
t/m 3(opgaven 33 t/m 42). Stel dat het venster op ons scherm de afmetingen
(600 pixels breed en 400 hoog) heeft en dat we in ons kijkvenster
in het midden willen
hebben ( dus op
en dat één eenheid in het kijkvenster overeenkomt met 100 pixels op het scherm.
We moeten dus schalen met en factor 100, gevolgd door een verschuiving van
naar
ofwel translatie over de
vector . Dan moeten we nog
spiegelen in de -as en als laatste
nog een verschuiving over
om alles weer in beeld te krijgen. We gebruiken weer homogene coördinaten om uit te komen op een matrixvermenigvuldiging
.
Schalen met
Translatie over
Spiegelen in de -as
Translatie over
Al deze bewerkingen samenvoegen levert de matrix
.
De schermcoördinaten
van het beeldpunt zijn dan
Alles in één stap
De stappen die we hebben gedaan komen neer op de volgende serie
veranderingen: met behulp van
de volgende berekeningen: ,
en
. Dit kunnen we ook
weer als een bewerking
schrijven:
waarin,
Opgaven:
75.
Bereken in het voorbeeld de schermcoördinaten voor de werkelijke punten
en
.