• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Fizyka w grach, fizyka jazdy samochodem

VPS Starter Arubacloud
+5 głosów
1,580 wizyt
pytanie zadane 9 maja 2015 w Rozwój zawodowy, nauka, praca przez Wally Bywalec (2,840 p.)
Chciałbym się wziąć za pisanie gry 2D gdzie by się między innymi jeździło autem. Ma to być proste ale także chciałbym żeby było w miarę wiarygodne. Byłoby powiedzmy kilka rodzajów aut - przypominam, prosta gra 2D, ale żeby te auta miały różne parametry. Jedno auto szybciej przyspieszało, drugie wolniej. Jedno by miało koła bardziej wysuniętę, drugie mniej, a to wpływa na jazdę.

Polecacie jakieś materiały? Gdzie się tego mogę od zera nauczyć tego wprowadzenia do fizyki?

2 odpowiedzi

+3 głosów
odpowiedź 9 maja 2015 przez Sebastian Fojcik Nałogowiec (43,020 p.)
Jeżeli jeszcze nie wybrałeś biblioteki, w jakiej chcesz napisać swój program, to zaproponuję Ci ten kurs SFML, w którym autor krok po kroku konstruuje grę, w której poruszamy się po mapie strzałeczką i strzelamy do figur.

Opisana jest tam świetna detekcja kolizji oraz poruszanie się tej strzałeczki. Nie ma problemu, abyś zdobytą tam wiedzę zastosował i stworzył samochód z pozmienianymi parametrami. Z resztą pisana tam gra chyba najbardziej mi przypomina to, co chcesz osiągnąć (grę, w której poruszasz pojazdem).

http://szymonsiarkiewicz.pl/piszemy-gre-w-sfmlu/

(zakładam, że masz na myśli widok od góry, a nie od boku, bo o tym nie wspomniałeś)
komentarz 9 maja 2015 przez Wally Bywalec (2,840 p.)
Dzięki za linki. Jednak myślę o mobile więc LibGDX lub Unity. Co prawda nie pisałem gier ale o podstawy się nie martwię. Dajmy na to że mam już planszę, mam obiekt i już nim poruszam. Chcę zobaczyć jak ułożyć równania żeby zrobić przyspieszenie i zrobić skręt - taki skręt który żeby był realny, a nie że kółko jest przekręcone o 30 stopni a auto skręca jakby było 20. Chcę dokładnie to zrobić, ale też nie robię jakiegoś symulatora i jest to tylko 2d, na początek ;). Bo nie wiem czy da się to zrobić niewielkimi obliczenami czy jest tam tak dużo równań że potrzebuję matemtyki ze studiów.

Coś takiego jak tu: http://en.games-for-smart.com/uploads/img/full_w700/617/1617/2-Dr.-Parking-2.jpg

Widać że grafika prosta ale zależy mi by napisać te równania żęby to przyspieszało w zależnosci powiedzmy od podanej masy auta i żeby skręt był w miarę realny - jest koła skręcone 30 stopni to żeby nie było okiem dostrzegalne że to skręca jakby było 20 stopni.
komentarz 9 maja 2015 przez Sebastian Fojcik Nałogowiec (43,020 p.)
edycja 9 maja 2015 przez Sebastian Fojcik

Mhm... widzę, ze interesuje cię bardziej aspekt rozwiązania fizyki jazdy, a nie samej gry...

Dobrze więc. Pojawia się kolejne pytanie: Jak bardzo realistyczną fizykę chcesz osiągnąć i do jakiej gry. W grze, której przykład podałeś (bardzo trafny), nie uświadczysz przykładowo takiej sytuacji:

"Jadąc bardzo szybko wpadasz w poślizg. Tył auta zaczyna się przesuwać względem toru jazdy, ale nagle auto złapało przyczepność i znów zaczęło jechać do przodu."

Sytuacja wyżej opisana, to już nie jest kwestia jednego czy kilku gotowych wzorów fizycznych. Podam ciekawy przykład:
W wielu grach, gdzie dużą rolę odgrywa jazda samochodem występuje takie pewne zjawisko. Rozpędź się samochodem na wstecznym, po czym puść gaz i skręć, a następnie dodaj gazu. Efekt? Obróciłeś bardzo szybko auto o 180 stopni i możesz jechać.

Powyższa sytuacja, to nie jest przykład perfekcyjnie napisanej fizyki. Programiści "ręcznie" zaprogramowali tę sytuację.

Ale OK. Wracając do podstaw. Pisałeś o skręcaniu. Pisałem kiedyś program, gdzie jeździło się obiektem i skręcanie rozwiązałem w taki sposób:
"W" - zwiększa wartość prędkość
"A" / "D" - zwiększa wartość skrętu
Wartość skrętu uznałem za wielkość wektorową, skierowana zawsze prostopadle do prędkości (wybaczcie, że nie posługuję się prawidłowymi, fizycznymi pojęciami). Coś takiego:

