Skocz do zawartości
Sutikku

Pochodna przyciągania wielu obiektów

Rekomendowane odpowiedzi

Nazwa tematu nic nie mówi, ale chodzi mi o osiągnięcie efektu podobnego do grawitacji (w skali kosmosu). Gdzie wszystkie obiekty na siebie oddziaływają, zależnie od odległości i masy obiektu (czy tam jakiejś zmiennej). Wpadłem na pomysł żeby zrobić maski tak duże by wszystkie obiekty miały kolizje ze sobą (pewnie będą problemy optymalizacyjne no ale) ale nie wiem jak uwzględnić jeszcze te dodatkowe zmienne (tj. odległość i masa). Ktoś mądrzejszy ma jakiś pomysł?

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Ale po co jakieś maski. Lepiej będzie sobie ustalić jakiś maxymalny zasięg działania obiektów i każdy z nich by sobie z pozostałymi sprawdzał jaką ma odległość. A potem podstawić to pod wzór na grawitację: sila_przyciagania = (masa1*masa2)/(dist*dist)*jakasStalaDoregulacjiSily

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Fakt z tymi maskami, dawno nic nie gierkowałem i nie myślę jak gamedev xx
Tylko jak te siłę przyciągania przełożyć na kierunek ruchu, czy w ogóle sam ruch? Mamy np 3. obiekty, dla porównania Ziemia, Księżyc i lecąca pomiędzy nimi asteroida. Dla Ziemi i księżyca lecąca asteroida nie będzie miała wielkiego znaczenia, ale Asteroida powinna zakręcać w stronę ziemi aleee z pewną poprawką w stronę księżyca. Jak to zaaplikować?
Można przyjąć, że na początku żaden z obiektów się nie porusza, i są ustawione w linii Ziemia - Asteroida - Księżyc.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

No asteroida będzie miała 2 takie siły obie są skierowane w stronę tych obiektów tylko o różnej sile wynikającej z dystansu i masy. Po prostu raz przesuwasz w stronę ziemi o sile takiej jaka dla niej wyszła i potem przesuwasz drugi raz w stronę księżyca ponownie o sile takiej jaka dla niego wyszła.

 

Edit: tutaj jest source mojej gierki która ma takie przyciąganie bo to jej główny element gry.

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Polecam odświeżyć sobie podstawy z fizyki newtona :)

 

Przypisz każdemu obiektowi co ma masę wektor prędkości liniowej (np. stwórz wektor linear_velocity). Posługuj się przyśpieszeniem grawitacyjnym i dodawaj do tej zmiennej (wektora) wartość przyśpieszenia co step pomnożoną przez delta_time. Wzór ogólny dla przyśpieszenia grawitacyjnego:

 

a_1 = G \frac{m_2}{r^2} - warto chociaż przejrzeć https://pl.wikipedia.org/wiki/Przyspieszenie_grawitacyjne

 

Żeby obliczyć dla każdego obiektu przyciąganie, możesz posłużyć się opcją z with, np.

var gc = 0.0000000000667408 // 6.67408E-11, stała grawitacyjna

with (obj_asteroid) {
    if (other.id == id) {
        continue;
    }
    // zakladamy rowniez, ze (x,y) to srodek masy obiektu
    var r = point_distance(x, y, other.x, other.y)
    var r2inv = 1.0 / (r * r);
    var accel = gc * mass * r2inv * delta_time
    other.linear_velocity_x += accel;
    other.linear_velocity_y += accel;
}

 

Potem tylko już aplikujemy ruch:

x += linear_velocity_x * delta_time;
y += linear_velocity_y * delta_time;

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się tutaj.

Zaloguj się tutaj

  • Przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników, przeglądających tę stronę.

×