Autor Wątek: Delta time  (Przeczytany 1872 razy)

Offline Noobek

  • Użytkownik

# Maj 23, 2010, 21:51:59
Chce zaimplementowac prawdziwa fizyke, ale natknolem sie na problem z delta time. Licze ja z takiego wzoru:
dt = ( dt + ( czas jaki jest teraz - czas ostatniej aktualizacji ) ) / 1000 / 2 ;

Tak jakos wyczytalem w toturialach, ale za zadne skarby ludek nie chce sie ruszyc, wiec chyba robie cos zle. Moglby mi jakis dobry czlowiek podpowiedziec co?

Wrzemieszczenie liecze z wzoru x = x * predkosc * dt;

Wszystkie wartosci sa typu double.

Offline Mr. Spam

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

Offline menajev

  • Użytkownik
    • Karate Inowrocław

# Maj 23, 2010, 21:59:13
dt = czas teraz - czas w poprzedniej klatce.
Dodatkowe '/x' dajesz, jeśli ci za szybko działa. Więc jeśli tutaj się w ogóle nie rusza, to pewnie ta wartość jest za duża (mianownik).

Offline cybek

  • Użytkownik
    • Strona domowa!

# Maj 23, 2010, 21:59:48
delta=(aktualnyczas-deltatime)/1000.0f;
deltatime=aktualnyczas;

Offline Noobek

  • Użytkownik

# Maj 23, 2010, 22:17:29
Dzieki wszystkim! Uporalem sie z tym.

Offline K'Aviash

  • Użytkownik

# Maj 23, 2010, 22:35:45
Natknąłem się na takie coś ciekawego, może się przyda ;D
http://temporal.pr0.pl/devblog/artykuly/jak-nalezy-pisac-aktualizacje-stanu-gry/

Offline Reg

  • Administrator
    • Adam Sawicki - Home Page

# Maj 24, 2010, 20:51:21
Związany z tym tematem artykuł napisał też Xion:
"Pętla czasu rzeczywistego"
http://xion.org.pl/productions/texts/coding/game-programming/real-time-loop/

Offline yarpen

  • Użytkownik

# Maj 24, 2010, 20:57:35
Oba artykuly pomijaja dosyc istotna kwestie interpolacji dla renderingu pomiedzy klatkami symulacji. Lepszy jest ten: http://flipcode.com/archives/Main_Loop_with_Fixed_Time_Steps.shtml

Offline Avaj

  • Użytkownik

# Maj 25, 2010, 07:47:43

Offline .:NOXY:.

  • Użytkownik
    • Profil

# Maj 25, 2010, 08:37:40
No to zalezy jaka fizyka ;) Bo jak nie walsna np physX ktory to ma w sobie wbudowane to sie dziwne rzeczy moga dziac ;p

Offline Reg

  • Administrator
    • Adam Sawicki - Home Page

# Maj 25, 2010, 20:08:20
Gaffer on Games na swojej stronie proponuje świetne rozwiązanie, ale równocześnie skomplikowane do zrealizowania. Nie każdy początkujący będzie w stanie tak wyobrazić sobie stan swojej gry, żeby w swoim kodzie rozdzielić logikę od renderingu i to wszystko w ten sposób interpolować. Poza tym nie zawsze to jest faktycznie potrzebne. Jeśli nie robimy jakiejś zaawansowanej matematycznie fizyki, w której niestały krok czasowy powoduje błędy w symulacji, to zwykła delta t często wystarcza.

Offline raver

  • Użytkownik
    • Moja strona domowa.

# Maj 26, 2010, 11:01:10
Może mi ktoś powiedzieć, po co interpolować stany gry (chodzi mi o arta Gaffer on Games)? Przecież i tak ma tam aktualizację 100x na sekundę, więc nie będzie to w ogóle odczuwalne (a może się mylę?).

pozdro

Offline TeMPOraL

  • Użytkownik
    • devBlog

# Maj 26, 2010, 12:07:08
Ja w sumie do końca jeszcze nie załapałem czegoś w tej interpolacji - dobrze mi się wydaje, że ona z grubsza dubluje wymagania pamięciowe na dane i obliczenia (oblicza się transformacje wszystkich obiektów fizycznych w renderingu jako interpolacja między dwoma stanami tych obiektów, z chwil t oraz t + dt)?

Offline msieradzki

  • Użytkownik

# Maj 26, 2010, 13:36:24
Liniowo interpolujesz stan (pozycję/rotację) z 2 klatek przesłanych przez serwer. Punkt, który chcesz w ten sposób uzyskać to obecny czas - opóźnienie (takie, żeby zawsze 2 klatki były np. 100ms).

W Source masz CInterpolatedVar, które robi 90% tej zabawy za ciebie:

abstract_class IInterpolatedVar
{
public:
        virtual          ~IInterpolatedVar() {}

        virtual void Setup( void *pValue, int type ) = 0;
        virtual void SetInterpolationAmount( float seconds ) = 0;

        // Returns true if the new value is different from the prior most recent value.
        virtual void NoteLastNetworkedValue() = 0;
        virtual bool NoteChanged( float changetime, bool bUpdateLastNetworkedValue ) = 0;
        virtual void Reset() = 0;

        // Returns 1 if the value will always be the same if currentTime is always increasing.
        virtual int Interpolate( float currentTime ) = 0;

        virtual int      GetType() const = 0;
        virtual void RestoreToLastNetworked() = 0;
        virtual void Copy( IInterpolatedVar *pSrc ) = 0;

        virtual const char *GetDebugName() = 0;
        virtual void SetDebugName( const char* pName )  = 0;
};

A interpoluje się po to, żeby klient był niezależny od tego jak często serwer uaktualnia stan gry (i go wysyła). Domyślnie w Source klient dostaje 20 aktualizacji na sekundę od serwera. W sumie to mogłem od razu dać linka: :P
http://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking
« Ostatnia zmiana: Maj 26, 2010, 13:44:23 wysłana przez msieradzki »

Offline TeMPOraL

  • Użytkownik
    • devBlog

# Maj 26, 2010, 16:15:30
Naaaaajs :)
Dzięki za linka, chętnie poczytam :).

Offline Sethis

  • Użytkownik

# Maj 26, 2010, 17:00:05
Czy ktoś tutaj wspominal o programowaniu sieciowym? O.o
Chodziło chyba o interpolacje renderingu przy stałym kroku czasowym, wprawdzie zagadnienie podobne, ale inaczej się je rozwiązuje.