Problem z tym rozwiązaniem jest taki, że obiekt się niejako ślizga. To znaczy, że nie zmieniając wartości skrętu, po przyspieszeniu, pojazd będzie jechał innym (łagodniejszym) torem. Czyli sprzeczne z tym, co chcesz osiągnąć (30 stopni, to ma skręcać jak 30, a nie 20). Trzeba byłoby wartość skrętu zmieniać wprost proporcjonalnie do prędkości, ale wtedy nigdy nie byłoby poślizgu / driftu.
Musisz wtedy samodzielnie ustalić, kiedy auto ma wpaść w poślizg (powyższy przykład na rysunku to poślizg). Brałbyś pod uwagę prędkość, tarcie, masę auta i "moc" skrętu (przykładowo). A gdy prędkość spadnie i algorytm wyliczy, że koniec poślizgu, to znów wrócisz sztywno na tor.

Będzie to wyglądać nieco sztywnie, bo przy pewnej prędkości auto zacznie "pływać" po powierzchni, ale po odpowiednim dopieszczeniu algorytmu da radę. To są ode mnie tylko takie wskazówki, że nie samymi wzorami fizycznymi świat gier funkcjonuje. Czasami trzeba ustalić własne zasady działania fizyki.
Wyżej wzięliśmy pod uwagę skręt, tarcie opon, prędkość i wagę auta. To już jest OGROMNE uproszczenie. Nie braliśmy pod uwagę powierzchni, po której jedzie auto, czy jest mokra, pomijamy dziury i podskoki wozu.

Polecam zrobić prymitywny system jazdy i powolutku go rozwijać. Od ogółu do szczegółu, aby był coraz bardziej realistyczny.

Pozdrawiam :)

komentarz 9 maja 2015 przez Wally Bywalec (2,840 p.)
Dzięki za wyjaśnienie. Na razie nie mam co odpisać. Trochę rozszerzyłeś mi horyzont na sprawę i będę brnął dalej w to. Słusznie zauważyłeś, bardziej mi zależy na fizyce niż na grze. Irytuje mnie ta masa gier mobilnych gdzie to właśnie wszystko jest tak bez starania zrobione.

A tak btw to bardzo dobra fizyka jazdy jest w Live for Speed.
komentarz 16 maja 2015 przez Wally Bywalec (2,840 p.)
Mam teraz czas i wziąłem się za realizację pomysłu ale nie wiem jak sobie poradzić z tym skrętem. Sytuacja wygląda tak, że mam układ wspołrzędnych XY (bo to gra 2d z góry) i mam prostokąt z 4 kołami. Potrzebuję co pętlę obliczać nowe X, Y, obrót pojazdu w zależności od aktualnej prędkości pojazdu i skrętu kół. Problem jest tylko przy tym skręcie. Jak to napisać, by wyliczyć X, Y, obrót w zależności od skrętu? Inaczje zatacza łuk autobus, inaczej osobówka. Ważne jest jak długi jest samochód i gdzie ma umiejscowione koła. Nie wiem jak ruszyć temat. Szukam po sieci ale znajduje przeważnie tematy gdzie mowa o momentach obrotowych itp a potrzebuję podstawy tylko. Chcę najprostszą fizykę napisać.
+2 głosów
odpowiedź 9 maja 2015 przez arek01996 Stary wyjadacz (12,100 p.)
edycja 9 maja 2015 przez arek01996
Jak to ma być jakaś prosta gra 2D to ja bym to zrobił w ten sposób:

No więc auto powinno posiadać jakieś przyspieszenie oraz masę. W moment obrotowy się nie ma się co bawić bo nawet stałe przyspieszenie do jakiejś prędkości maks. będzie dość wiarygodne (ewentualnie można użyć jakiejś funkcji logarytmicznej).

Co do hamowania. Hamowanie powinno mieć jakieś przyspieszenie z przeciwnym wektorem pomnożony przez współczynnik tarcia zależny od nawierzchni tak dla przykładu jadąc 1000km/h klikniesz "hamuj" od aktualnej prędkości odejmiesz prędkość hamowania np (-5km/s^2) * współczynnik tarcia gdyż np na lodzie będzie wolniej hamował itp. do współczynika możesz dodać że jak opona ma np 5px to współczynnik hamowania wzrosnie o x % a jak ma 15 px to jeszcze więcej dodasza. Jest duże pole do popisu gdyż można również uwzględnić pęd co będzie skutokwać że masa będzie miała wpływ na szybkość hamowania.

 
Co do skręcania możesz to zrobić w ten sposób (Prawy klawisz dodaje co sekunde do jakieś zmiennej np 10 (im większa róznica od poprzedniego stanu tym szybciej bedzie skręcać prawda? stąd możesz dowolnie ustawiać parametry samochodu do woli. Duże opony niech mają mniej dodawane niż małe opony itp), a lewy odejmuje). jak zmienna bedzie > niż 360 to ją zerujesz. Mam na myśli że mógłbyś skręcanie rozwiązać funkcjami sinus i cosinus.

