2009-08-27 17 views
12

Obecnie pracuję nad niektórymi programami do gier FPS w OpenGL (JOGL, dokładniej) dla zabawy i chciałem się dowiedzieć, jaki byłby zalecany sposób utworzenia kamery podobnej do FPS?W jaki sposób można zaimplementować kamerę FPS?

W tej chwili zasadniczo mam wektor dla kierunku, w którym znajduje się gracz, który zostanie dodany do aktualnej pozycji gracza po naciśnięciu klawisza "w" lub do przodu. Negatyw tego wektora jest oczywiście używany do "s" lub do tyłu. Dla "a", lewej i "d", używam normalnego wektora kierunku. (Mam świadomość, że to pozwoliłoby graczowi latać, ale to nie jest problem w tej chwili)

Po przesunięciu myszy wektor kierunkowy zostanie obrócony za pomocą trygonometrii i macierzy. Wszystkie wektory są, oczywiście, znormalizowane dla łatwej kontroli prędkości.

Czy jest to powszechny i ​​/ lub dobry sposób, czy też istnieje łatwiejszy/lepszy sposób?

Odpowiedz

6

Zawsze widziałem, jak to się robi, używając dwóch kątów, odchylenia i nachylenia. Dwie osie ruchu myszy odpowiadają zmianom w tych kątach.

Można łatwo obliczyć wektor forward za pomocą przekształcenia współrzędnych sferycznego na prostokątny. (skala = szerokość geograficzna = φ, odchylenie = długość geograficzna = θ)

Możesz użyć nieruchomego wektora up (powiedzmy (0,0,1)), ale oznacza to, że nie możesz patrzeć bezpośrednio w górę lub w dół. (Większość gier rozwiązuje ten problem, umożliwiając wygląd mniejszy niż 89,999 stopnia.)

Wektor to wektor krzyżowy wektorów do przodu i do góry. Będzie on zawsze równoległy do ​​płaszczyzny podłoża, ponieważ wektor w górę jest zawsze prostopadły do ​​płaszczyzny podłoża.

Lewy/prawy klawisz strafy, następnie użyj wektora +/-right. W przypadku wektora forward równoległego do płaszczyzny uziemienia można pobrać produkt krzyżowy wektorów right i up.

Jeśli chodzi o część GL, można po prostu użyć gluLookAt(), używając nazwy gracza, pochodzenia oraz wektora forward i wektora up.

Och i proszę, dodaj opcję "Odwróć mysz".

Edit: Here „s alternatywne rozwiązanie, które pozbywa się problemu 89,9, poprosił w innym pytaniu, które polega budującej right wektor pierwszy (bez informacji pitch), a następnie forward i up.

4

Tak, to zasadniczo tak, jak zawsze to widziałem.

+0

Ok, dzięki. Chciałem tylko upewnić się, że niczego nie brakuje. Miłego dnia! –

1

Tak, ale na koniec będziesz chciał dodać różne inne cechy do kamery. Aby przeliterować to n00b: zachowaj porządek, jeśli chcesz naśladować Quake'a lub CS. W końcu może bobing, FoV, filtrowanie ruchu, zawieszenie opóźnienia sieci i więcej.

Kamery są w rzeczywistości jedną z trudniejszych części do wykonania w dobrej grze. Dlatego programiści zazwyczaj zadowalają się poważnie nudnym, ustalonym ditto 1/3 osoby.

1

Możesz użyć Quaternions do obrotu kamery. Chociaż sam nie próbowałem, są one przydatne do uniknięcia gimbal lock.

+1

Blokada dźwigni nie może się zdarzyć w FPS; w rzeczywistości sprzężenie kątów Eulera z ruchami myszy jest ogromnym uproszczeniem bez żadnego ryzyka. –

+0

Naprawdę, dobrze, myślę, że muszę przeczytać na moim 3D. – crunchdog

+0

Jonas ma rację, ryzyko kombinacji zawieszenia kardana wynosi co najmniej 3 obroty. Cytowany artykuł jest po prostu błędny. Możesz mieć blokadę kardana z macierzami i kwaternionami wtedy i tylko wtedy, gdy używasz transformacji Eulerian. Są tylko dwa sposoby na to, niektóre nieliniowe zabiegi dla osobliwości na biegunach lub transformacjach nieelulskich, które łatwiej wyrazić za pomocą ... kwaterniej :) – gouessej

Powiązane problemy