Poza nowatorskimi projektami gier

22

Czytałem odpowiedź na temat matematyki, którą powinien znać twórca gier, a ta część naprawdę mnie wyróżniała:

How do I move my game object? The novice might say:

"I know! I'll just do:" object.position.x++.

Tak właśnie bym to zrobił, więc sądzę, że pokazuje to mój poziom umiejętności. Przynajmniej dla rodzajów gier z bocznym przewijaniem 2D, które zrobiłem w przeszłości, to wszystko, czego potrzebowałem. To i trochę trygonometrii.

W rzeczywistości nie użyłem dużo algebry liniowej ani nawet nie słyszałem o czwartorzędach przed przeczytaniem tego postu. Czy to dlatego, że matematyka nie pojawia się, dopóki nie będziesz pracować z 3D, czy też dlatego, że moje gry 2D są dość proste, że udało mi się naiwnie wdrożyć.

Dalsze pytanie: jeśli chcę się zapoznać z tego rodzaju matematyką, jakie projekty powinienem podjąć? IE: napisz silnik gry, pracuj nad grą 3D itp.

Mike C.
źródło
1
khanacademy.org jest świetny do nauki matematyki dla początkujących i zaawansowanych. Plus są osiągnięcia! Nic nie przypomina teorii gier, która ożywi nudne środowiska akademickie.
spowolnił

Odpowiedzi:

16

Prawdziwą sztuczką jest nauka w szkole średniej; co powinieneś był zrobić. W przypadku, gdy nie zrobił szybkie wyszukiwanie Google będzie Ci rozpoczął . Aby wyjaśnić, w jaki sposób unikasz sposobu myślenia „początkującego”, weź przykład księżycowego lądownika .

Po przeczytaniu, że [change in position] = [velocity] * [time passed]stanie się jasne, że trzeba będzie śledzić te zmienne:

float x, y; // Your X and Y co-ordinates.
float vx, vy; // Your X and Y velocity.
float deltaTime; // Change in time.

Następnie po prostu zastosujesz prędkość do położenia każdej klatki:

// Change X by the velocity multiplied by the time.
x = x + vx * deltaTime;
y = y + vy * deltaTime;

Teraz chcielibyśmy zmienić prędkość każdej klatki, abyśmy mogli dodać grawitację. Według tego samego źródła [change in velocity] = [acceleration] * [time passed]. Dlatego możemy zastosować dokładnie tę samą zasadę:

const float gravity = 9.8f; // The gravity of the earth.

// Add gravity to the vertical velocity.
vy = vy + gravity * deltaTime;
// Change X by the velocity multiplied by the time.
x = x + vx * deltaTime;
y = y + vy * deltaTime;

Teraz potrzebujesz sposobu, aby gracz kontrolował swój statek kosmiczny. Z lektury więcej na temat podstawowej fizyki dowiesz się, że ruch jest wynikiem siły - nie mogę znaleźć źródła, ale [change in acceleration] = ([force] / [mass]) * time(o ile pamiętam). Więc kiedy gracz naciśnie klawisz, po prostu ustawisz zmienne fxi fydo czegoś i zastosujesz równanie podczas aktualizacji.

Ostatecznie musisz pomyśleć o fizyce wokół obiektów w grze - i zamiast próbować sprawić, by poruszały się tak, jak myślisz, raczej spójrz na równanie .

Przyszła uwaga: pamiętaj, że zdecydowanie nie jest to najlepszy sposób na uprawianie fizyki (nazywa się to integracją Eulera i może prowadzić do dziwnych scenariuszy przy niskiej liczbie klatek na sekundę) - musisz spojrzeć na inne sposoby robienia rzeczy (ten artykuł ma dość niezły napis na podstawach). Jednak na razie trzymaj się Euler Integration, ponieważ oznacza to, że próbujesz nauczyć się jednej rzeczy mniej.

Które gry nauczyłyby Cię, jak prawidłowo myśleć?

Jak sprawdziłbyś, czy zrobiłeś wszystko poprawnie i z właściwym nastawieniem? Włóż a Sleep(10 milliseconds)do swojej pętli gry, a wszystko powinno nadal się poruszać i reagować w ten sam sposób, co pełna szybkość klatek.

