Baza Wiedzy Komires
Baza Wiedzy Komires
Baza Wiedzy Komires
Baza Wiedzy Komires
Baza Wiedzy Komires

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 |

Przykładowa funkcja wypełniająca macierz widoku obserwatora dla DirectX:

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

Przykładowa funkcja wypełniająca macierz rzutowania w układzie LH (ang. Left-Handed) dla DirectX:

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;
}


Autor: Mirosław Kozioł, Komires Sp. z o.o.
Załączniki
Nie ma załączników do tego artykułu.
Pokrewne artykuły RSS Feed
MENU