Inleiding, Direct3D Matrices

 

In deze tutorial gaan we onze driehoek laten draaien. Hiervoor zijn slechts een aantal aanpassingen voor nodig en een extra functie.

 

De Tutorial

 

Deze tutorial legt je het een en ander uit over matrices. Nu hoor ik je bijna al denken, want kan je nu eigenlijk met matrices? Matrices zorgen ervoor dat wij transformaties heel simpel kunnen uitvoeren. Bijvoorbeeld een driehoek laten draaien.

 

Over het algemeen onderscheiden we 3 transformaties matrices.

 

-De World Transformation Matrix

-De View Transformation Matrix

-De Projection Transformation Matrix

 

Ik ga ze alle drie 1 voor 1 behandelen. Met gelijk de goede source code erbij. Maar eerst een paar noodzakelijk veranderingen in de bron code van de vorige tutorial.

 

Allereerst passen we onze CUSTOMVERTEX struct aan. We halen hier de rhw weg en komt er dus zo uit te zien.

 

struct CUSTOMVERTEX

{

                float x, y, z;

                DWORD                colour;

};

 

Met als gevolg dat de define er zo uit komt te zien:

 

#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)

 

Onze vertexbuffer gaan we ook aanpassen, we laten hem er nu zo uitzien:

 

CUSTOMVERTEX cvVertices[] =

{

        { -1.0f,-1.0f, 0.0f, 0xffff0000, },

        {  1.0f,-1.0f, 0.0f, 0xff0000ff, },

        {  0.0f, 1.0f, 0.0f, 0xffffffff, },

 

};

 

Dat waren alle aanpassingen. Dus dan kunnen we het nu gaan hebben over de eerst transformation matrix.

 

De World Transformation Matrix

 

Met deze matrix kan je objecten draaien, groter en kleiner maken enz. Hiermee gaan wij dus nu onze driehoek laten draaien. Misschien verwacht je dat dit veel werk is, had ik ook toen ik er mee begon. Maar dat valt hartstikke mee. Het zijn maar 3 regeltjes.

 

D3DXMATRIX matWorld;

D3DXMatrixRotationY( &matWorld, timeGetTime() / 150.0f);

g_pd3ddevice->SetTransform(D3DTS_WORLD, &matWorld);

 

Allereerst maken we een pointer naar een matrix aan waar we alle gegevens van de matrix straks in kunnen opslaan. Vervolgens roepen we de functie D3DXMatrixRotationY( ) aan. Met behulp van deze functie kunnen we hem heel simpel over de Y as draaien.

 

De functie heeft 2 parameters nodig zoals je ziet. Ten eerste de pointer naar de matrix waar we het resultaat in op slaan. Daarnaast geven we ook aan hoeveel graden het moet draaien.

 

Vervolgens roepen we SetTransform aan. Deze functie voert voor ons de transformatie uit. Hij heeft meer 2 parameters nodig. Ten eerste met welke matrix hij bezig is. Dus of het de world matrix of een adere matrix is. Daarna wijs je hem gewoon de pointer aan en hij doet de rest voor je. Heel erg simpel.

 

De View Transformation Matrix

 

Met deze matrix kunnen we bepalen hoe de kijkpositie is. We kunnen ook deze roteren.

 

D3DXMATRIX matView;

D3DXMatrixLookAtLH( &matView, &D3DXVECTOR3( 0.0f, 3.0f,-5.0f),

                                                                &D3DXVECTOR3( 0.0f, 0.0f, 0.0f),

                                                                &D3DXVECTOR3( 0.0f, 1.0f, 0.0f) );

g_pd3ddevice->SetTransform( D3DTS_VIEW, &matView);

 

Zoals je ziet maken we weer eerst die pointer aan. Als je die hebt aangemaakt kan je verder door D3DXMatrixLookAtLH( ) aan te roepen. Daarmee maak je een zogenoemende Left Hand Look At matrix. Dit wil in feite gewoon zeggen dat je nu bepaalt waar je viewpoint is.

 

We beginnen weer met het aangeven waar de resultaten in moeten worden opgeslagen. Daarna geven we hem 3 vectoren mee. Die het volgende betekenen:

 

2e parameter

Eye point

3e parameter

Look at point

4e parameter

“Up” direction

 

Als we ons voorbeeld er even bijpakken, zeggen wij nu dus: De eye point zetten wij 5 units naar achteren op de z-as en 3 units omhoog op de y as. De look at veranderen we niet.En de up zetten we gelijk met de Y as. Hier moet je gewoon een beetje mee experimenteren.

 

Hierna geven we hem weer door aan SetTransform en we zijn klaar met dit gedeelte.

 

De Projection Transformation Matrix

 

Deze matrix bepaalt hoe we van 3-D view naar een 2-D view gaan.

 

D3DXMATRIX matProj;

D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f );

g_pd3ddevice->SetTransform( D3DTS_PROJECTION, &matProj);

 

We beginnen met het aanroepen van D3DXMatrixPerspectiveFovLH( ). Hiermee maak je een left-handed projectie matrix in het perspectief. De 1e parameter is zoals gewoonlijk de resultaat pointer. De 2e parameter bepaalt het kijkgedeelte. Gewoonlijk is dat Ľpi, wat wij dus ook gebruiken. De 3e parameter bepaalt het aspect ratio, wat de beeldverhouding is. De 4e en de 5e parameter zijn de dichtstbijzijnde en verste clipping plane. Dit is de afstand waarna er niet meer gerenderd zou moeten worden. Daarna roepen we weer SetTransform aan die alles voor ons doet.

 

Dit alles stoppen we in een functie genaamd SetupMatrices( ), roepen deze aan in de Render functie en voila.

 

Zoals gewoonlijk kan je de hele source weer bekijken, klik daarvoor <a href=”http://home.kabelfoon.nl/~pderaaij/tuts/matrix.cpp”>hier</a>

 

Voor meer informatie kun je contact met mij opnemen.

 

ICQ -> 57088090

MSN -> insiej@hotmail.com

 

Groetjes,

Paul de Raaij