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 (ProjectProperties 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.