Skocz do zawartości
Zamknięcie Forum PC LAB

Szanowny Użytkowniku,

Informujemy, że za 30 dni tj. 30 listopada 2024 r. serwis internetowy Forum PC LAB zostanie zamknięty.

Administrator Serwisu Forum PC LAB - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie: wypowiada całość usług Serwisu Forum PC LAB z zachowaniem miesięcznego okresu wypowiedzenia.

Administrator Serwisu Forum PC LAB informuje, że:

  1. Z dniem 29 listopada 2024 r. zakończy się świadczenie wszystkich usług Serwisu Forum PC LAB. Ważną przyczyną uzasadniającą wypowiedzenie jest zamknięcie Serwisu Forum PC LAB
  2. Dotychczas zamowione przez Użytkownika usługi Serwisu Forum PC LAB będą świadczone w okresie wypowiedzenia tj. do dnia 29 listopada 2024 r.
  3. Po ogłoszeniu zamknięcia Serwisu Forum od dnia 30 października 2024 r. zakładanie nowych kont w serwisie Forum PC LAB nie będzie możliwe
  4. Wraz z zamknięciem Serwisu Forum PC LAB, tj. dnia 29 listopada 2024 r. nie będzie już dostępny katalog treści Forum PC LAB. Do tego czasu Użytkownicy Forum PC LAB mają dostęp do swoich treści w zakładce "Profil", gdzie mają możliwość ich skopiowania lub archiwizowania w formie screenshotów.
  5. Administrator danych osobowych Użytkowników - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie zapewnia realizację praw podmiotów danych osobowych przez cały okres świadczenia usług Serwisu Forum PC LAB. Szczegółowe informacje znajdziesz w Polityce Prywatności

Administrator informuje, iż wraz z zamknięciem Serwisu Forum PC LAB, dane osobowe Użytkowników Serwisu Forum PC LAB zostaną trwale usunięte ze względu na brak podstawy ich dalszego przetwarzania. Proces trwałego usuwania danych z kopii zapasowych może przekroczyć termin zamknięcia Forum PC LAB o kilka miesięcy. Wyjątek może stanowić przetwarzanie danych użytkownika do czasu zakończenia toczących się postepowań.

Temat został przeniesiony do archiwum

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

bartek161616

Podstawy fizyki w grach komputerowych

Rekomendowane odpowiedzi

Znacie jakieś dobre kursy, tutoriale itp. dotyczące tego jak zasymulować podstawowe prawa fizyki w grze ?

Jestem ciemny w tym temacie, a chciałbym się wziąć za napisanie własnej, prostej gry 2D.

Znam C++ i Allegro. Teraz pora, żeby zaznajomić się z symulacją fizyki.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Ogolnie symulacja zjawisk fizycznych(opartych o kolizje) sklada sie z 2 czesci:

-wykrywanie kolizji(collision detection)

-reagowanie na kolizje(collision response)

 

W tym pierwszym musisz zatroszczyc sie o implementacje algorytmu, ktory bedzie sprawdzac czy dowolne dwa obiekty nakladaja sie na siebie.

Najprosciej miec liste obiektow i sprawdzac czy ich bounding spheres/circles sie nachodza.Dziala tak dlugo na scenie nie ma wielu obiektow i nie jest wymagana duza dokladnosc detekcji. Do bardziej wymagajacych symylacji uzywa sie roznych struktur typu drzewa czworkowe, osemkowe lub bsp.

 

W drugim punkcie zajmujesz sie juz tworzeniem modelu fizycznego. Okreslasz jak zmieniaja sie parametry obiektu gdy ten zderzy sie z innym. Oprogramowywujesz zjawiska typu slizganie, odbicie czy toczenie.

 

Ogolnie, jezeli chodzi o fizyke w grach to jest to dosc skomplikowany temat. Implementacja prostego modelu fizycznego wcale nie jest taka prosta jak sie na poczatku wydaje.

 

