Projectietransformatie (Direct3D 9)
U kunt de projectietransformatie zien als het controleren van de interne functies van de camera; het is vergelijkbaar met het kiezen van een lens voor de camera. Dit is de ingewikkeldste van de drie transformatietypen. Deze bespreking van de projectietransformatie is ingedeeld in de volgende onderwerpen.
De projectiematrix is doorgaans een projectie op schaal en perspectief. De projectietransformatie converteert het beeld frustum naar een welpenvorm. Omdat het einde van de weergave frustum kleiner is dan het verre uiteinde, heeft dit het effect van het uitbreiden van objecten die zich in de buurt van de camera bevinden; dit is hoe perspectief wordt toegepast op de scène.
In de weergave frustumwordt de afstand tussen de camera en de oorsprong van de ruimte voor het weergeven van transformatie willekeurig gedefinieerd als D, zodat de projectiematrix eruitziet als de volgende afbeelding.
De weergavematrix vertaalt de camera naar de oorsprong door in de z-richting door - D te vertalen. De vertaalmatrix lijkt op de volgende afbeelding.
Als u de vertaalmatrix vermenigvuldigt met de projectiematrix (T*P), krijgt u de samengestelde projectiematrix, zoals wordt weergegeven in de volgende afbeelding.
De perspectieftransformatie converteert een weergave frustum naar een nieuwe coördinaatruimte. U ziet dat het frustum welpend wordt en ook dat de oorsprong van de rechterbovenhoek van de scène naar het midden wordt verplaatst, zoals wordt weergegeven in het volgende diagram.
In de perspectieftransformatie worden de grenzen van de x- en y-richtingen -1 en 1. De grenzen van de z-richting zijn 0 voor het voorvlak en 1 voor het achtervlak.
Deze matrix vertaalt en schaalt objecten op basis van een opgegeven afstand van de camera naar het vlak voor vrijwel knippen, maar beschouwt het weergaveveld (fov) niet en de z-waarden die worden geproduceerd voor objecten in de afstand kunnen bijna identiek zijn, waardoor dieptevergelijkingen moeilijk zijn. In de volgende matrix worden deze problemen opgelost en worden hoekpunten aangepast om rekening te houden met de hoogte-breedteverhouding van de viewport, waardoor het een goede keuze is voor de perspectiefprojectie.
In deze matrix is Zn de z-waarde van het vlak voor vrijwel knippen. De variabelen w, h en Q hebben de volgende betekenissen. Houd er rekening mee dat fovw en fovk de horizontale en verticale weergavevelden van de viewport in radialen vertegenwoordigen.
Voor uw toepassing is het gebruik van veld-van-weergavehoeken om de x- en y-schaalcoëfficiënten te definiëren mogelijk niet zo handig als het gebruik van de horizontale en verticale afmetingen van de viewport (in cameraruimte). Naarmate de wiskunde uitwerkt, gebruiken de volgende twee vergelijkingen voor w en h de afmetingen van de viewport en zijn ze gelijk aan de voorgaande vergelijkingen.
In deze formules vertegenwoordigt Zn de positie van het vlak voor vrijwel knippen, en de V-w en Vh-variabelen vertegenwoordigen de breedte en hoogte van de viewport, in de cameraruimte.
Voor een C++-toepassing komen deze twee dimensies rechtstreeks overeen met de leden breedte en hoogte van de D3DVIEWPORT9 structuur.
Welke formule u ook kiest, zorg ervoor dat u Zn zo groot mogelijk instelt, omdat z-waarden uiterst dicht bij de camera niet veel verschillen. Dit maakt dieptevergelijkingen met behulp van 16-bits z-buffers enigszins gecompliceerd.
Net als bij de wereld en weergavetransformaties roept u de methode IDirect3DDevice9::SetTransform methode aan om de projectietransformatie in te stellen.
Een projectiematrix instellen
Met de volgende projectiematrix-voorbeeldfunctie worden de voor- en achterste knipvlakken ingesteld, evenals het horizontale en verticale veld van weergavehoeken. De weergavevelden moeten kleiner zijn dan pi radialen.
D3DXMATRIX
ProjectionMatrix(const float near_plane, // Distance to near clipping
// plane
const float far_plane, // Distance to far clipping
// plane
const float fov_horiz, // Horizontal field of view
// angle, in radians
const float fov_vert) // Vertical field of view
// angle, in radians
{
float h, w, Q;
w = (float)1/tan(fov_horiz*0.5); // 1/tan(x) == cot(x)
h = (float)1/tan(fov_vert*0.5); // 1/tan(x) == cot(x)
Q = far_plane/(far_plane - near_plane);
D3DXMATRIX ret;
ZeroMemory(&ret, sizeof(ret));
ret(0, 0) = w;
ret(1, 1) = h;
ret(2, 2) = Q;
ret(3, 2) = -Q*near_plane;
ret(2, 3) = 1;
return ret;
} // End of ProjectionMatrix
Nadat u de matrix hebt gemaakt, stelt u deze in met IDirect3DDevice9::SetTransform D3DTS_PROJECTION opgeven.
De D3DX-hulpprogrammabibliotheek biedt de volgende functies om u te helpen bij het instellen van uw projectiematrix.
- D3DXMatrixPerspectiveLH
- D3DXMatrixPerspectiveRH
- D3DXMatrixPerspectiveFovLH
- D3DXMatrixPerspectiveFovRH
- D3DXMatrixPerspectiveOffCenterLH
- D3DXMatrixPerspectiveOffCenterRH
Een W-vriendelijke projectiematrix
Direct3D kan het w-onderdeel van een hoekpunt gebruiken dat is getransformeerd door de wereld, weergave en projectiematrices om diepteberekeningen uit te voeren in dieptebuffer- of misteffecten. Voor berekeningen zoals deze is vereist dat uw projectiematrix normaliseert als equivalent aan wereldruimte z. Kortom, als uw projectiematrix een (3,4)-coëfficiënt bevat die niet 1 is, moet u alle coëfficiënten schalen door de inverse van de (3,4) coëfficiënt om een juiste matrix te maken. Als u geen compatibele matrix opgeeft, worden misteffecten en dieptebuffering niet correct toegepast.
In de volgende afbeelding ziet u een niet-compatibele projectiematrix en dezelfde matrix die zodanig is geschaald dat oog-relatieve mist wordt ingeschakeld.
In de voorgaande matrices wordt ervan uitgegaan dat alle variabelen niet-nul zijn. Zie Eye-Relative vs. Z-Based Depthvoor meer informatie over oog-relatieve mist. Zie Dieptebuffers (Direct3D 9)voor meer informatie over dieptebuffers op basis van w.
Direct3D maakt gebruik van de huidige set projectiematrix in de op w gebaseerde diepteberekeningen. Als gevolg hiervan moeten toepassingen een compatibele projectiematrix instellen om de gewenste w-gebaseerde functies te ontvangen, zelfs als ze Direct3D niet gebruiken voor transformaties.
Verwante onderwerpen