Kamera
Uproszczony model kamery jest wykorzystywany podczas procesu transformacji i rzutowania wielokątów na ekran. Transformacja wielokątów do pozycji obserwatora wymaga wypełnienia macierzy widoku. Macierz widoku może być zbudowana przy użyciu pozycji obserwatora i trzech wektorów (wektor_prawo, wektor_góra, wektor_patrzenia). Rzutowanie wielokątów na ekran wymaga wypełnienia macierzy projekcji. Macierz projekcji dla projekcji perspektywicznej może być zbudowana przy użyciu kąta widzenia oraz minimalnej i maksymalnej odległości obejmowanej przez kamerę.
Model kamery wygląda następująco:
Trzy wektory obserwatora (wektor_prawo, wektor_góra, wektor_patrzenia) są znormalizowane i prostopadłe do siebie. Ruch kamery polega na obracaniu tymi wektorami w zadanych płaszczyznach i przesuwaniu pozycji obserwatora. Przekształcanie wielokątów sceny polega na mnożeniu ich wierzchołków przez macierze widoku i rzutowania.
Mnożenie wierzchołków wielokątów sceny przez macierz widoku przekształca je do przestrzeni obserwatora.
Wypełniona macierz widoku wygląda następująco:
| wektor_prawo.x wektor_góra.x wektor_patrzenia.x 0 |
| wektor_prawo.y wektor_góra.y wektor_patrzenia.y 0 |
| wektor_prawo.z wektor_góra.z wektor_patrzenia.z 0 |
| -DotProduct(pozycja_obserwatora, wektor_prawo) -DotProduct(pozycja_obserwatora, wektor_góra) -DotProduct(pozycja_obserwatora, wektor_patrzenia) 1 |
D3DXMATRIX ViewMatrix(const D3DXVECTOR3 pozycja_obserwatora, const D3DVECTOR3 wektor_prawo, const D3DXVECTOR3 wektor_gora, const D3DXVECTOR3 wektor_patrzenia)
{
D3DXMATRIX ret;
// macierz jednostkowa
D3DXIdentityMatrix(&ret);
ret(0, 0) = wektor_prawo.x;
ret(1, 0) = wektor_prawo.y;
ret(2, 0) = wektor_prawo.z;
ret(0, 1) = wektor_gora.x;
ret(1, 1) = wektor_gora.y;
ret(2, 1) = wektor_gora.z;
ret(0, 2) = wektor_patrzenia.x;
ret(1, 2) = wektor_patrzenia.y;
ret(2, 2) = wektor_patrzenia.z;
ret(3, 0) = -DotProduct(pozycja_obserwatora, wektor_prawo);
ret(3, 1) = -DotProduct(pozycja_obserwatora, wektor_gora);
ret(3, 2) = -DotProduct(pozycja_obserwatora, wektor_patrzenia);
return ret;
}
Mnożenie wierzchołków wielokątów sceny przez macierz rzutowania przekształca je do przestrzeni ekranu.
Wypełniona macierz rzutowania dla rzutowania perspektywicznego wygląda następująco:
| w 0 0 0 |
| 0 h 0 0 |
| 0 0 Q 1 |
| 0 0 -QZn 0 |
gdzie:
Zn - jest to współrzędna ’z’ płaszczyzny ograniczającej scenę z bliska.
Zf - jest to współrzędna ’z’ płaszczyzny ograniczającej scenę z daleka.
Wszystko co jest na scenie za Zf i poniżej Zn zostanie usunięte.
w = ctg(kąt x * 0.5)
h = ctg(kąt y * 0.5)
Q = Zf / (Zf - Zn)
kąt x - kąt poziomy kamery w radianach
kąt y - kąt pionowy kamery w radianach
Inny sposób wyznaczenia w i h:
w=2*Zn / szerokość ekranu
h=2*Zn / wysokość ekranu
D3DXMATRIX ProjectionMatrixLH(const float Zn, const float Zf, const float kat_x, const float kat_y)
{
float h, w, Q;
D3DXMATRIX ret;
w = (float)1.0f/tan(kat_x*0.5); // 1/tan(x) == ctg(x)
h = (float)1.0f/tan(kat_y*0.5); // 1/tan(x) == ctg(x)
Q = Zf/(Zf - Zn);
ZeroMemory(&ret, sizeof(ret));
ret(0, 0) = w;
ret(1, 1) = h;
ret(2, 2) = Q;
ret(3, 2) = -Q*Zn;
ret(2, 3) = 1;
return ret;
}
Numer artykułu: 6
Wysłany: Sun, Jan 24, 2010 5:03 PM
Ostatnio zmieniony: Sun, Jan 24, 2010 6:17 PM
Adres URL: https://www.komires.net/article.php?id=6