Na koniec trzymaj się z daleka od 3D (i nałóż czwartorzędy i macierze), dopóki nie będziesz mieć dużego doświadczenia w tworzeniu gier 2D. Zaryzykowałbym stwierdzenie, że wielu twórców gier tak naprawdę nie wie, jak działają Quaternions lub Matrices - ale po prostu wiedzą, jak z nich korzystać - podchodzą do nich znacznie później (lub nigdy, gry 2D są świetną zabawą i mogą być całkiem niezłe odnoszący sukcesy). Nie musisz tak naprawdę znać algebry liniowej i tak dalej, aby robić to na poziomie podstawowym (ale to naprawdę pomaga, więc idź na nocne zajęcia, jeśli możesz).

Ostatnia premia: jedna rzecz, którą zawsze powtarzał mi mój nauczyciel sztuki, to „nie rysuj tego, co myślisz, że widzisz, rysuj to, co widzisz”. To samo dotyczy tutaj „nie modeluj tego, co myślisz , że się dzieje ( object.position++), modeluj to, co się dzieje („ object.position + = velocity * time) ”- przynajmniej do rozsądnych granic (nie modelujesz idealnie dokładnego systemu, ale tworzysz coś, co jest dobrą imitacją).

Jonathan Dickinson
źródło
Podoba mi się twój pomysł wstawienia sztucznego opóźnienia do testowania. Również grawitacja Ziemi wynosi 9,8, a nie 9,1
Steve
Uważaj na „nie modeluj tego, co się dzieje, modeluj to, co się dzieje”, chyba że piszesz rzeczywistą symulację. Skaluj według potrzeb projektu. Czasami „to, co myślisz, że się dzieje” jest dobrą odpowiedzią na Twój projekt.
chaosTechnician
@chaosTechnician na tym poziomie „to, co myślisz, że się dzieje” object.position++. Wyjaśnię odpowiedź.
Jonathan Dickinson
-1 dla instead of trying to make them move in the way you would think, rather look up the equation. Chodzi o zrozumienie równań, a nie ich wyszukiwanie. Najważniejsze jest sprawienie, by gra była przyjemna, a kto wie, może jakieś zmienne przyspieszenie sprawi, że grawitacja będzie przyjemniejsza. Ale bardzo trudno będzie zrozumieć, jak to zrobić, jeśli nie rozumiesz równań.
BlueRaja - Danny Pflughoeft
3
@ BlueRaja-DannyPflughoeft to dokładnie to, co mu wyjaśniłem: nieznajomość równania oznacza przede wszystkim, że nigdy go nie zrozumiesz - a jedynym sposobem na ich zrozumienie jest użycie ich w prawdziwej sytuacji.
Jonathan Dickinson
3

Myślę, że części odpowiedzi, do których linkujesz, są nieco elitarne w swojej prezentacji. Pochwalanie zalet matematyki wektorowej, a następnie stwierdzenie, że obiekt potrzebuje pozycji, kierunku i przyspieszenia, jest niespójnie specyficzne, ponieważ tak naprawdę sprowadza się do czegoś w rodzaju object.position.x += (object.velocity.x + object.acceleration.x) * deltaTime- co zasadniczo nie różni się od object.position.x++. Czwartorzędy są jednym z wielu sposobów reprezentowania rotacji; Lubię je, ale nie są niezbędne do zrozumienia rotacji 3D. Pomimo tego, co sugeruje wielu użytkowników Quaternion, nie są Świętym Graalem matematyki rotacyjnej.

Zasady algebry liniowej występują w prostym ruchu 2D, obrocie itp., Ale matematyka jest prostsza, ponieważ istnieją tylko dwa wymiary. Oto przykład .

Istnieje wiele sposobów na naukę / doskonalenie swojej wiedzy na temat algebry liniowej:

  1. Rozważałem wzięcie udziału w algebrze liniowej, ale moje obciążenie jest już dość duże, więc nie byłem w stanie uzasadnić dodatkowej pracy.
  2. Moje rozumienie algebry liniowej wzrosło znacznie bardziej, ponieważ wziąłem udział w szeregu klas programowania silnika gry. Dla mnie korzystanie z wektorów, macierzy itp. (Ogólnie) jest bardziej powszechne po stronie silnika niż po stronie gry. Oczywiście nie oznacza to, że nie używałem matryc w kodzie gry - po prostu nie używam ich tak często, jak w kodowaniu silnika. ymmv
  3. Istnieje również wiele książek, które pomogą ci zrozumieć matematykę, którą musisz znać. Podoba mi się ta książka z rozdziałem „3D Math for Games”.

