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

Jak działa silnik fizyki

VPS Starter Arubacloud
+2 głosów
833 wizyt
pytanie zadane 2 kwietnia 2017 w C i C++ przez Pajdas Mądrala (5,930 p.)
Jak działa silnik fizyki.

Czy do obiektów przypisuje się siły, a później wykonuje się ruch zgodny z nimi.
Ale przecież jedne siły wynikają z drugich, a niektórych sił się 'nie spodziewamy' np. siły odśrodkowej przy dużej prędkości samochodu na zakręcie. Pominięcie takiej siły może mieć duże znaczenie np. przy symulacji ruchu na błocie, jak realizuje się tak skomplikowane zjawiska

3 odpowiedzi

+2 głosów
odpowiedź 3 kwietnia 2017 przez niezalogowany
edycja 3 kwietnia 2017
 
Najlepsza

Odpowiedz do komentarza autora:

ok, dziękuję

A jak wygląda zapis takich sił. Jak możecie poradzić mi zapisanie jakiejś siły w niskopoziomowym C++

Czy to ma być jakiś wektor, długość i kąt nachylenia, czy jest jakiś lepszy sposób, jak poradzić sobie z panowaniem nad takim kodem kiedy jest tego dużo.

Podzielić zjawiska na osobne funkcje.

A później, jak odczytywać siłę i wykonywać ruch kiedy np. wektor siły jest dłuższy niż odległość od przeszkody.

Zamieszczam jako odpowiedz, by ten temat na chwilę był znów wyżej i by dostać łapkę ;)

Siłę to wektor. Wektor możesz zapisać jako 3 liczby (albo 2 w zależności od tego czy to fizyka 2D czy 3D). Najprościej zapisywać je jako współrzędne z racji prostego i łatwego kierowania nimi. Natomiast możesz to zrobić jako długość i kąt, ale podział siły na składowe Fx, Fy, Fz jest czytelniejszy. Marginesem mówiąc masz do czynienia z wektorem to wszędzie gdzie będą obliczenia z wektorami będziesz miał 3 równania. 

Jak wykonywać obliczenia? Weźmy przykład symulacji grawitacji. Bierzesz wszystkie siły jakie działają na ciało i liczysz wypadkową:

Fwypadkowa = FgrawitacjiZiemi + FgrawitacjiKsiężyca + ....

Ogólnie mówiąc Fwyp = suma wszystkich sił działających na ciało (II Zasada Dynamiki Newtona). Tylko kłania się zasadnicze pytanie co to ta siła i jak przekłada się na rzeczywistość. I tu przychodzi znów II ZDN: Fwypadkowa=ma, siła = masa_tego_ciała razy przyśpieszenie. Z tego można obliczyć przyśpieszenie. Z przyśpieszenia natomiast prędkość. Z prędkości nowe położenia. 

Przykładowy algorytm dla symulacji grawitacji np Układu Słonecznego:

void GravitySystem::gravity()
{
    reset_acceleration();
    for(int i=0; i<size(); i++) // petla obliczania przyspieszenia dla kazdego ciała
    {
        for(int j=0; j<size(); j++) // petla obliczania oddzialywania kazdego ciala z kazdym
        {
            if(j!=i) // zeby planeta nie przyciagala sama siebie, bo wyjdzie wtedy dzielenie przez 0!
            {
                double xx = objects[j].x - objects[i].x;
                double yy = objects[j].y - objects[i].y;
                double rr = sqrt(xx*xx + yy*yy);
                double r3 = pow(rr, 3);
                double mj = objects[j].m;
                
                // przyspieszenie grawitacyjne z wektorowego prawa Newtona
                // przyspieszenie to wektor, wiec mamy dwa rownania:
                objects[i].ax += G*mj*xx/r3;
                objects[i].ay += G*mj*yy/r3;
            }
        }
    }
}

void GravitySystem::reset_acceleration()
{
    for(int i=0; i<size() ; i++)
    {
        objects[i].ax = 0;
        objects[i].ay = 0;
    }
}

void GravitySystem::euler_method(double dt)
{
    for(int i=0; i<size(); i++) // petla dla kazdego ciala
    {
        // Obliczanie wektora predkosci (2D) v+=dv, dv = a*dt
        objects[i].vx += objects[i].ax*dt;
        objects[i].vy += objects[i].ay*dt;
        // Obliczanie wektora nowego polozenia (2D) s+=ds, ds=v*dt
        objects[i].x += objects[i].vx*dt;
        objects[i].y += objects[i].vy*dt;
    }
}

Jak widać jest suma przyśpieszeń działających na i-te ciało i jest zamienianie na położenie... Nie liczyłem tutaj równań z sił, bo jest to niepotrzebne w tym przypadku. Są symulacje w, których wystarczą obliczenia z przyśpieszeń i prędkości (np bilard). Przykład czyściej z siłami: Rakieta ( nie chodzi o rzut ukośny ):