A co do tutoriali to szukaj ich na stronach poswieconych gamedev: wyzej wspomniany gamedev.net, gamasutra.com, ziggyware.com etc.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Gość PL_kolek
Ogolnie, jezeli chodzi o fizyke w grach to jest to dosc skomplikowany temat. Implementacja prostego modelu fizycznego wcale nie jest taka prosta jak sie na poczatku wydaje.

 

Sam właśnie odpadłem przy próbie symulowania odbicia 2 kul na stole bilardowym. Przejrzysty opis po angielsku z jakiegoś forum mnie przerósł, a kopiowanie wzorów bez zrozumienia to nie dla mnie. Snake był zdecydowanie prostszy do napisania :E

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Wiem co czujesz. Bardzo dlugo nie potrafilem rozwiazac tego problemu. Dopiero na przedmiocie "Fizyka komputerowa" prowadzacy rozjasnil pewne koncepcje, ktore potem jako tako dalo sie zaadoptowac w symulacjach komputerowych. Grunt to zrozumiec temat :P

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Sam właśnie odpadłem przy próbie symulowania odbicia 2 kul na stole bilardowym. Przejrzysty opis po angielsku z jakiegoś forum mnie przerósł, a kopiowanie wzorów bez zrozumienia to nie dla mnie. Snake był zdecydowanie prostszy do napisania

 

Rozumiem, że kule były w 3D. Ja chcę zaimplementować fizykę dla 2D. Coś ala Mario, czyli jakiś ludzik sobie chodzi a widać go z boku. Wtedy chyba będzie łatwiej to zrobić ?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Rozumiem, że kule były w 3D. Ja chcę zaimplementować fizykę dla 2D. Coś ala Mario, czyli jakiś ludzik sobie chodzi a widać go z boku. Wtedy chyba będzie łatwiej to zrobić ?

Jasne, akurat takie rzeczy są bardzo proste do implementacji - wlasciwie jedyne co musisz liczyc to pęd postaci i grawitacja, oraz oczywiscie detekcja kolizji. A co do bilarda, to detekcja kolizji w 2D jest również bardzo trudna - o ile jeszcze 2 kule są dość proste, to jeśli mamy cały zestaw kul bardzo blisko siebie, to obliczenie które odbicia nastąpia najpierw i jak rozłożą się siły jest trudne.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Gość PL_kolek
Wiem co czujesz. Bardzo dlugo nie potrafilem rozwiazac tego problemu. Dopiero na przedmiocie "Fizyka komputerowa" prowadzacy rozjasnil pewne koncepcje, ktore potem jako tako dalo sie zaadoptowac w symulacjach komputerowych. Grunt to zrozumiec temat :P

Właśnie chciałem sobie poprogramować coś interesującego co by mnie rozwinęło, ale... wiedzy za mało chyba ;)

 

Rozumiem, że kule były w 3D. Ja chcę zaimplementować fizykę dla 2D. Coś ala Mario, czyli jakiś ludzik sobie chodzi a widać go z boku. Wtedy chyba będzie łatwiej to zrobić ?

2D - zwykły SDL - co nie zmienia faktu, że prawa są te same. traktowałem koło jako bilę widzianą od góry, pomijałem wszelkie tarcia i rotacje czyste, 100% sprężyste odbicia.

 

Jasne, akurat takie rzeczy są bardzo proste do implementacji - wlasciwie jedyne co musisz liczyc to pęd postaci i grawitacja, oraz oczywiscie detekcja kolizji. A co do bilarda, to detekcja kolizji w 2D jest również bardzo trudna - o ile jeszcze 2 kule są dość proste, to jeśli mamy cały zestaw kul bardzo blisko siebie, to obliczenie które odbicia nastąpia najpierw i jak rozłożą się siły jest trudne.

Zakładając, że to luźna platformówka to nie musisz w zasadzie znać żadnej fizyki - możesz stworzyć na potrzeby gry własną, czyli uproszczoną symulację normalnej fizyki. Zamiast liczyć siły możesz po prostu popdczas skoku stopniowo spowalniać ludzika, a potem przyspieszać go w dół ;)

 

Myślałem nad tym, by po zaimplementowaniu 2 bil dodać pozostałe. Gdyby nie to, że już wymiękłem, to myślałem żeby po prostu sprawdzać gdzie i jak zaszła kolizja 2 kul i obliczyć prędkości. nie wiem jak to by się zachowywało ;)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

