DirectX: Trójwymiarowy labirynt od podstaw - Część II

17.03.2010 - Adam Błaszkiewicz
TrudnośćTrudność

Renderowanie sceny

Zajmiemy się teraz funkcją renderującą. Po wywołaniu BeginScene(), ustawiamy macierz widoku, korzystając z funkcji D3DX. Funkcja ta oblicza macierz widoku na podstawie pozycji kamery, wektora kierunku i wektora "w górę", czyli dokładnie na podstawie tego, co mamy.

1
2
3
4
5
6
7
D3DXMATRIXA16 matView;
D3DXMatrixLookAtLH(
    &matView,
    &pozycja_real,
    &(pozycja_real+kierunek_real),
    &gora_real);
pD3DDevice->SetTransform( D3DTS_VIEW, &matView );

Z macierzą projekcji warto chwilę się pobawić i sprawdzić jaki kąt widzenia kamery nam odpowiada:

1
2
3
4
5
6
7
8
D3DXMATRIXA16 matProj;
D3DXMatrixPerspectiveFovLH(
    &matProj,
    D3DX_PI / 1.9f,
    8.0/6.0,
    0.1f,
    100.0f );
pD3DDevice->SetTransform( D3DTS_PROJECTION, &matProj );

W powyższym kodzie miara tego kąta to PI / 1.9.

Następnie ustawiamy odpowiedni FVF i renderujemy ściany oraz podłogi, korzystając z funkcji renderującej trójkąty za pomocą bufora indeksów:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
pD3DDevice->SetFVF( FVF_VERTEX );
 
pD3DDevice->SetTexture( 0, pTextureS );
pD3DDevice->SetStreamSource(
        0, pVBsciany, 0, sizeof( Vertex ) );
pD3DDevice->SetIndices(pIBsciany);
pD3DDevice->DrawIndexedPrimitive(
        D3DPT_TRIANGLELIST, 0, 0U, num_v, 0U, num_sciany*2 );
 
pD3DDevice->SetTexture( 0, pTextureP );
pD3DDevice->SetStreamSource(
        0, pVBpodlogi, 0, sizeof( Vertex ) );
pD3DDevice->SetIndices(pIBpodlogi);
pD3DDevice->DrawIndexedPrimitive(
        D3DPT_TRIANGLELIST, 0, 0U, num_v, 0U, num_podlogi*2 );

Funkcję renderującą kończymy standardowo metodą EndScene oraz Present.

Zakończenie

W tym momencie nasz program jest gotowy. Końcowy efekt wraz z paroma mapami i generatorami map oraz źródła można pobrać z ramki po lewej.

5
Twoja ocena: Brak Ocena: 5 (1 ocena)

Copyright © 2008-2010 Wrocławski Portal Informatyczny

design: rafalpolito.com