Wektory w rozwoju gier


19

Jestem nowy w programowaniu i programowaniu gier. Czytałem już coś o wektorach i matematyce, ale mam pytanie - gdzie używać wektorów w programowaniu gier? Może ktoś może podać prosty przykład, w którym używasz wektorów (w 2D)?

Znalazłem przykłady, ale głównie znajdują się w konsoli, gdzie wypisują liczby i duże przykłady, których nie rozumiem.


Podstawowe wektory TL; DR są częścią tematu Algebry liniowej i prowadzą do matematyki. Dzięki Matricies i Linear Algebra piszesz wszystko, od solvera Saperów do projekcji świata 3D, aby zobaczyć, który obiekt znajduje się pod twoim kursorem. Algebra liniowa to najbardziej przydatna i niezbędna gałąź matematyki dla każdego twórcy gier. Naucz się teraz; nie będziesz żałować.
Robert Massaioli,

Dzięki wszystkim za wszystkie niesamowite odpowiedzi! Ale dlaczego coś takiego nie używa Vectora w tym tutorialu ?: zetcode.com/tutorials/javagamestutorial Czy jeden programista używa innego nie?
vqwer

Trudno powiedzieć, prawdopodobnie autor chciał, aby był prosty i prosty dla początkujących.
Maik Semder

Właściwie autor ich używa, spójrz na tablicę punktów class Star tutaj
Maik Semder

Również tutaj jest Point2Dużywany wclass ResizeRectangle
Maik Semder

Odpowiedzi:


31

Co to są wektory?

Wektory to zbiory współrzędnych o różnych wymiarach. Każda współrzędna w wektorze reprezentuje jakąś absolutną pozycję w tym kierunku przestrzeni, w której znajduje się wektor.

  • Wektor 1-D byłby {1} . Może to być na przykład pozycja w X = 1. Lub czas t = 1.
  • Wektor 2D byłby {-4,3} . Może to być na przykład pozycja w pozycji -4 na osi X i 3 na osi Y. Może to być również temperatura (3 stopnie) w pozycji (-4 metry) z powrotem na osi X.
  • Wektor 3-D byłby {1,2,3} . Może to być pozycja w przestrzeni 1 wzdłuż osi X, 2 z powrotem na osi Y i 3 w górę na osi Z. Lub może to być 1 czerwony, 2 zielony i 3 niebieski w kolorze. Lub może to być pozycja XY ( {1,2} ) w pewnym momencie T ( {3} ).

Zauważ, że we wszystkich przypadkach przypisaliśmy znaczenie wektorom dla naszego problemu. Podczas gdy w grach często używane są wektory do geometrii, nie ma powodu, dla którego nie można zrobić z nimi nic innego.

Dlaczego używam wektorów?

Po pierwsze, nigdy nie musisz używać wektorów. Tak długo, jak śledzisz xiy, lub dowolne współrzędne, na których ci zależy, w jakiś sposób wszystko jest w porządku.

Zaletą stosowania wektorów jest jednak to, że starannie reprezentują takie rzeczy, jak kierunek i pozycja, a także mają zdefiniowane kilka operacji matematycznych, które ułatwiają życie.

Prostym przykładem tego jest produkt punktowy .

Załóżmy, że masz system radarowy w grze typu top-down. Każdy wróg pojawiający się w sektorze radaru (jakiś klin w kształcie kulek w 2D) powinien otrzymać na ekranie małą czerwoną kropkę. Musisz więc dowiedzieć się, którzy wrogowie są w twojej sekcji radaru.

Możesz sprawdzić, czy wrogowie znajdują się w trójkącie. Możesz także sprawdzić, czy wrogowie znajdują się na przecięciu dwóch półprzestrzeni płaszczyzn / linii definiujących dwie strony sektora radaru.

Lub możesz po prostu użyć produktu kropkowego do sprawdzenia. Oto jak:

  1. Utwórz wektor, przechodząc od środka radaru w kierunku „przedniej części radaru”. Normalizuj to.
  2. Utwórz wektor idący od środka radaru w kierunku obiektu, dla którego chcemy sprawdzić widzialność radaru. Normalizuj to.
  3. Weź iloczyn kropkowy dwóch znormalizowanych wektorów.
  4. Weź arcus cosinus tego produktu i sprawdź, czy jest on mniejszy niż połowa kąta szerokości radaru. Jeśli tak, narysuj blip.

Jest to bardzo przydatne, a także pozwala teraz łatwo mieć radary, które wskazują w różnych kierunkach (wystarczy zmienić wektor do przodu) i mają różne szerokości (wystarczy zmienić kąt szerokości radaru) - i można ponownie użyć tego samego kodu również w tych przypadkach !

Dlaczego jeszcze używam wektorów?