Zaraz podam kod na przykładowe skęrcanie
komentarz 9 maja 2015 przez arek01996 Stary wyjadacz (12,100 p.)

Kod pisałem baaardzo dawno więc mogą wystąpić jakieś błedy. (SFML 2.0)

#include <SFML/Graphics.hpp>
#include <vector>
#include <cmath>
#include <iostream>

#define PI 3.14159265

using namespace std;

class Head
{

    struct Pos{
        float x;
        float y;
    };
    Pos pos;
    float angel;

public:
    sf::RectangleShape head;

    Head(){

        pos.x=497.f;
        pos.y=580.f;

        head.setSize(sf::Vector2f(6,5));
        head.setPosition(pos.x, pos.y);

    }
    void move(float x, float y)
    {
        pos.x+=x;
        pos.y+=y;
        head.setPosition(pos.x, pos.y);
    }

    Pos getPosition(){
        return pos;
    }


};

class Point
{

public:

    float x;
    float y;

    sf::RectangleShape point;
    Point(Head head, float ang){

        x=head.getPosition().x;
        y=head.getPosition().x;

        point.setRotation(ang);
        point.setSize(sf::Vector2f(6, 5));
        point.setFillColor(sf::Color::Red);
        point.setPosition(head.getPosition().x, head.getPosition().y);

    }
};

int main()
{
    float angel=0;
    vector < Point > map;
    Head head;
    sf::Clock deltaTime;
    float moveX;
    float moveY;
    float vectSumX=0;
    float vectSumY=0;
    float delta;

    sf::ContextSettings set;
    set.antialiasingLevel=8;

    sf::RenderWindow WindowApp(sf::VideoMode(1024, 600, 32), "SFML window", sf::Style::Default, set);
    WindowApp.setFramerateLimit(60);

	while (WindowApp.isOpen())
    {
        delta = deltaTime.restart().asSeconds();
        sf::Event event;
        while (WindowApp.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                WindowApp.close();

        }

        if( sf::Keyboard::isKeyPressed( sf::Keyboard::Right ) )
        {
            angel+=360*delta;

            if(angel > 360)
                angel=angel-360;
        }

        if( sf::Keyboard::isKeyPressed( sf::Keyboard::Left ) )
        {
            angel-=360*delta;

            if(angel < -360)
                angel=360-angel;
        }

        moveX = sin(angel*PI/180);
        moveY = (-1)*cos(angel*PI/180);
        vectSumX+=abs(moveX);
        vectSumY+=abs(moveY);

        head.head.setRotation(angel);
        head.move(moveX*delta*70, moveY*delta*70);

        if(vectSumX+vectSumY > 70){

            vectSumX=0;
            vectSumY=0;

            map.push_back( Point(head, angel) );
        }

        sf::Vector2f heads(head.getPosition().x, head.getPosition().y);

        WindowApp.draw(head.head);

        if(map.size()>0){
            if(!map[map.size()-1].point.getGlobalBounds().contains(heads) )
                WindowApp.draw(map[map.size()-1].point);
        }
        WindowApp.display();
    }

    return EXIT_SUCCESS;
}

 

komentarz 9 maja 2015 przez Wally Bywalec (2,840 p.)
edycja 9 maja 2015 przez Wally
Dzięki, bardzo wyczerpująca wypowiedź :). W zasadzie wydaje mi się, że to przyspieszanie i hamowanie da radę jeszcze zrobić, choć muszę popatrzeć na wzory, popróbować z zastosowaniem na pewno, bo nie są mi obce jednak dawno nie liczył nic z fizyki a tymbardziej nie stosowałem ich w symulacji :D.

Jednak nie wiem jak się zabrać za ten skręt. Chodzi o to, że jak weźmiemy sobie wyobrazimy auto jako prostokąt patrząc na niego z góry to koła przednie i tylnie możemy w różnej odległości ustawić od krawędzi przodu i tyłu auta. Potrzebuję coś znaleźć właśnie na temat tego, żeby ten ruch po krzywej był realistyczny, jednak no też nie do przesady z tym :).

Mówiąc krócej jak zaprogramować ten ruch żeby obiekt samochodu wziął pod uwagę długość pojazdu, rozstaw kół i skręt by był realny, a nie żeby koło się tarło po powierzchni zamiast kręciło. Co do długości to krótkie auto a długi autobus który ma np tylnie albo przednie koła dziwnie oddalone - to są to różne krzywe.

EDIT: Pisałem w momencie gdy nie zobaczyłem wszystkich postów, zaraz zobaczę.

Podobne pytania

0 głosów
2 odpowiedzi 1,223 wizyt
pytanie zadane 2 lutego 2018 w Offtop przez nielotweb Bywalec (2,240 p.)
+1 głos
1 odpowiedź 301 wizyt
pytanie zadane 6 czerwca 2022 w Python przez NEFOS Początkujący (320 p.)
0 głosów
1 odpowiedź 563 wizyt
pytanie zadane 30 sierpnia 2020 w Python przez KumberTwo Dyskutant (8,270 p.)

92,455 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...