|
|
Ce tutoriel est basé sur les tutoriels précédents. Je ne commenterai donc juste que les parties ajoutées.
Création d'un carré

Les objets en 3D sont stockés sous forme de maillages composés de triangles dont l'assemblage constitue la surface de l'objet (d'où le nom de 3D trigonométrique). Ici nous allons créer un carré, il peut-être dessiné avec 2 triangles donc 6 points comme dans la figure ci-contre.
Pour cela on crée une structure nommée VOLUMEVERTEX qui contiendra les coordonnées du point, sa couleur et les coordonnées de la texture.
D3DCOLOR_XRGB n'est qu'une macro permettant au code d'être plus lisible. D3DCOLOR_XRGB(255,255,255) correspond au 255e niveau de Rouge et idem pour le vert et le bleu. Si vous préférez 0xffffffff, c'est pareil mais pour ma part je trouve que c'est moins clair.
Les 2 derniers paramètres servent aux coordonnées de la texture. Ici, cela se corse un peu, non pas par la complexité mais dans la différence entre le positionnement dans un espace 2D et 3D, mais avec un peut de méthode cela doit aller tout seul. Dans un espace 2D le point d'origine se situe en haut à gauche de l'espace alors que dans un espace 3D c'est en bas à gauche (voir figure ci-contre).
|
// -------------------------------------------------------------
// Defines, constants, and global variables
// -------------------------------------------------------------
struct VOLUMEVERTEX
{
FLOAT x, y, z; //Coordonnées
DWORD color; //Couleur
FLOAT tu, tv; //Coordonnées de la texture
};
VOLUMEVERTEX g_Vertices[] =
{
{ 1.0f, 1.0f, 0.0f, D3DCOLOR_XRGB(255,255,255), 1.0f,0.0f, },
{-1.0f,-1.0f, 0.0f, D3DCOLOR_XRGB(255,255,255), 0.0f,1.0f, },
{-1.0f, 1.0f, 0.0f, D3DCOLOR_XRGB(255,255,255), 0.0f,0.0f, },
{ 1.0f, 1.0f, 0.0f, D3DCOLOR_XRGB(255,255,255), 1.0f,0.0f, },
{ 1.0f,-1.0f, 0.0f, D3DCOLOR_XRGB(255,255,255), 1.0f,1.0f, },
{-1.0f,-1.0f, 0.0f, D3DCOLOR_XRGB(255,255,255), 0.0f,1.0f, },
};
|
Mouvements
Basé sur la variable m_fTime qui est le temps écoulé, notre mouvement ne sera pas dépendant du nombre trames affiché par seconde.
HRESULT CMyD3DApplication::FrameMove()
{
D3DXMATRIX matWorld;
D3DXMatrixRotationX(&matWorld, m_fTime);
m_pd3dDevice->SetTransform(D3DTS_WORLD, &matWorld);
return S_OK;
}
|
Rendu de la scène
On va chercher la texture g_pTexture pour l'appliquer à l'objet. Ensuite va chercher l'objet m_pVB, puis on l'affiche avec la fonction DrawPrimitive.
HRESULT CMyD3DApplication::Render()
{
...
m_pd3dDevice->SetTexture(0, g_pTexture);
m_pd3dDevice->SetStreamSource(0, m_pVB, sizeof(VOLUMEVERTEX));
m_pd3dDevice->SetVertexShader(D3DFVF_CUSTOMVERTEX);
m_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2);
...
}
|
Creation de l'objet
Comme nous voulons un polygone texturé, il faut charger la texture (le fichier "dx8.jpg") dans la variable g_pTexture.
Ensuite, il faut allouer le tampon de la matrice de sommets m_pVB de la taille de notre structure. Puis, nous copions les données de notre structure dans pVertices.
HRESULT CMyD3DApplication::InitDeviceObjects()
{
...
if(FAILED(D3DXCreateTextureFromFile(m_pd3dDevice, "dx8.jpg",
&g_pTexture)))
return E_FAIL;
if(FAILED(m_pd3dDevice->CreateVertexBuffer(sizeof(g_Vertices),
D3DUSAGE_WRITEONLY,
D3DFVF_CUSTOMVERTEX,
D3DPOOL_MANAGED,
&m_pVB)))
return E_FAIL;
VOID* pVertices;
if(FAILED(m_pVB->Lock(0, sizeof(g_Vertices), (BYTE**)&pVertices,
0)))
return E_FAIL;
memcpy(pVertices, g_Vertices, sizeof(g_Vertices));
m_pVB->Unlock();
...
}
|
Transformations
Le placement de la caméra se décompose en trois vecteurs :
- vEyePt : Positionnement dans l'espace (X, Y, Z), ici elle est placée à -3.5f en Z par rapport à la scène.
- vLookatPt : Direction de la caméra dans l'espace (X, Y, Z), ici notre objet est placé au centre de la scène donc D3DXVECTOR3(0.0f, 0.0f, 0.0f).
- vUpVec : Sens de la caméra, ici la caméra est place horizontalement.
En suite, il faut paramètrer la projection, qui est le processus par lequel l'ensemble des points de l'espace 3D peut être ramené dans l'espace 2D tout en restituant un effet de perspective.
Et enfin, il faut définir les options de rendu.
HRESULT CMyD3DApplication::RestoreDeviceObjects()
{
...
// Positionement de la caméra
D3DXVECTOR3 vEyePt = D3DXVECTOR3(0.0f, 0.0f,-3.5f);
D3DXVECTOR3 vLookatPt = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
D3DXVECTOR3 vUpVec = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
D3DXMATRIX matView;
D3DXMatrixLookAtLH(&matView, &vEyePt, &vLookatPt, &vUpVec);
m_pd3dDevice->SetTransform(D3DTS_VIEW, &matView);
// Set the projection matrix
D3DXMATRIX matProj;
D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f);
m_pd3dDevice->SetTransform(D3DTS_PROJECTION, &matProj);
m_pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
m_pd3dDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
...
}
|
Après cela, vous disposez d'un polygone texturé qui tourne sur lui-même.
|