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

Aktuelle Zeit: Fr Jul 18, 2025 00:24

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



Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Timebased Rendering
BeitragVerfasst: So Nov 30, 2003 17:12 
Offline
DGL Member
Benutzeravatar

Registriert: So Okt 26, 2003 20:07
Beiträge: 249
Hi

Ich arbeite immernoch an meiner engine, habe mein letztes problem gelöst
und habe wieder eins. um welches es sich handelt könnt ihr aus der überschrift sicher
erkennen.

aber jetzt zum thema:
obwohl ich in jedem rendering-vorgang den zeitfaktor etc wie im tutorial neu berechne,
sind bei steigenden / fallenden frameraten die geschwindigkeiten immer anders. ich speichere die freq des timers am anfang in eine variable ab.
dann berechne ich den zeitfaktor, dann beweg ich mich damit.

Code:
  1.  
  2. QueryPerformanceCounter(QPCStartCount);
  3.  
  4.      glLoadIdentity;
  5.      glRotatef(xwinkel, 1, 0, 0);
  6.      glTranslatef(0, -1.01, 0);
  7.  
  8.  
  9.      glPushMatrix;
  10.      glPopMatrix;
  11.  
  12.  
  13.      glRotatef(winkel, 0, 1, 0);
  14.      glCallList(SBox);
  15.      glTranslatef(tx, 0, z);
  16.  
  17.      DrawObject;
  18.  
  19.  
  20.      QueryPerformanceCounter(QPCEndCount);
  21.  
  22.  
  23.  
  24.      ZeitFaktor := QPCEndCount - QPCStartCount;
  25.      ZeitFaktor := Zeitfaktor / PerfCountFreq * 100;
  26.      sw := Zeitfaktor * GW;
  27.      gwinkel := WNKL * Zeitfaktor;
  28.  
  29.  
  30.  
  31.  
  32.      if (keys[VK_UP]) then
  33.      begin
  34.           z := z + (sw * cos(-winkel * PI / 180));
  35.           tx := tx + (sw * sin(-winkel * PI / 180));
  36.  
  37.      end;
  38.  
  39.      if (keys[VK_DOWN]) then
  40.      begin
  41.           z := z - (sw * cos(-winkel * PI / 180));
  42.           tx := tx - (sw * sin(-winkel * PI / 180));
  43.      end;
  44.  
  45.      if (keys[VK_LEFT]) then
  46.      begin
  47.           winkel := winkel - gwinkel;
  48.      end;
  49.  
  50.      if (keys[VK_RIGHT]) then
  51.      begin
  52.           winkel := winkel + gwinkel;
  53.      end;
  54.  


xwinkel ist nur der winkel, der das bild um die x-achse rotieren lässt, also nicht wichtig.

_________________
I'm not the signature, I'm just cleaning the floor...

Derzeitiges Projekt:
FireBlade Particle Engine (Release R2 2009.06.29)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 01, 2003 09:53 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
hmm, also wie ich sehe ist das deine render routine, wieso machst du da am anfang nen QueryPerformanceCounter und vor den berechnungen ?

hier wie ich es machen würde:

Code:
  1.  
  2. procedure Initialize;
  3. begin
  4.   QPC.Init;
  5. end;
  6.  
  7. procedure Calculate;
  8. begin
  9.   QPC.Calculate;
  10.  
  11.   // DeltaTime = Zeitfaktor
  12.   sw := QPC.DeltaTime * GW;
  13.   gwinkel := WNKL * QPC.DeltaTime;  
  14. end;
  15.  
  16. procedure HandleInput;
  17. begin
  18.   if (keys[VK_UP]) then
  19.   begin
  20.     z := z + (sw * cos(-winkel * PI / 180));
  21.     tx := tx + (sw * sin(-winkel * PI / 180));
  22.   end;
  23.  
  24.   if (keys[VK_DOWN]) then
  25.   begin
  26.     z := z - (sw * cos(-winkel * PI / 180));
  27.     tx := tx - (sw * sin(-winkel * PI / 180));
  28.   end;
  29.  
  30.   if (keys[VK_LEFT]) then
  31.   begin
  32.     winkel := winkel - gwinkel;
  33.   end;
  34.  
  35.   if (keys[VK_RIGHT]) then
  36.   begin
  37.     winkel := winkel + gwinkel;
  38.   end;
  39. end;
  40.  
  41. procedure Render;
  42. begin
  43.   glLoadIdentity;
  44.   glRotatef(xwinkel, 1, 0, 0);
  45.   glTranslatef(0, -1.01, 0);
  46.  
  47.   glPushMatrix;
  48.   glPopMatrix;
  49.  
  50.   glRotatef(winkel, 0, 1, 0);
  51.   glCallList(SBox);
  52.   glTranslatef(tx, 0, z);
  53.  
  54.   DrawObject;
  55. end;
  56.  
  57. procedure TForm1.OnIdle(var Done : Boolean; Sender : TObject);
  58. begin
  59.   Calculate;
  60.   HandleInput;
  61.   Render;
  62. end;
  63.  
  64. procedure TForm1.Create(Sender : TObject);
  65. begin
  66.   Initialize;
  67. end;
  68.  


