Instrukcja do ćwiczenia

Transkrypt

Instrukcja do ćwiczenia
GRAFIKA KOMPUTEROWA
Podstawy programowania w środowisku Direct 3D
Aby poprawnie skompilować program, należy w Visual Studio 2013 dodać następujące
foldery do ustawień środowiska (ProjectProperties VC++ Directories):

Include Directories  C:\Program Files (x86)\Microsoft DirectX SDK
(March 2009)\Include

Library Directories  C:\Program Files (x86)\Microsoft DirectX SDK
(March 2009)\Lib\x86
1. Definiowanie kształtu obiektu
Podstawową figurą geometryczną, z której buduje się obiekty trójwymiarowe w środowisku
Direct 3D, jest trójkąt. W programie przykładowym, w funkcji InitGeometry(), znajduje się
tablica g_Vertices[], w której zdefiniowane są poszczególne wierzchołki kolejnych trójkątów.
Każdy wierzchołek jest opisany przez 6 liczb: współrzędne (x, y, z) oraz trójelementowy
wektor określający normalną do wierzchołka (uwzględnianą przy wyznaczaniu sposobu
odbijania światła przez ten wierzchołek). Należy pamiętać o odpowiednim zmodyfikowaniu
zmiennej g_nTriangles, która przechowuje liczbę użytych trójkątów. W funkcji InitGeometry()
tworzony jest także globalny bufor g_pVB zawierający dane o wierzchołkach:
g_pd3dDevice->CreateVertexBuffer(3*g_nTriangles*sizeof(CUSTOMVERTEX),
0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_pVB, NULL);
Obiekt g_pd3dDevice reprezentuje urządzenie wyjściowe i jest odpowiednikiem kontekstu
graficznego używanego przez Windows GDI. Do bufora g_pVB kopiowane są następnie
wartości z tablicy g_Vertices[].
2. Zmiana położenia elementów sceny
Ustawienie wszystkich elementów sceny względem płaszczyzny ekranu opisuje tzw. macierz
świata. W programie przykładowym macierze konstruowane są w funkcji SetupMatrices(), a
macierz świata jest reprezentowana przez zmienną matWorld. Początkowo jest to macierz
jednostkowa, utworzona w wyniku zastosowania funkcji D3DXMatrixIdentity, można ją jednak
modyfikować wykonując następującą operację:
nowa_macierz_swiata = macierz_transformacji * macierz_swiata
Macierz transformacji może określać translację lub obrót. Na przykład, macierz definiującą
obrót wokół osi X uzyskuje się przez wywołanie funkcji D3DXMatrixRotationX:
D3DXMATRIX *D3DXMatrixRotationX(
D3DXMATRIX *pOut,
FLOAT Angle
// tworzona macierz
// kąt obrotu (w radianach)
);
Natomiast mnożenie macierzy wykonuje funkcja D3DXMatrixMultiply:
D3DXMATRIX *D3DXMatrixMultiply(
D3DXMATRIX *pOut,
CONST D3DXMATRIX *pM1,
CONST D3DXMATRIX *pM2
// wynik
// mnożna
// mnożnik
);
Aby macierz świata została uwzględniona przy renderowaniu sceny, w programie
przykładowym wykonywane jest następujące polecenie:
g_pd3dDevice->SetTransform(D3DTS_WORLD, &matWorld);
3. Poruszanie się obserwatora w układzie współrzędnych
Położenie obserwatora (kamery) w układzie współrzędnych określa tzw. macierz widoku.
Macierz widoku jest reprezentowana przez zmienną matView. Konstruuje się ją przy użyciu
funkcji D3DXMatrixLookAtRH:
D3DXMATRIX *D3DXMatrixLookAtRH(
D3DXMATRIX *pOut,
CONST D3DXVECTOR3 *pEye,
CONST D3DXVECTOR3 *pAt,
CONST D3DXVECTOR3 *Pup
// tworzona macierz
// wskaźnik na wektor określający położenie oka
// wskaźnik na wektor określający obserwowany punkt
// definicja kierunku pionowego, najczęściej [0, 1, 0]
);
Aby macierz widoku została uwzględniona przy renderowaniu sceny, wykonywane jest
następujące polecenie:
g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );
4. Działanie programu przykładowego
W programie przykładowym funkcja InitGeometry(), która tworzy i wypełnia bufor
wierzchołków, uruchamiana jest tylko raz, na początku jego działania. Z kolei funkcja
Render(), odpowiadająca za rysowanie sceny, wywoływana jest w pętli przez cały czas
wykonywania programu, chyba że są jakieś komunikaty systemowe, wymagające obsłużenia:
while( msg.message! = WM_QUIT )
{
if ( PeekMessage (&msg, NULL, 0U, 0U, PM_REMOVE) )
{
TranslateMessage (&msg);
//obsługa komunikatów systemowych
DispatchMessage (&msg);
}
else
Render();
//  RYSOWANIE SCENY
}
Przed każdym narysowaniem sceny funkcja Render() wykonuje operacje na macierzach
zawarte w funkcji SetupMatrices(). Umożliwia to animowanie narysowanego obiektu.
Właściwe renderowanie wykonywane jest poprzez uruchomienie metody DrawPrimitive:
g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, g_nTriangles);
Przykładowe zadanie
Zadanie przeznaczone do wykonania w trakcie zajęć będzie obejmować następujące
zagadnienia:
1. rysowanie trójwymiarowego kształtu, a więc modyfikowanie listy trójkątów zawartej w
tablicy g_Vertices[],
2. animacja sceny – modyfikowanie macierzy świata,
3. poruszanie się obserwatora – modyfikowanie macierzy widoku.