na pewno sporo o tym znajdziesz tez na 'warsztacie' (wpisz w google)

 

btw ile sie bawisz w c++ ze piszesz ze znasz ? (ot tak sie pytam)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Impelemtnacja fizyki w w grze ala Mario:

a) definiujesz stałe pole publiczne G (wartosc sily grawitacji)

b) pole IsJump (jesli true, to znaczy, ze postac skoczyla, jesli false, no coz to nie skoczyla)

c) Dwuwymiarowy Vector, ktory będzie przechwywał, maksymalne odbicie.

d) Kolejny Vector, ktory będzie miał szybkość wznoszenia się postaci (tutaj musisz poszukac wzoru w ksiaze, i z niego poprostu obliczyć przyśpieszenie i umieścić wynik w pixelach w Vectorze)

e) Ok, mamy juz obliczene z jaka predkoscia postac moze sie wznosic w gore, calosc AFAIK będziesz musial pomnozyc dodatkowo przez TimeElapse.Seconds (kazda gra, ma strukture ogromnej pętli ktora ciągle działa i zeby zachowac plynnosci, tego co dzieje sie na monitorze, trzeba uwzglednic czas dzialania gry, wiem z lekka pokręcone, ale radze poczytać na ten temat, jest to absolutnie bazowy koncept, bez niego nie ma co isc dalej).

f) kiedy dojdziesz do Peak (czyli postac wzniesie sie na maksymalna mozliwa wysokosc), musisz policzyc kolejny Vector, ktory będzie uwzględniać szybkośćopadania (jest ona rozna od szybkości wznoszenia).

 

Sposob impelementacji, zalezy od tego czego będziesz używał ;e.

 

Myślałem nad tym, by po zaimplementowaniu 2 bil dodać pozostałe. Gdyby nie to, że już wymiękłem, to myślałem żeby po prostu sprawdzać gdzie i jak zaszła kolizja 2 kul i obliczyć prędkości. nie wiem jak to by się zachowywało smilies/wink.gif

Zalezanie od tego, czego uzywasz do pisania, musisz uzyac BoundCircle (a nie BoundBox), bo efekt bedzie taki jakby sie dwa kwadraty odbijały. Tak czy inaczej efekt, będzie supełnie inny.

Generalnie, trzeba uwzglednic mase kuli, puscic przodem Ray, ktory sprawdzic, pod jakim kąte będzie sie odbijać kula (bez uwzględnienia jej masy), i potem dopiero zabrać sie za obliczanie odbicia. Ciezki temat, co by nie mowic ;e.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Zaimplmentowałem wszystko oprócz grawitacji bo by mi ludzik spadał na dno xD.

Wszystko odbywa się co frame. Wytłumaczy mi ktoś co z tym czasem ? Jak to się robi ?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Liczysz czas jaki uplynal od ostatniej klatki, a wszystkie wartości ustalasz dla pewnego czasu. Np dla 1/60 sekundy (czyli jednej klatki jeśli masz w grze włączony v-sync). Czyli przykładowo dla prędkości masz:

PredkoscNaKlatke = 2.0f;

PredkoscNaSekunde = PredkoscNaKlatke * 60.0f;

 

Gdy liczysz np przesuniecie bohatera:

Pozycja += PredkoscNaSekunde * UplyneloSekund;

 

Oczywiscie zazwyczaj uplynelo sekund to bedzie wlasnie 1/60, więc postać będzie zmieniać pozycje z prędkością 2 pixele na klatke - ale jeśli np. framerate spadnie dwukrotnie, to przesunięcie na klatke zwiększy się dwukrotnie i szybkość bohatera zostanie taka sama.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Ciezki temat, co by nie mowic ;e.

 