Wreszcie, jeśli projekt twoich gier nie wymaga złożonej matematyki, nie używaj jej. :) Ale oczywiście nie pozwól, aby powstrzymało cię to od zagłębiania się w projektowanie gry, która ma.

chaosTechnician
źródło
0

Czwarty dla 2D byłyby całkowitą przesadą, nie wspominając już o zbyt drogich obliczeniach. Rotacja map bitowych (2D) jest obsługiwana pośrednio przez wiele platform / bibliotek, ponieważ jest tak fundamentalna do pisania dowolnej aplikacji, a nawet tam, gdzie jej nie ma, rotacja map bitowych 2D jest niczym więcej jak tylko prostym wyzwalaczem. W 3D rzeczy stają się znacznie mniej intuicyjne dla przeciętnego człowieka, chyba że powiedziano, że człowiek dorastał pisząc kod 3D, kiedy powinien był jeździć na rowerze.

Algebra liniowa ma zastosowanie do 2D, podobnie jak do 3D i powinna być czymś, co znasz, nawet jeśli robiłeś tylko matematykę w szkole średniej. Jeśli kiedykolwiek robiłeś przecięcia linii lub okresowe kreślenie na linii (całkowanie), to użyłeś algebry liniowej.

Nauka matematyki 3D zwykle rozpoczyna się od umieszczenia prostego obiektu (np. Sześcianu) w przestrzeni 3D i zaimplementowania ruchomej kamery, która może oglądać ten obiekt z różnych perspektyw, a ta perspektywa może rozpocząć się prostopadle, aby uprościć sprawę. Chodzi o rzutowanie punktów na płaszczyznę 3D reprezentującą ekran ( tutaj wzór rozszerzyłby to do osi xi oprócz y). To naprawdę początek pisania dowolnego silnika 3D, niezależnie od poziomu doświadczenia. Flash i Processing.js to dwa świetne sposoby łatwego prototypowania czegoś takiego.

Inżynier
źródło
0

Jesteś na dobrej drodze, że algebra liniowa i bardziej złożona matematyka zwykle obejmuje grafikę 3D i przestrzeń 3D. Ale w grach 2D można jeszcze zrobić więcej matematyki. Matematyka fizyki może stać się dość trudna i staje się bardziej złożona, jeśli weźmiesz pod uwagę fizykę miękkiego ciała i dynamikę B-splajnu (i nadal w 2D, pamiętaj)

Spróbuj zbudować lub przeanalizować bibliotekę fizyki, która obejmie obsługę kolizji i reagowanie na typowe kształty 2D. Algebra liniowa jest bardzo przydatna do obliczania wektorów trajektorii dla zderzeń. Iloczyn punktowy jest dość związany z kołem jednostkowym stosowanym w trygonometrii. Jednak złożoność sztywnej fizyki ciała rośnie wykładniczo podczas stosowania jej w 3D.

Grafika 3D zapewnia lepsze zrozumienie obliczeń macierzowych, czwartorzędów, algebry liniowej i niektórych stosowanych rachunków. Pierwszą rzeczą, którą prawdopodobnie zauważysz, jest użycie matryc do przesuwania obiektów w przestrzeni 3D i manipulowania nimi.

ChrisC
źródło
0

Jeśli piszesz gry 2D, prawdopodobnie już używasz algebry liniowej ... po prostu tego nie wiesz! Formalne nauczenie się przynajmniej podstaw o wektorach jest dość łatwe, ale znacznie ułatwia uproszczenie myślenia o skądinąd skomplikowanym ruchu.

Na przykład dostajemy tutaj wiele pytań na temat równań, które należy zastosować do symulacji ruchów zakrzywionych, takich jak wystrzelenie kuli armatniej z armaty lub pocisk naprowadzający. Ale jeśli rozumiesz wektory, jedynym „równaniem”, którego potrzebujesz, jest dodanie dwóch wektorów razem. Co więcej, dodawanie takich rzeczy jak przeciąganie powietrzem lub tarcie staje się niezwykle proste - wystarczy obliczyć wektor przeciągania i dodać go do prędkości. Presto!

BlueRaja - Danny Pflughoeft
źródło