Jeśli jesteś w 2D, być może najlepszym sposobem na uzyskanie złożonych efektów i ruchów (wirowanie, skalowanie itp.) Jest użycie wykresu sceny. Planeta ma orbitujący statek, statek ma orbitującego drona. Obliczenia tego bez użycia matematyki wektorowej są naprawdę brzydkie.

W przypadku matematyki wektorowej każdy z nich reprezentuje macierz punktową i macierz transformacji 3x3. Planeta używa swojej transformacji, statek używa swojej transformacji i transformacji planety, a dron używa transformacji i transformacji statku i transformacji planety.

Gdy planeta się porusza, zmieniasz jej transformację, a statek i dron automatycznie ustawiają się „za darmo”. Znacznie czystszy kod.

Nadal nie jestem przekonany. Wektory są również natywną reprezentacją pozycji, geometrii i ruchu używaną przez prawie wszystkie biblioteki graficzne - a na pewno OpenGL i DirectX. Prawdopodobnie nie uciekniesz bez konieczności korzystania z nich.

Wnioski Wektory są potężnym narzędziem do pisania przejrzystego kodu, który rozwiązuje problemy geometryczne w sposób czysty i elegancki.


14

Przykładem 2D są współrzędne ekranu, które identyfikują piksel na ekranie i mają składową x i y [x, y], tj. Lewą górną pozycję ekranu [0, 0]

Kolejny przykład: wyobraź sobie przewijanie tekstu od prawej krawędzi ekranu do lewej krawędzi ekranu. Teraz musisz zdefiniować prędkość przewijanego tekstu w pikselach na sekundę, tj. [-20, 0], co oznacza, że ​​tekst przewija się o 20 pikseli w lewo na sekundę i nigdy nie zmienia wysokości.

Kolejny bardziej zaawansowany przykład: wyobraź sobie grę 2D, która ma działać na różnych rozdzielczościach ekranu 800 x 600, 1024 x 768 itd. Można to łatwo zrobić wewnętrznie, używając szerokości ekranu od 0,0 do 1,0 i wysokości od 0,0 do 1,0, aby oddzielić logikę gry od rzeczywistej rozdzielczości ekranu. Teraz, gdy rysujesz na ekranie, po prostu mnożymy wektor wewnętrzny przez wektor rozdzielczości:

screen_pos = internal_pos * screen_ressolution

zauważ, że wszystkie 3 zmienne są tutaj wektorami 2D, mają one składową x i y, tj. dla tego wewnętrznego_pos [0,5, 0,25]:

[400, 150] = [0.5, 0.25] * [800, 600]

Tak więc pozycja wewnętrzna [0,5, 0,25] jest przekształcana na rzeczywistą pozycję ekranu [400, 150]

To była podstawowa rzecz. Prawdziwą zaletą wektorów jest aplikacja w Algebrze liniowej, w której można używać macierzy do przekształcania wierzchołków (obracanie, skalowanie, lustro itp.), Tj. Do łatwego obracania całej pozycji wewnętrznej o 90 stopni, lub trzeba zamienić ekran-y pozycja 0 od góry do dołu ekranu, ponieważ np. używana przez ciebie biblioteka strony trzeciej korzysta z tej konwencji.


Czy wektor nie jest tablicą z jednym wymiarem, jak lista jakiegoś rodzaju? Kiedy mówimy o rozdzielczości ekranu, czy nie mówimy o tablicy wielowymiarowej (jedna współrzędna dla każdej osi X i Y)? Tylko po to, aby upewnić się, że „wektor” nie jest tutaj pomieszany z macierzą. =)
Czy Marcouiller

@Czy pełne dane w pikselach dla ekranu mogą być traktowane jako tablica wielowymiarowa, w zasadzie mapa bitowa, ale wartości szerokości i wysokości, innymi słowy rozdzielczość, nie mogą
Maik Semder

2
Zauważ, że wektor jest często traktowany zupełnie inaczej w matematyce i programowaniu. Z matematycznego punktu widzenia wektor nie jest tablicą wielowymiarową, chociaż jego składniki w odniesieniu do pewnej podstawy razem definiują taką tablicę. Sam wektor jest niezmiennikiem współrzędnych. Operacja niescreen_pos = internal_pos * screen_resolution jest niezmienna współrzędna w sposób, w jaki została napisana, może być bardziej odpowiednio napisana , gdzie jest odwzorowanie liniowe (które można zapisać jako macierz, w tym przypadku przekątną). screen_pos = map_to_screen * internal_posmap_to_screen
leftaroundabout

6

Oto świetne wyjaśnienie wektorów w rozwoju gier na blogu Wolfire Games:

http://blog.wolfire.com/2009/07/linear-algebra-for-game-developers-part-1/


To jest obecnie odpowiedź tylko do łącza. Zastanów się nad dołączeniem przybliżonego podsumowania głównych punktów, które, jak mam nadzieję, czytelnik może zebrać na podstawie tego linku, aby odpowiedź mogła stać sama, nawet jeśli link się zmieni, zepsuje lub stanie się niedostępny w przyszłości.
DMGregory

