Autor Wątek: Toczenie się kulki  (Przeczytany 2342 razy)

Offline Degnir

  • Użytkownik

# Listopad 30, 2012, 02:22:08
Witam.

Na początku przedstawię zarys projektu, później przejdę do pytań, coby łatwiej było zrozumieć o co mi chodzi.

Projekt w założeniach jest prosty, zrzucam kulkę (którą traktuję jak punkt, któremu daje promień) na nierówny teren i ma się ona realistycznie toczyć.

Dodam że kula na chwilę obecną ma wektor prędkości i przyspieszenia.

Teren to wygenerowana przez mój algorytm randomowa siatka składająca się z trójkątów (dla każdego obliczam wektor normalny, tak samo dla każdego punktu mam jego wektor).

Kolizje już mam, jednak problem pojawia się z fizyką z którą kuleję nieco.
Dlatego prosiłbym was, byście wyjaśnili mi jakie siły działają na kulkę gdy ta spada na powierzchnię, oraz na podstawie czego sprawić by się toczyła po ścianach.

Na chwilę obecną uzyskałem że ładnie odbija się od ścian (zwiększam wektor prędkości o przyspieszenie, a potem ze wzoru na normalne i wektor prędkości obliczam nowy kierunek lotu kulki) to jest ok, ale jak sprawić by w pewnym momencie przestała się odbijać a zaczęła toczyć? Co powinienem wprowadzić?

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Avaj

  • Użytkownik

  • +3
# Listopad 30, 2012, 11:48:00
Dlaczego nie użyjesz gotowego silnika fizycznego?

Offline Frondeus

  • Użytkownik

# Listopad 30, 2012, 12:01:59

Offline Degnir

  • Użytkownik

# Listopad 30, 2012, 12:27:28
Chce to zrobić bez silnika fizycznego, po prostu :)

Pdf ciekawy, jednak dla uproszczenia wziąłem kulkę jako punkt, a nie jako bryłę sztywną.

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

  • +2
# Listopad 30, 2012, 12:45:00
Cytuj
ale jak sprawić by w pewnym momencie przestała się odbijać a zaczęła toczyć? Co powinienem wprowadzić?
Jeżeli tego jeszcze nie masz: współczynnik elastyczności odbicia.

Odbicie generalnie działa tak (w mojej implementacji, która jeszcze nigdy mnie nie zawiodła):
- wyznaczasz punkt kolizji
- wyznaczasz normalną kolizji
- odsuwasz piłkę po normalnej tak, by nie kolidowała z trójkątem
- rozkładasz wektor prędkości piłki na prostopadły i równoległy do normalnej kolizji
- jeżeli wektor prostopadły wskazuje w kierunku trójkąta odwróć składową równoległą do normalnej i przeskaluj przez współczynnik elastyczności (= ile energii zostaje po odbiciu)
- złóż z powrotem nowe składowe prędkości i przypisz do pilki

Teraz jeżeli współczynnik elastyczności jest <1, to piłka odbija się coraz niżej aż w końcu będzie odbijać się niezauważalnie dla oka. Czyli ślizgać się po powierzchni. Można udawać toczenie po prostu obracając grafikę piłki - w momencie kolizji ustawiamy prędkość obrotową piłki zgodnie z wartością i znakiem składowej prostopadłej do normalnej kolizji podzielonej przez promień pilki (= prędkość w radianach/sekundę).

Piłka co prawda będzie się fizycznie ślizgała (brak momentu bezwładności i podkręcania), ale będzie wyglądała jakby się toczyła i dopóki nie robisz symulacji gry w bilard, to takie przybliżenie wystarczy w zupełności. :)

Cytuj
Dlaczego nie użyjesz gotowego silnika fizycznego?
Z tego samego powodu, z którego nie sciągnął gotowej gry o piłce z sieci. ;)

Offline Degnir

  • Użytkownik

# Listopad 30, 2012, 22:58:00
O super, o coś takiego mi właśnie chodziło :)

Podasz mi jeszcze jakąś stronkę, gdzie będę mógł sobie poczytać o rozkładaniu wektora na prostopadły i równoległy do innego wektora oraz o składaniu?

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

  • +2
# Listopad 30, 2012, 23:23:39
Stronki nie podam, bo takie rzeczy to się z pamięci robi na podstawie lekcji matmy i fizy w liceum. :)

Składowa równoległa = Normalna <iloczyn skalarny> Wektor
Składowa prostopadła = Normalna_obrócona_o_90_stopni <iloczyn skalarny> Wektor

Zakładając że normalna jest znormalizowana (długość = 1). Obrót w 2D o 90 stopni jest banalny: zamieniasz X i Y i jedno z nich negujesz (od tego które zależy kierunek obrotu).

Wektor składasz jako: Normalna*Składowa_równoległa + Obrócona_normalna*Składowa_prostopadła.

Offline Degnir

  • Użytkownik

# Listopad 30, 2012, 23:56:33
To prawda, jednak nie zawsze ufam swojej pamięci - już tyle siedziałem nad błędami które okazywały się minusem zamiast plusa, czy inną drobnostką.
Tak więc bardzo dziękuję za ludzkie wytłumaczenie :)

Jakiś prosty przepis na obrót ale w 3D? Wystarczy mi chyba znaleźć dowolny wektor leżący na płaszczyźnie wyznaczanej przez poligon dobrze myślę? Czy są jakieś prostsze sposoby?

Edit.
Okej, zrobiłem to na zasadzie:
Normalna(a,b,c)
Prostopadły(c,c,-a-b) lub (-b-c,a,a) zależnie od wartości Normalnej

Teraz zastanawiam się jak sprawdzić czy wektor wskazuje na trójkąt i jak go odwrócić.
« Ostatnia zmiana: Grudzień 01, 2012, 03:18:19 wysłana przez Degnir »