Autor Wątek: Niedokładne obroty w silniku fizycznym  (Przeczytany 810 razy)

Offline reidar

  • Użytkownik

# Lipiec 09, 2010, 15:10:51
Pisząc sobie mały silnik fizyczny (ogólny zarys zaczerpnąłem z tutorialu NeHe) mam mały problem z obrotami. Sytuacja wygląda następująco - w każdym wykonaniu głównej pętli programu wywołuję sobie funkcję:
       void Operate(){
            timer.Update();
            acumulator += (timer.thisTime - timer.previousTime) * slowMotionRatio;
            while(acumulator > timeStep){
            Init();
            Solve();
            Simulate(timeStep);
            acumulator -= timeStep; }
            }

(na razie funkcja Solve jest pusta).
Wcześniej w programie ustawiam sobie prędkość kątową przykładowego obiektu na PI w osi Y.
Jeżeli zmienną timeStep ustawię na 1.0 to mój obiekt za każdym uaktualnieniem fizyki obraca się o 180 stopni czyli wszystko jest OK. Jeżeli ustawię tą zmienną na np. 0.03 prędkośc kątowa wyraźnie ulega zmniejszeniu (w ciągu 1 s ciało nie obraca się o 180 stopni a mniej).
Czy może to być wina niedokładnego timera (używam timera SDL który ma dokładność 1ms)?

Offline Mr. Spam

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

Offline menajev

  • Użytkownik
    • Karate Inowrocław

# Lipiec 09, 2010, 16:09:29
Jakiego typu jest 'acumulator'?
Timer SDL'a z tego co pamiętam zwraca wartości do typu int, więc jeśli o tym zapomniałeś, to przy niecałkowitym timeStep może być różnie.

Offline reidar

  • Użytkownik

# Lipiec 09, 2010, 16:14:44
acumulator ma typ double. W moim timerze przy każdym uaktualnieniu czasy zamieniane są na wyrażone w sekundach czyli w przypadku timera SDL
thisTimeSub = SDL_GetTicks();
          thisTime = (double)thisTimeSub / 1000.0;
gdzie thisTime to zmienna z której ostatecznie korzystam w programie

Offline DrUiD

  • Użytkownik
    • HaCra Team

# Lipiec 09, 2010, 16:21:59
pod wind32 sdl uzywa queryperformancecounter wiec jest teoretycznie ok.. problem ze wzraca 'tick'i co powoduje utrate Twojego czasu..

zrob sobie wlasny timer