1

Wektor jest bytem, ​​który ma zarówno wartość, jak i kierunek. Przykłady wektorów w świecie rzeczywistym i gry oparte na fizyce obejmują prędkość i pęd. Właściwości, które mają tylko wartości, ale nie mają kierunku, nazywane są skalarami i obejmują lokalizację, masę, gęstość i tak dalej.

Wektory są potrzebne do gier, które emulują właściwości fizyczne, które są podobne do wektorów (jak wspomniano - prędkość, przyspieszenie i tak dalej). Matematyka używana do obliczeń wektorowych nazywa się algebrą liniową .


Prędkość jest skalarem, ma długość wektora prędkości
Maik Semder

Poprawnie - naprawiono
Eran Galperin

1
a lokalizacja zwykle jest uważana za wektor, jest to odległość skalarna.
Ali1S232

Pozycja może być traktowana zarówno jako skalar (lub zbiór skalarów), jak i wektor wskazujący od punktu początkowego osi.
Eran Galperin

1

Gdziekolwiek masz liczbę dla każdego wymiaru reprezentującą coś, zbiór tych liczb można uznać za wektor. Położenie, prędkość i przyspieszenie są głównymi przykładami wektorów. W niektórych przypadkach praktyczne może być również przedstawienie kierunku zwrócenia jako wektora.

W przypadku podstawowych rzeczy tak naprawdę nie ma znaczenia, czy uważasz te liczby za wektory, ale jeśli chcesz robić jakąkolwiek fizykę, powinieneś przyjrzeć się matematyce wektorowej.


Pozycja nie jest wektorem
Eran Galperin

Prędkość też nie jest skalarem, prędkość jest wektorem
Maik Semder

2
@Eran Galperin Wiem, że jest to dość powszechny pogląd wśród matematyków. Różnica między punktem a odpowiadającym mu wektorem pozycji jest jednak dość akademicka. Nie ma praktycznego powodu, aby robić zamieszanie na temat tego rozróżnienia.
aaaaaaaaaaaa

1
Istnieją powody praktyczne, po pracy z 4D homogeniczna współrzędnych i matryc, to mają do tego rozróżnienia. Chociaż nie ma to znaczenia dla zakresu tego pytania.
Maik Semder

@eBusiness to nie jest „widok”, to fakt. Z wykształcenia jestem fizykiem, a nie matematykiem.
Eran Galperin

0

Po prostu cokolwiek z pozycją lub kierunkiem, które jest wszędzie w grze, używają wektorów. Wektor jest jak punkt

struct Point2
{
float x, y;
};

struct Vector2
{
float x, y;
};

Jednak różnica naprawdę sprowadza się do tego. Punkt jest tylko kropką, podczas gdy wektor jest strzałą.

Jeśli masz

Point2.x = 5;

Point2.y = 10;

twoje powiedzenie, że mam na myśli w tej lokalizacji x 5 i y 10.

jednak kiedy deklarujesz wektor ...

Vector2.x = 5;

Vector2.y = 10; 

Naprawdę mówisz, że deklaruję strzałkę od 0,0 do x 5, y 10;

możesz nawet mieć punkt, z którego wektor jest skierowany z dowolnego miejsca w przestrzeni, na przykład użyjmy punktu i wektora, aby przesunąć nasz obiekt, użyjemy Point2 do przechowywania jego położenia i wektora2, aby go przenieść .

point2.x = 10;

point2.y = 15;

teraz możesz użyć wektora, aby przesunąć ten punkt, powiedzmy, że chcemy przesunąć ten punkt w górę o oś x jednostek, więc masz

vector2.x = 10;

vector2.y = 0;

point2 += vector2;

teraz punkt przesunął się tam, gdzie kazała to twoja strzała wektorowa.

Chodzi teraz o to

point2.x = 20;

point2.y = 15;

Ostatnią rzeczą, na którą należy zwrócić uwagę, jest to, że wektor jest używany jako punkt i na odwrót tylko dlatego, że przechowują ten sam typ danych.


Punkt jest wektorem. Jest to wektor od początku do punktu P.
Kaczka komunistyczna

1
@Duck z technicznego punktu widzenia nie jest to prawidłowe, odnosząc się do współrzędnych jednorodnych że wektor można znaleźć poprzez odjęcie origin_point z position_point, ale to nie czyni ich równe: v = pos - origintak v != posponieważ pochodzenie jest punktem{0, 0, 0, 1}
Maik Semder

@ Kaczka: Punkt nie jest wektorem, ale punktem, a początek definiuje wektor, który jest tak samo dobry jak przez większość czasu, jeśli twoje pochodzenie wynosi 0.

@ Kaczka, więc dlaczego nazwałeś to swoim punktem P? LOL
EddieV223
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.