Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 11:14

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 25 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 13, 2008 15:58 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
nix danach, das ist da ja schon drin:
Code:
  1.   FTimestep := min((FCurrTime - FCalcTime) / FFrequency, FMinlimit);  // DeltaT


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 14, 2008 15:46 
Offline
DGL Member

Registriert: Sa Dez 30, 2006 20:52
Beiträge: 43
Programmiersprache: Delphi
Also das funktioniert bei mir auf Jedenfall jetzt. Da ich gleich IsFPS ausrechne muss ich nicht mit speziellen Werten rechnen, sondern kann gleich die maximalen FPS angeben:

Code:
  1.   Done := False;
  2.  
  3.   QueryPerformanceCounter(TNow);
  4.   IsFPS := RoundTo(Freq / (TNow - CalcTime), -2);
  5.  
  6.   if IsFPS > MaxFPS then
  7.   begin
  8.     Sleep(1);
  9.     Exit;
  10.   end;
  11.  
  12.   SFactor := (TNow - CalcTime) / Freq;
  13.  
  14.   Render;
  15.  
  16.   Timer := Timer + TNow - CalcTime;
  17.  
  18.   if Timer > Freq then
  19.   begin
  20.     Timer := Timer - Freq;
  21.     Caption := 'smOglympia - ' + FloatToStr(IsFPS) + ' FPS';
  22.   end;


Dieses Timer-Zeugs da dient dazu, dass die FPS-Anzeige nicht jedesmal aktualisiert wird und so schnell springt. Das ganze stabilisiert die Anzeige etwas.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Aug 15, 2008 09:24 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
Hast du jetzt Done:=false vergessen?

_________________
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Aug 15, 2008 13:33 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
Stimmt, mit dem Done := False stimmt die Regulierung, allerdings bekomme ich bei kleineren / größeren Frameraten eine andere Geschwindigkeit.

Wie gesagt führe ich meine Berechnungen so durch:
Code:
  1.   FPosition := v2f_add(FPosition, v2f_add(v2f_scale(FAcceleration, dt * dt * 0.5), v2f_scale(FVelocity, dt)));
  2.   FVelocity := v2f_add(FVelocity, v2f_scale(FAcceleration, dt));    
  3.   FVelocity := v2f_scale(FVelocity, friction);

Trotzdem variiert die Geschwindigkeit mit der Framezahl.

mfg


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Aug 15, 2008 17:44 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
deine Reibung ist nicht frameratenunabhängig implementiert.

_________________
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Aug 16, 2008 19:31 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
Muss ich die Reibung also mit dt multiplizieren ? Das (und dividieren) scheint nicht zu gehen.

€: so scheints zu gehen, ist das richtig ?
Code:
  1.   friction := 1 - ((1 - friction) * dt);


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Aug 16, 2008 20:27 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 02, 2002 15:41
Beiträge: 867
Wohnort: nahe Stuttgart
Zumindest physikalisch gesehen ist (Coloumbsche) Reibungskraft FR = µ * FN mit der Reibungszahl µ.
D.h. man kann es als Verzögerung (= negative Beschleunigung) ansehen: a = - µ * g.
g ist der Gravitationsortsfaktor bzw. je nach Anwendungsfall die normale Erdbeschleunigung ;). Ist die Auflageebene nicht mehr orthogonal zur Gravitationskraft käme für beide Rechnungen der Faktor cos(Neigungswinkel) hinzu.
Und natürlich sollte man aufpassen, dass die Reibung keine negativen Geschwindigkeiten erzeugt. Also nur abziehen, wenn v0 + (a - aR) * dt >= 0.

MfG


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Aug 17, 2008 09:16 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
Die Reibung ist also bei der Beschleunigung anzubringen und nicht bei der Geschwindigkeit ?
Wie würden meine Gleichungen dann richtig aussehen ?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Aug 17, 2008 22:43 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
Acc:=Acc-FricCoeff*Speed
mit r<0 Stärke der Reibung und m Masse. Denn Reibung ist eine Kraft (F=m*a) die entgegen der Bewegungsrichtung wirkt. Diese Rechnung ist für eine Reibung die proportional zur Geschwindigkeit ist.
Die Reibung am Boden ist allerdings konstant. Daher müsstest du dann Speed normieren:
Acc:=Acc-FricCoeff*norm(Speed)
Allerdings führt das bei geringer Geschwindigkeit zu Problemen dass die Geschwindigkeit um 0 fluktuiert, was du nochmal extra behandeln musst.

_________________
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Aug 18, 2008 09:25 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
ist speed die momentane Geschwindigkeit ? normieren bedeutet länge 1 ?

Ich hab allerdings auch keine Bodenreibung im klassischen Sinne, ich ändere einfach die Reibung wenn sich der Spieler in der Luft befindet.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 25 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: Bing [Bot] und 3 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.011s | 16 Queries | GZIP : On ]