Matematyka w grach - część 1

Wektory i przesunięcia

Układ odniesienia

Żeby w ogóle zacząć rozmawiać o matematyce w grach musimy zastanowić się nad paroma kwestiami. Po pierwsze, co to jest położenie i jak możemy je określić? Dla wielu osób odpowiedz będzie oczywista, że używamy do tego celu koordynatów, ale czym one dokladnie są i jak je zapisać w programie? Koordynaty, są to tak naprawdę liczby, które mówią o położeniu punktu w przestrzeni, te liczby zapiszemy w tablicy lub - jak to ma miejsce w Pythonie - jako elementy listy.

W naszym przypadku będziemy rozmawiać o przestrzeni dwuwymiarowej, jednak wszystkie te zasady, które omówimy można zastosować przy tworzeniu przestrzeni trzywymiarowej.

Poniżej widzimy układ współrzędnych, są to dwie osie odpowiednio opisane x oraz y.

Układ kartezjański.

Na czerwono zaznaczyliśmy punkt. Dzięki osiom możemy dokladnie określić, gdzie ten punkt się znajduje, zapiszemy to w ten sposób P=(2,1), czyli ogólnie zapiszemy to tak: $$P=(x,y)$$

Macierze, wektory, skalary

Zaczynając od końca - skalary, są to znane nam wszystkim liczby, przechowują one jedną informację. Przykłady skalarów to: $$ 2, -6, 0 $$ Wektory to tablica liczb, czyli skalarów - wektorem możemy nazwać punkt w przestrzeni. Przykłady: $$ \begin{bmatrix} 1 \\ -3 \end{bmatrix}, \begin{bmatrix} 1 &1 &1 \end{bmatrix}, \begin{bmatrix} 2 &-5 \end{bmatrix} $$ Macierze podobnie jak wektory są tablicą elementów, ale dwuwymiarową. Przykłady: $$ \begin{bmatrix} 1 &2 \\ 3 &4 \end{bmatrix}, \begin{bmatrix} 1 &0 &1 \\ 0 &1 &0 \end{bmatrix}, \begin{bmatrix} 1 &0 &0 \\ 0 &1 &0 \\ 0 &0 &1 \end{bmatrix} $$

Wektory

Wektory są używane do przechowywania informacji takich jak pozycja, prędkość, kierunek lub przyśpieszenie.

Będziemy pracować w przestrzeni dwuwymiarowej, co oznacza, że nasz wektor będzie przechowywał informacje odnośnie dwóch osi x oraz y - analogicznie. gdy pracujemy w przestrzeni trzywymiarowej potrzebujemy przechowywać informację o osiach x, y i z.

Możemy powiedzieć, że wektor ma następujące cechy:

Narysujmy sobie wektor o współrzędnych [4; 3],

możemy teraz obliczyć jego długość za pomocą twierdzenia Pitagorasa - wyjdzie nam 5. Teraz możemy określić kierunek, zrobimy to normalizując wektor, czyli dzieląc jego współrzędne przez długość

otrzymamy wektor [0.8; 0.6]. Jeżeli chcemy obliczyć długość kierunku to wyjdzie nam ona zawsze równa 1 - na tym polega normalizacja, na zmianie długości wektora na 1, pozostawiając inne parametry bez zmian.

Operacje na wektorach

Wektor * Skalar:
$$[10, 5] * 3 = [30, 15]$$

Wektor / Skalar:
$$[13, 6] / 2 = [6.5, 3]$$

Wektor + Wektor:
$$[13, 6] + [10, 5] = [23, 11]$$

Wektor - Wektor:
$$[13, 6] - [10, 15] = [3, -9]$$

Przykład praktyczny

Przejdźmy do praktycznego przykładu. Jeżeli chcemy, aby nasz gracz naciska jednocześnie dwa przyciski lewy i górny. Teraz dodajmy te wektory do siebie i otrzymamy wektor [-1; 1],

następnie chcąc przesunąć gracza w tym kierunku o trzy jednostki przesuniemy go o wektor [-3; 3] - tu się na chwilę zatrzymajmy, bo chyba nie o to nam chodziło.

Obliczając długość wektora [-3; 3] możemy zauważyć, że będzie ona wynosiła około 4.2, a my przecież zamierzaliśmy przenieść go o 3 jednostki. Popełniliśmy błąd, który wynosi ponad 41%, co oznacza, że gracz będzie mógł poruszać się z prędkością dużo większą, niż to zakładaliśmy. Błąd, który zobaczyliśmy bardzo łatwo popełnić, należy więc pamiętać, że nie powinniśmy traktować każdego wektora jako kierunek. Należy znormalizować wektor, aby miał on długość 1 - w naszym przypadku będzie on wynosił około [-0.71; 0.71] - , a następnie możemy pomnożyć go przez dowolną wartość, np. 3.

Każdy znormalizowany wektor powinien mieć swój koniec na okręgu o promieniu 1.

Przykład zastosowania

Ponieważ wektory mogą przechowywać tak dużo informacji i są obiektami na których się przyjemnie operuje to będziemy przechowywać w nich nie tylko prędkość i kierunek, ale też pozycje graczy.

Dla przykładu ustawmy gracza na pozycji [4; 2], a wroga na pozycji [-2; 1] za pomocą tych wektorów możemy obliczyć kolejny jako ich różnice - otrzymamy wektor [6; 1], a on przechowuje informacje o odległości wroga od gracza i kierunku w jakim wróg powinien strzelać wróg, aby trafić w gracza.

Marcin "MarcinzNS" Kondeusz

Szukasz osoby chętnej do współpracy, która zbuduje Twoją stronę internetową, dostarczy oprogramowanie lub przeprowadzi kurs z zakresu programowania lub IT? Skontaktuj się ze mną przez pocztę email marcin.kondeusz@gmail.com lub skorzystaj z formularza na stronie kontaktowej.
Jeżeli wolisz luźniejszą rozmowę to napisz do mnie na Messenger.