Nie próbowałem sobie tego rozpisywać, ale generalnie nie widzę tutaj nic co by wykraczało poza program liceum (przynajmniej tego przed reformą). Obliczenie punktu odbicia to sporo geometrii analitycznej, nigdy tego nie lubiłem, ale powinno się ogaranąć. Natomiast wyliczenie nowych prędkości to klasyczne zastosowane zasady zachowania pędu i zachowania energii w odbiciu sprężystym, pewnie w porównaniu z liczeniem punktu zetknięcia kul to już betka.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Gość PL_kolek
Nie próbowałem sobie tego rozpisywać, ale generalnie nie widzę tutaj nic co by wykraczało poza program liceum (przynajmniej tego przed reformą). Obliczenie punktu odbicia to sporo geometrii analitycznej, nigdy tego nie lubiłem, ale powinno się ogaranąć. Natomiast wyliczenie nowych prędkości to klasyczne zastosowane zasady zachowania pędu i zachowania energii w odbiciu sprężystym, pewnie w porównaniu z liczeniem punktu zetknięcia kul to już betka.

 

Generalnie fizyka w moim LO to na najwyższym poziomie nie jest. Zazwyczaj to nadrabiam tym, że z matmy radzę sobie bardzo dobrze. Zasada zachowania pędu to chyba moja ulubiona (nie wiem czemu) zasada, ale obliczenia kierunków wektorów jest mocno skomplikowane, nie robiłem tego nigdy, tym bardziej komputerowo. Strona z której brałem informacje chyba opisuje to bardzo dobrze (klik), ale jakoś tak nie mogę tego rozgryźc

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

W tak prostym przypadku to mozna zastosowac nawet ruch paraboliczny...

 

f(t) = (t-xPos)(t-xPos+velocity) gdzie t to czas a velocity jest wartoscia skalarna okreslajaca predkosc ludzika(ktora wplywa na odleglosc skoku).

 

Jest to oczywiscie najprostszy sposob, ktory nie uwzglednia mnostwa czynnikow, ale chyba powinien starczyc na poczatek.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

A mógłby mi ktoś wytłumaczyć bardziej łopatologicznie jak mam mierzyć czas itd... ?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Gość PL_kolek
Któraś tam lekcja SDLa z dla mnie dobrego kursu - olej, że to SDL, a skup się na zasadzie działania. Powinieneś zrozumieć ;)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Mniej więcej zrozumiałem zasadę.

 

przesunięcie = prędkość na sekundę * czas w sekundach

 

Tylko skąd wziąć timer i jak go użyć ?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Gość PL_kolek

W przypadku tego kursu, jest on opisany w którejś poprzedniej lekcji (konkretniej lekcje 12 i 13). Zawsze możesz samemu napisać kod obsługujący czas, starczy ci do tego

#include "ctime"

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
W przypadku tego kursu, jest on opisany w którejś poprzedniej lekcji (konkretniej lekcje 12 i 13). Zawsze możesz samemu napisać kod obsługujący czas, starczy ci do tego
#include "ctime"

 

W allegro jest jakiś timer... Tylko jak go użyć to nie wiem.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

W allegro z tego co pamiętam timery służą do wykonywania pewnych czynności co określony czas, a nie samego mierzenia ile czasu upłyneło (choć to też pewnie da się zrobić). Ale w standardowej bibliotece C++ wystarczy:

 

	time_t poczatek, koniec;
time(&poczatek);
time(&koniec);
double roznica = difftime( koniec,poczatek);

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Znów zaniepokoję was problemem. Coś dziwnego dzieje się z moją klasą i musiałem zacząć projekt od początku.

Przy tworzeniu nowego obiektu jego pola przyjmują dziwne wartości, choć ja nie zmieniałem tych wartości. Jest to bardzo dziwne, bo pierwszy raz się z tym spotykam. Czym może być spowodowane ?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Albo nie alokujesz pamięci, albo zwalniasz za wcześnie, albo pomieszales coś ze wskaźnikami. Możliwości jest do wyboru do koloru.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Na 99% problem z wskaźnikami, choć da się też w inny sposób osiągnąć taki efekt =] Zakomentuj wszystko co masz w main, i daj tam kod który tylko tworzy tą klase (najlepiej statycznie) i sprawdź czy dalej tak się dzieje.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Ostatnio przeglądający   0 użytkowników

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

×
×
  • Dodaj nową pozycję...