2014-01-07 24 views
0

我試圖在恆定的時間間隔後依次旋轉一個紅色的三角形和一個綠色的三角形。我試了下面的代碼,時間間隔不是恆定的。我找不出問題所在。Glut:如何爲均勻運動產生恆定的時間間隔?

static void display(void) 
{ 
    now=glutGet(GLUT_ELAPSED_TIME); 
    elapsedTime = now - interval; 

    if(flag) 
    { 
     if(now%3000==0) 
     { 
      flag=false; 

     } 

     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
     glColor3f(1,0,0); 
     glRotatef(0.1,0.0,0.0,1.0); 
     glBegin(GL_TRIANGLES); 
     glVertex3f(-0.5f, 0.5f, -5.0f); 
     glVertex3f(-1.0f, 1.5f, -5.0f); 
     glVertex3f(-1.5f, 0.5f, -5.0f); 
     glEnd(); 
     glutSwapBuffers(); 

    } 
    else 
    { 
     if(now%3000==0) 
     { 
      flag=true; 
     } 

     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
     glColor3f(0,1,0); 
     glRotatef(-0.1,0.0,0.0,1.0); 
     glBegin(GL_TRIANGLES); 
     glVertex3f(-0.5f, 0.5f, -5.0f); 
     glVertex3f(-1.0f, 1.5f, -5.0f); 
     glVertex3f(-1.5f, 0.5f, -5.0f); 
     glEnd(); 
     glutSwapBuffers(); 

    } 

} 

回答

4

在什麼之前,你有沒有嘗試過調試101:打印關鍵變量?我很有信心,如果你做cout << now % 3000 << endl你可以自己找到問題的根源。

對於答案:

now % 3000 == 0 

似乎不是一個好主意。

你怎麼能確定glutGet(GLUT_ELAPSED_TIME)將增加爲1,2,3 ......?如果渲染一幀需要2毫秒,會發生以下情況: 2998,2999,3001?你剛剛失去了一個開關時間。

由於不可預測的重繪時間,關於渲染時間很難精確。

在你的情況,一個很好的近似可以是:

now % 6000 < 3000 

這應該很好地工作,因爲三分球是不是在該顯示器將被稱爲頻率大得多。

在大多數應用然而,我們要連續運動,最好的選擇是使移動成正比的實際時間流逝,與類似的代碼:

float dt; 
int t, oldT; 

t = glutGet(GLUT_ELAPSED_TIME); 
dt = (t - oldT)/1000.0; 
oldT = t; 
drawTriangle(rotationSpeed * dt);