2011-08-10 11 views
8

chcę symulować swobodnego spadania i zderzenia z ziemią (na przykład odbijając kulkowe). Obiekt spadnie w próżni - opór powietrza można pominąć. Kolizja z podłożem powinna spowodować utratę energii, aby obiekt przestał się poruszać. Używam JOGL do renderowania punktu, który jest moim spadającym przedmiotem. Grawitacja jest stała (-9,8 m/s^2).grawitacja symulacja

znalazłem metodę Eulera, aby obliczyć nową pozycję punktu:

deltaTime = currentTime - previousTime; 
vel += acc * deltaTime; 
pos += vel * deltaTime; 

ale robię coś złego. Punkt odbija się kilka razy, a następnie przesuwa się w dół (bardzo wolno).

Oto pseudokod (początkowa poz = (0.0f, 2.0f, 0.0f) początkowe vel (0.0f, 0.0f, 0.0f), ciężar właściwy = -9.8f)

display() 
{ 
    calculateDeltaTime(); 
    velocity.y += gravity * deltaTime; 
    pos.y += velocity.y * deltaTime; 

    if(pos.y < -2.0f) //a collision with the ground 
    { 
     velocity.y = velocity.y * energyLoss * -1.0f; 
    } 

} 

Jaki jest najlepszy sposób na uzyskanie realistycznego efektu? Jak metoda Eulera odnosi się do stałych równań przyspieszenia?

+0

Co się stanie, jeśli po prostu wziąłeś stratę energii z równania? – redbmk

+0

Oprócz odpowiedzi Yochai, możesz rozważyć ustawienie pozycji "pos.y" na poziomie gruntu w swojej walizce kolizyjnej, aby uniknąć błędów wycinania. –

+0

Bez utraty energii punkt przestaje odbijać się po jakimś czasie i bardzo wolno się porusza. – Vert

Odpowiedz

6

Ponieważ zmienne punkty nie ładnie ładują się, nigdy nie osiągniesz prędkości wynoszącej 0. Prawdopodobnie otrzymasz coś w rodzaju -0.00000000000001 lub coś podobnego.

trzeba zrobić to 0.0, gdy jest wystarczająco blisko. (Określić jakąś deltę.)

2

Aby rozwinąć na mój komentarz powyżej, i odpowiedzieć Tobias, dodam pełną odpowiedź tutaj.

Po wstępnej inspekcji, uznałem, że krwawiły od prędkości szybko. Mówiąc najprościej, związek między energią kinetyczną i prędkość jest E = m v^2 /2, więc po zrobieniu pochodną w stosunku do prędkości można dostać

delta_E = m v delta_v 

Następnie, w zależności od tego, jak energyloss jest zdefiniowana, można ustalić związek między delta_E i energyloss. Na przykład, w większości przypadków energyloss = delta_E/E_initial, następnie powyższy związek można uprościć

delta_v = energyloss*v_initial/2 

Jest to przy założeniu, że przedział czasowy jest mały co pozwala zastąpić v w pierwszym równaniu z v_initial, więc powinieneś być w stanie uciec z tego za to, co robisz. Aby było jasne, delta_v jest odejmowane od velocity.y wewnątrz bloku kolizji zamiast tego, co masz.

Co do kwestii dodawania powietrza opór czy nie, odpowiedź brzmi: to zależy. W przypadku niewielkich początkowych wysokości zrzutu nie będzie to miało znaczenia, ale może zacząć się liczyć z mniejszymi stratami energii spowodowanymi odbiciem i wyższymi kroplami. Na 1 g, 1 cala (2,54 cm), o średnicy, gładka kula, że ​​naniesiona różnica czasu pomiędzy i bez tarcia powietrza w porównaniu z wysokością zrzutu:

difference in time with and without air-drag vs. drop height

dla materiałów o niskim straty energii (80 - 90 + % energii zatrzymanej), rozważyłbym dodanie jej na 10 metrów i więcej, wysokości spadku. Ale jeśli krople spadną poniżej 2 - 3 metrów, nie zawracałbym sobie głowy.

Jeśli ktoś chce obliczeń, będę je udostępnić.

+0

+1 dziękuję za tę odpowiedź. Myślę, że to również dobre rozwiązanie. W przeciwieństwie do oryginalnej implementacji kolizji Vertu, twoja jest dla "miękkiego" zderzenia, w którym ciało zderza się z podłogą i zatrzymuje się tam (jak może poduszka), podczas gdy wersja Verta jest stratnym odbiciem. Wybór do wyboru zależy oczywiście od pożądanego zachowania fizycznego. I masz rację, w tym tarcie powietrza byłoby przesadą. –

+0

@Tobias, to także odbijanie stratne, tylko trochę delikatniejsze od odbicia. – rcollyer

+0

@Vert, nigdy nie zauważyłem kiedy to opublikowałem, ale upuściłem 'energyloss' z mojego wyniku dla' delta_v'. Naprawiono to teraz. – rcollyer