und hier die Klasse dazu:

Code:
  1.  
  2. unit HighResCounter;
  3.  
  4. interface
  5.  
  6. uses
  7.   Windows;
  8.  
  9. type
  10.   TR3DHighResolutionCounter = object
  11.   private
  12.     m_Frequency,
  13.     m_Last_Time         : Int64;
  14.     m_Time_Scale        : Single;
  15.     m_Delta_Time        : Single;
  16.     m_ElapsedTime       : Single;
  17.     m_Counter_Available : Boolean;
  18.     m_CurrentTime       : Int64;
  19.   public
  20.     procedure Init;
  21.     procedure Calculate;
  22.     function DeltaTime : Single;
  23.     function CurrentTime : Int64;
  24.     function LastTime : Int64;
  25.   end;
  26.  
  27. implementation
  28.  
  29. procedure TR3DHighResolutionCounter.Init;
  30. begin
  31.   // High Resolution Counter Initialisieren
  32.   m_Counter_Available := false;
  33.   if QueryPerformanceFrequency(m_Frequency) = false then
  34.   begin
  35.     m_Last_Time := GetTickCount;
  36.     m_Time_Scale := 0.001;
  37.   end
  38.   else
  39.   begin
  40.     m_Counter_Available := true;
  41.     m_Time_Scale := 1.0 / m_Frequency;
  42.     QueryPerformanceCounter(m_Last_Time);
  43.   end;
  44. end;
  45.  
  46. procedure TR3DHighResolutionCounter.Calculate;
  47. begin
  48.   if m_Counter_Available then QueryPerformanceCounter(m_CurrentTime)
  49.   else m_CurrentTime := GetTickCount;
  50.  
  51.   m_Delta_Time := (m_CurrentTime - m_Last_Time) * m_Time_Scale;
  52.   m_Last_time := m_CurrentTime;
  53.  
  54.   m_ElapsedTime := (m_CurrentTime - m_Last_Time);
  55. end;
  56.  
  57. function TR3DHighResolutionCounter.DeltaTime : Single;
  58. begin
  59.   Result := m_Delta_Time;
  60. end;
  61.  
  62. function TR3DHighResolutionCounter.CurrentTime : Int64;
  63. begin
  64.   Result := m_CurrentTime;
  65. end;
  66.  
  67. function TR3DHighResolutionCounter.LastTime : Int64;
  68. begin
  69.   Result := m_Last_Time;
  70. end;
  71.  


hoffe mal das hilft weiter.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Dez 10, 2003 17:14 
Offline
DGL Member

Registriert: Mo Nov 03, 2003 20:23
Beiträge: 66
Also ich habe das so gemacht:

Ich habe einfach am Anfang eines Frames die Zeit in eine Var gesichert.

Das heisst, dass du beim nächsten Frame mittels CurTime - LastTime die Zeit hast, die das Frame gebraucht hat. Die Dividiere ich einfach von jedem Vorgang, der die Camera oder irgendein Objekt bewegt...

So hast du bei 30FPS die Tatsächlich doppelte Geschwindikkeit beim laufen, wie jemand, der 60FPS hat...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Dez 12, 2003 15:20 
Offline
DGL Member

Registriert: Mo Nov 03, 2003 20:23
Beiträge: 66
Erm... Korrigiere:

Du musst sie zu den Vectorten hinzumultiplizieren!

also so:

Timer.Last := myTimerProc - TimerNow;
Timer.Now := myTimerProc;

VecX := VecX + 15 * (Timer.Last/1000);


So hast du, wenn du einen FPS hast die normale Movementgeschwindigkeit... (Also 15 * 1)

Alles andere, höhere FPSzahlen drücken dann deine Movementgeschwindigkeit in den Keller...

grx_cyan


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 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.007s | 16 Queries | GZIP : On ]