Przekształcenia (Direct3D 9)
Częścią direct3D, która pcha geometrię przez potok geometrii stałej funkcji, jest aparat przekształcania. Lokalizuje model i przeglądarkę na świecie, projekty wierzchołków do wyświetlania na ekranie oraz klipy wierzchołków do widoku. Aparat przekształcania wykonuje również obliczenia oświetlenia w celu określenia rozproszonych i spekulacyjnych składników w każdym wierzchołku.
Potok geometryczny przyjmuje wierzchołki jako dane wejściowe. Aparat przekształcania stosuje świat, widok i projekcję przekształca się w wierzchołki, przycina wynik i przekazuje wszystko do rasterizatora.
Na czele potoku wierzchołki modelu są deklarowane względem lokalnego układu współrzędnych. Jest to lokalne źródło i orientacja. Ta orientacja współrzędnych jest często określana jako przestrzeń modelu, a poszczególne współrzędne są nazywane współrzędnymi modelu.
Pierwszy etap potoku geometrii przekształca wierzchołki modelu z lokalnego systemu współrzędnych na układ współrzędnych używany przez wszystkie obiekty w scenie. Proces ponownego zorientowania wierzchołków jest nazywany transformacją świata. Ta nowa orientacja jest często określana jako przestrzeń światowa, a każdy wierzchołek w przestrzeni światowej jest deklarowany przy użyciu współrzędnych świata.
Na następnym etapie wierzchołki, które opisują świat 3D, są zorientowane w odniesieniu do kamery. Oznacza to, że aplikacja wybiera punkt widzenia sceny, a współrzędne przestrzeni światowej są przenosine i obracane wokół widoku kamery, zamieniając świat w przestrzeń kamery. Jest to przekształcenie widoku.
Następnym etapem jest transformacja projekcji. W tej części potoku obiekty są zwykle skalowane ze względu na ich odległość od widza w celu zapewnienia iluzji głębokości do sceny; obiekty bliskie są wyświetlane jako większe niż odległe obiekty itd. Dla uproszczenia ta dokumentacja odnosi się do przestrzeni, w której wierzchołki istnieją po przekształceniu projekcji jako przestrzeni projekcji. Niektóre książki graficzne mogą odnosić się do przestrzeni projekcji jako homogenicznej przestrzeni po perspektywie. Nie wszystkie przekształcenia projekcji skaluje rozmiar obiektów w scenie. Projekcja taka jak ta jest czasami nazywana projekcją affine lub ortogonalną.
W końcowej części potoku wszystkie wierzchołki, które nie będą widoczne na ekranie, zostaną usunięte, dzięki czemu rasterizator nie zajmie czasu na obliczenie kolorów i cieniowanie dla czegoś, co nigdy nie będzie widoczne. Ten proces jest nazywany wycinkiem. Po wycinku pozostałe wierzchołki są skalowane zgodnie z parametrami widoku i konwertowane na współrzędne ekranu. Wynikowe wierzchołki, widoczne na ekranie, gdy scena jest rasteryzowana, istnieją w przestrzeni ekranu.
Przekształcenia służą do konwertowania geometrii obiektu z jednej przestrzeni współrzędnej na inną. Funkcja Direct3D używa macierzy do wykonywania przekształceń 3D. W tej sekcji wyjaśniono, jak macierze tworzą przekształcenia 3D, opisują niektóre typowe zastosowania transformacji oraz szczegółowe informacje na temat łączenia macierzy w celu utworzenia pojedynczej macierzy obejmującej wiele przekształceń.
- World Transform (Direct3D 9) — konwertowanie z przestrzeni modelowej na przestrzeń światową
- View Transform (Direct3D 9) — konwertowanie z przestrzeni światowej na przestrzeń kosmiczną
- transform projekcji (Direct3D 9) — konwertowanie z przestrzeni widokowej na przestrzeń projekcji
Przekształcenia macierzy
W aplikacjach, które współpracują z grafiką 3D, można użyć przekształceń geometrycznych, aby wykonać następujące czynności:
- Wyrażanie lokalizacji obiektu względem innego obiektu.
- Obracanie i ustawianie rozmiaru obiektów.
- Zmienianie pozycji wyświetlania, wskazówek i perspektyw.
Dowolny punkt (x,y,z) można przekształcić w inny punkt (x', y', z') przy użyciu macierzy 4x4, jak pokazano w poniższym równaniu.
Wykonaj następujące równania dla wartości (x, y, z) i macierzy, aby utworzyć punkt (x', y', z').
Najbardziej typowe przekształcenia to tłumaczenie, rotacja i skalowanie. Można połączyć macierze, które generują te efekty w jedną macierz, aby obliczyć kilka przekształceń jednocześnie. Na przykład można utworzyć pojedynczą macierz, aby przetłumaczyć i obrócić serię punktów.
Macierze są zapisywane w kolejności wierszy. Macierz, która równomiernie skaluje wierzchołki wzdłuż każdej osi, znanej jako jednolite skalowanie, jest reprezentowana przez następującą macierz przy użyciu notacji matematycznej.
W języku C++funkcja Direct3D deklaruje macierze jako tablicę dwuwymiarową przy użyciu struktury D3DMATRIX. W poniższym przykładzie pokazano, jak zainicjować strukturę D3DMATRIX, która będzie działać jako jednolita macierz skalowania.
// In this example, s is a variable of type float.
D3DMATRIX scale = {
s, 0.0f, 0.0f, 0.0f,
0.0f, s, 0.0f, 0.0f,
0.0f, 0.0f, s, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f
};
Przetłumacz
Następujące równanie tłumaczy punkt (x, y, z) na nowy punkt (x', y', z').
Macierz tłumaczenia można utworzyć ręcznie w języku C++. Poniższy przykład przedstawia kod źródłowy funkcji, która tworzy macierz do tłumaczenia wierzchołków.
D3DXMATRIX Translate(const float dx, const float dy, const float dz) {
D3DXMATRIX ret;
D3DXMatrixIdentity(&ret);
ret(3, 0) = dx;
ret(3, 1) = dy;
ret(3, 2) = dz;
return ret;
} // End of Translate
Dla wygody biblioteka narzędzi D3DX dostarcza funkcjęD3DXMatrixTranslation.
Skala
Poniższe równanie skaluje punkt (x, y, z) przez dowolne wartości w kierunkach x-, y i z do nowego punktu (x', y', z').
Obracać
Przekształcenia opisane tutaj dotyczą układów współrzędnych leworęcznych, więc mogą się różnić od macierzy transformacyjnych, które widziałeś gdzie indziej.
Poniższe równanie obraca punkt (x, y, z) wokół osi x, tworząc nowy punkt (x', y', z').
Poniższe równanie obraca punkt wokół osi y.
Poniższe równanie obraca punkt wokół osi z.
W tych przykładowych macierzach grecka litera theta oznacza kąt obrotu w radianach. Kąty są mierzone zgodnie z ruchem wskazówek zegara podczas patrzenia wzdłuż osi obrotu w kierunku punktu początkowego.
W aplikacji języka C++ użyj D3DXMatrixRotationX, D3DXMatrixRotationYi funkcji D3DXMatrixRotationZ dostarczanych przez bibliotekę narzędzi D3DX w celu utworzenia macierzy obrotowych. Poniżej znajduje się kod funkcji D3DXMatrixRotationX.
D3DXMATRIX* WINAPI D3DXMatrixRotationX
( D3DXMATRIX *pOut, float angle )
{
#if DBG
if(!pOut)
return NULL;
#endif
float sin, cos;
sincosf(angle, &sin, &cos); // Determine sin and cos of angle
pOut->_11 = 1.0f; pOut->_12 = 0.0f; pOut->_13 = 0.0f; pOut->_14 = 0.0f;
pOut->_21 = 0.0f; pOut->_22 = cos; pOut->_23 = sin; pOut->_24 = 0.0f;
pOut->_31 = 0.0f; pOut->_32 = -sin; pOut->_33 = cos; pOut->_34 = 0.0f;
pOut->_41 = 0.0f; pOut->_42 = 0.0f; pOut->_43 = 0.0f; pOut->_44 = 1.0f;
return pOut;
}
Łączenie macierzy
Jedną z zalet używania macierzy jest to, że można połączyć efekty dwóch lub więcej macierzy przez pomnożenie ich. Oznacza to, że aby obrócić model, a następnie przetłumaczyć go na jakąś lokalizację, nie trzeba stosować dwóch macierzy. Zamiast tego należy pomnożyć macierze obrotu i translacji, aby utworzyć macierz złożoną zawierającą wszystkie ich efekty. Ten proces, nazywany łączeniem macierzy, można napisać przy użyciu następującego równania.
łączenia macierzy
W tym równaniu C jest tworzona macierz złożona, a M₁ przez Mn to poszczególne macierze. W większości przypadków tylko dwie lub trzy macierze są łączone, ale nie ma limitu.
Użyj funkcji D3DXMatrixMultiply, aby wykonać mnożenie macierzy.
Kolejność mnożenia macierzy ma kluczowe znaczenie. Poprzednia formuła odzwierciedla regułę łączenia macierzy od lewej do prawej. Oznacza to, że widoczne efekty macierzy używanych do tworzenia macierzy złożonej występują w kolejności od lewej do prawej. W poniższym przykładzie przedstawiono typową macierz świata. Wyobraź sobie, że tworzysz macierz świata dla stereotypowego latającego spodka. Prawdopodobnie chcesz obracać latający spodek wokół jego centrum - osi y przestrzeni modelowej - i przetłumaczyć go na inną lokalizację w twojej scenie. Aby osiągnąć ten efekt, należy najpierw utworzyć macierz rotacji, a następnie pomnożyć ją przez macierz tłumaczenia, jak pokazano w poniższym równaniu.
W tej formule Ry jest macierzą dla rotacji osi y, aT w jest tłumaczeniem niektórych pozycji we współrzędnych świata.
Kolejność mnożenia macierzy jest ważna, ponieważ w przeciwieństwie do mnożenia dwóch wartości skalarnych mnożenie macierzy nie jest dojeżdżające. Pomnożenie macierzy w odwrotnej kolejności ma wizualny wpływ tłumaczenia latającego spodka na swoją pozycję kosmiczną, a następnie obracając ją na całym świecie pochodzenia.
Niezależnie od typu tworzonej macierzy pamiętaj regułę od lewej do prawej, aby zapewnić osiągnięcie oczekiwanych efektów.
Tematy pokrewne