Fwypadkowa = Fgrawitacji + Fgazówodwylotowych
Fgrawitacji = -m*g (minus, bo w przeciwnym kierunku do siły unoszącej)
Fgazówodwylotowych = przykladowa_funkcja_zalezna_od(predkosci lotu, predkosci_utraty_masy_gazów
/* zależy jak bardzo chcemy być zgodni z fizyką */ )
Fwypadkowa = m*a
a = Fwypadkowa/m

No i dalej liczenie prędkości i nowego położenia np metodą Eulera. 

 

Natomiast zadałeś jeszcze pytanie:

jak odczytywać siłę i wykonywać ruch kiedy np. wektor siły jest dłuższy niż odległość od przeszkody.

Powinno brzmieć: Co jeśli nowe położenie znajduje się wewnątrz jakiegoś obiektu... Należy przesunąć go tak by oba stykały się krawędziami. Przy małym kroku czasowym i małych prędkościach coś takiego jest mało zauważalne i nie trzeba uwzględniać. Wektor siły może być dłuższy od odległości od przeszkody, bo on jest tworem niejako wirtualnym, a nie czymś fizycznym jak realne przesunięcie (zależne od wartości tej siły).

+1 głos
odpowiedź 2 kwietnia 2017 przez Dash Nałogowiec (29,650 p.)
Silniki fizyki to dosyć skomplikowane zjawiska, jak sam zauważyłeś, ruch obiektu jest wypadkową wielu sił oraz właściwości samego obiektu. Jeżeli chcesz zrozumieć jak to wszystko działa od środka, zakładając że masz rozległą wiedzę z zakresu matematyki i fizyki, polecam przestudiować kod biblioteki Box2D, jest to otwartoźródłowa biblioteka fizyki 2d, jedna z najlepszych/najlepsza, a w dodatku dosyć czytelnie napisana właśnie w c++.

Link to GitHub:

https://github.com/erincatto/Box2D
komentarz 3 kwietnia 2017 przez Pajdas Mądrala (5,930 p.)
ok, dziękuję

A jak wygląda zapis takich sił. Jak możecie poradzić mi zapisanie jakiejś siły w niskopoziomowym C++

Czy to ma być jakiś wektor, długość i kąt nachylenia, czy jest jakiś lepszy sposób, jak poradzić sobie z panowaniem nad takim kodem kiedy jest tego dużo.

Podzielić zjawiska na osobne funkcje.

A później, jak odczytywać siłę i wykonywać ruch kiedy np. wektor siły jest dłuższy niż odległość od przeszkody.
+1 głos
odpowiedź 2 kwietnia 2017 przez Milesq Nałogowiec (32,020 p.)
Są proste silniki takie jak Box2d które uwzględniają niewiele poza grawitacją i tworzy się nowy obiekt ich klasy któremu daje się prędkość masę i typ (jakie siły na niego wpływają) bardziej zaawansowane silniki potrzebują więcej informacji(opór ,siła tarcia czy nawet odbijanie światła) taki prosty można napisać nawet samemu trudniejsze są naprawde skomplikowane
inne siły są dedukowane przez silnik
 

http://cpp0x.pl/artykuly/?id=70
komentarz 2 kwietnia 2017 przez criss Mędrzec (172,590 p.)

Twoja odpowiedź sugeruje, że Box2D uwzględnia "niewiele poza grawitacją".

...czy nawet odbijanie światła

Światło to już robota dla silnika grafiki. 

komentarz 3 kwietnia 2017 przez Milesq Nałogowiec (32,020 p.)
Zależy jaki silnik bo samo odbicie kąt odbicia itp. to silnik fizyki

Tak?
komentarz 3 kwietnia 2017 przez criss Mędrzec (172,590 p.)
Nie. Dlaczego? Nie sądzisz, że to by było co najmniej dziwne gdyby renderowanie było rozbite na dwa różne byty (silnik fizyki i grafiki)? I w efekcie nie mogłyby działać samodzielnie (a przynajmniej nie można by było niczego wyrenderować bez silnika fizyki). Kąt odbicia światła jest bezpośrednio związany uzyskanym efektem wizualnym, więc nie widzę powodu, żeby nie zajmował się tym silnik graficzny.
komentarz 3 kwietnia 2017 przez Milesq Nałogowiec (32,020 p.)
No faktycznie. ok :)
komentarz 3 kwietnia 2017 przez Pajdas Mądrala (5,930 p.)

Symulacja Box2d nie jest "ciągła"

 to cytat z artykułu który mi podesłałeś.
a czym są symulacje ciągłe...
jak działają

1
komentarz 3 kwietnia 2017 przez niezalogowany
https://pl.wikipedia.org/wiki/Symulacja_komputerowa

Tu masz definicję symulacji z czasem dyskretnym i ciągłym.

Podobne pytania

+2 głosów
1 odpowiedź 359 wizyt
pytanie zadane 13 kwietnia 2023 w Matematyka, fizyka, logika przez mlody_klosow Nowicjusz (140 p.)
0 głosów
1 odpowiedź 3,193 wizyt
0 głosów
1 odpowiedź 529 wizyt

92,453 zapytań

141,262 odpowiedzi

319,087 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!

...