Projection matrix

Met de projection matrix kun je bepalen hoe je de wereld ziet op je monitor. Het bepaald het volume en de clipping planes en kun je je voorstellen als de lens van een camera. Bij OpenGL heb je twee soorten projecties:

Perspective projection
Dit soort projectie geeft de wereld weer zoals je die ook in het echt zou zien. Voorwerpen die verder weg zijn worden hierdoor kleiner weergegeven dan voorwerpen die dichtbij de camera staan.
Orthographic projection
Deze form van projectie wordt in bijvoorbeeld CAD programma's gebruikt en geeft voorwerpen op hun ware grootte weer onafhankelijk van de afstand van de camera.

Als je een projection transformation instelt wordt er een viewing volume gemaakt die twee dingen doet. Het eerste is dat het een aantal clipping planes insteld die bepalen welk deel van de wereld zichtbaar is. Voorwerpen buiten de clipping planes worden dan ook niet gerendert en er worden geen transformaties op uitgevoerd. Bovendien wordt door de viewing volume bepaald hoe voorwerpen worden getekend en hangt af van de viewing volume. Om je hier een idee van te geven kun je je het viewing volume als piramide voorstellen.

Om de projectie methode in te stellen moet je er nu eerst voor zorgen dat de projection matrix is geselecteerd.

glMatrixMode(GL_PROJECTION);

Nu kun je desnoods nog de identity matrix oproepen om de projection matrix te resetten (glLoadIdentity(); voor als je het even niet meer wist.)

Orthographic

Om dit soort projecties te gebruiken stel je de projection matrix in door gebruik te maken van de glOrtho(); functie.

glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far);

Deze functie specificeert de x co÷rdinaten van de linker en rechter clipping plane, de y co÷rdinaten van de top en bottom clipping planes, en de z co÷rdinaten van de near en far clipping planes. Hiermee maak je dus een viewing volume in de form van een doos wat ideaal is voor 2D spellen. Omdat er in 2D spellen eigenlijk geen z as is is er nog een tweede functie om orthografic projection in te stellen zonder z as parameters.

glOrtho2D(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top);

Perspective

Perspective projection werkt ongeveer hetzelfde als orthographic projction met als verschil dat je viewing volume maakt in de form van een piramide waar de top af is gehaald (zie plaatje hierboven). Wat er nu gebeurt is dat OpenGL van de piramide vormige viewing volume een vierkant viewing volume maakt. De achterkant van de viewing volume far clipping plane wordt dus kleiner gemaakt zodat het gelijk is aan de voorkant of near clipping plane. De voorwerpen dicht bij de far clipping plane worden dus ook kleiner gemaakt en je raadt het al, die voorwerpen lijken dus ook kleiner dan voorwerpen dichter bij de near clipping plane.

Nu dan het instellen van het perspectief, het viewing volume wordt trouwens ook wel frustrum genoemd.

void glFrustrum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far);

De hoeken van de far clipping plane worden bepaald door een lijn te trekken van de speler naar door de near clipping plane. Als de near clipping plane dus dicht bij de speler staat is de far clipping plane dus groot. Staat de near clipping plane ver van de speler dan is de far clipping plane dus kleiner. Hiermee kun je dus ook een asimetrisch frustrum maken door de speler naast de near clipping plane te zetten.

Naast deze functie heeft de glu library nog een functie om het frustrum in te stellen die voor de meeste doeleinden geschikter zal zijn.

gluPerspective(GLdouble fov, GLdouble aspect, GLdouble near, GLdouble far);

fov geeft hier de y hoek aan die zichtbaar is voor de speler en de aspect ratio is de breedte gedeelt door de hoogte wat de field of view bepaald. En ook hier weer de near en far clipping planes.

Weer veel theorie maar toch zeer nuttig voor als je afwijkende view volumes wilt maken voor bijvoorbeeld een spel waarin je een vis speelt. Nu kun je dus door de projection matrix een fish-eye view maken of wat je ook maar wilt.

Succes

Vampire,