2016-02-04 42 views
1

我有一個處理輸入的問題,以在屏幕上旋轉對象。OpenGL物體在PC上以正常速度旋轉,但在筆記本上速度非常快

我編寫的一切:我的桌面上它旋轉時,它應該和你可以操縱在三維空間中的對象。

在我的筆記本電腦然而,當我嘗試旋轉對象,它實際上旋轉如此之快,你可以勉強甚至看到它。我說的每秒鐘幾十轉。

我的問題是...爲什麼?爲什麼它在我的電腦上以正常速度旋轉,但在我的筆記本電腦上以瘋狂的高速旋轉?

我用每按一次鍵的旋轉是0.1 ...我的電腦上它旋轉速度不夠快,能夠控制或,但在我的筆記本電腦(和平板電腦,我測試了它在平板電腦以及),它只是旋轉方式太快!我能夠通過將旋轉量更改爲glm :: radians(1.0f)並以正常速度旋轉來修復它,但是在我的PC上,它比我想要的要慢。

我能想到的唯一的事情有事情做與增量時間和渲染速度(我計算在了我的相機控制)。

這裏是我的參考旋轉功能...

鍵盤迴調函數(注:我有布爾的全局數組稱爲鍵[],我用它來查看是否被按下某個鍵時)

// Handle the keyboard input 
void keyPressed(GLFWwindow *_window, int key, int scancode, int action, int mods) { 

// Close window with escape 
if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) 
    glfwSetWindowShouldClose(window, GL_TRUE); 
// Change render to show points only with P 
if (key == GLFW_KEY_P && action == GLFW_PRESS) 
    glPolygonMode(GL_FRONT_AND_BACK, GL_POINT); 
// Change render to show filled in texture with T 
if (key == GLFW_KEY_T && action == GLFW_PRESS) 
    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); 
// Change render to show "wirefram" mesh with W 
if (key == GLFW_KEY_W && action == GLFW_PRESS) 
    glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); 

// Array of keys, if key is being held down, sets index corresponding to appropriate integer related to key to true, and false when key is released 
if (key >= 0 && key < 1024) 
{ 
    if (action == GLFW_PRESS) 
     keys[key] = true; 
    else if (action == GLFW_RELEASE) 
     keys[key] = false; 
} 
return; 
} 

和旋轉功能(注意:點擊[0]是布爾的另一個數組我使用,以查看是否鼠標左鍵被推動):

// rotate object based on keyboard input 
// Left mouse button must not be held down for this to work 
// Creates a matrix containing the appriopriate transformation, and this is later multipled to the model matrix 
void rotate_object(glm::mat4 &transform) 
{ 
// Rotate along z axis (left and right, like a barrel roll) 
if (!click[0] && keys[GLFW_KEY_LEFT]) 
    transform = glm::rotate(transform, glm::radians(1.0f), glm::vec3(0.0f, 0.0f, 1.0f)); 
if (!click[0] && keys[GLFW_KEY_RIGHT]) 
    transform = glm::rotate(transform, glm::radians(-1.0f), glm::vec3(0.0f, 0.0f, 1.0f)); 
// Rotate along x axis (up and down, like a flip) 
if (!click[0] && keys[GLFW_KEY_UP]) 
    transform = glm::rotate(transform, glm::radians(1.0f), glm::vec3(1.0f, 0.0f, 0.0f)); 
if (!click[0] && keys[GLFW_KEY_DOWN]) 
    transform = glm::rotate(transform, glm::radians(-1.0f), glm::vec3(1.0f, 0.0f, 0.0f)); 
// Rotate along y axes (make object spin) 
if (!click[0] && keys[GLFW_KEY_K]) 
    transform = glm::rotate(transform, glm::radians(1.0f), glm::vec3(0.0f, 1.0f, 0.0f)); 
if (!click[0] && keys[GLFW_KEY_L]) 
    transform = glm::rotate(transform, glm::radians(-1.0f), glm::vec3(0.0f, 1.0f, 0.0f)); 
} 

感謝您對放!

感謝,

+1

此循環的每次迭代都有固定的旋轉。有時間添加一些定時器! – usr2564301

+1

這就是我在寫問題的時候想到的......我用delta時間讓我的相機運動平滑,我意識到現在我必須爲對象操作做同樣的事情! – waffledave

回答

4

您在使用旋轉的恆定值的對象,沒有關於自上次旋轉所經過的時間量。當你在不同的機器上運行你的代碼時,你將以不同的旋轉速度結束,這取決於機器處理你的繪圖和更新循環的速度。

您需要跟蹤時間 - 保持上次更新的時間以及當前更新,並調用差異「時間增量」。您的旋轉需要乘以「時間增量」,以便即使兩臺機器以不同的速度處理代碼,對象仍然以相同的速度旋轉。

+0

謝謝......這是絕對的問題。最糟糕的是,我在我的程序中使用了delta時間來控制攝像機的移動,但我並沒有想到將它用於物體旋轉!問題是我只學習了相機運動和德爾塔時間後,我已經學會了如何旋轉! – waffledave

0

由於有硬件沒有任何細節或在所有使用的系統,我認爲在性能上的顯著差異來自要麼

  • 不同的圖形硬件或
  • 不同的驅動對於所述圖形硬件(或兩者)

當相同的代碼在兩個系統上以不同的性能運行時nd你的代碼似乎不是原因,這是下一個最好的事情。

我假設你的輸入和繪製函數是迭代執行的;因此只有在繪圖函數已經返回時才能處理下一個輸入。在較慢的圖形硬件/機器上繪圖可能會花費更長的時間。這就是你觀察到的不同之處可能導致的原因。

試用兩個glxgears,看看FPS你。如果你的電腦比你的筆記本電腦慢得多(在10^1或更大的範圍內),那麼這就是你的問題。

+0

是的,這是現在的問題,我意識到我需要調整它。我覺得有趣的是,我個人電腦似乎比我的平板電腦執行速度慢......我的電腦是一款具有強大圖形硬件的遊戲PC。難道是因爲我的平板電腦屏幕是10英寸,而我的電腦顯示器是27英寸?無論平臺如何,當我最大化窗口時,我都會注意到它會變慢。更大的屏幕=更多的繪圖? – waffledave

2

您必須利用幀之間的時間戳。爲此GLFW有一個便攜式glfwGetTime。你的幀deltacurrent_time - previous_time,你用它來更新你的(動畫)狀態。然後在下一幀之前設置previous_time = current_time,然後重複該過程。

我也考慮使用glfwSwapInterval(1)來等待vsync--只要你的GPU驅動程序支持它。否則,你只是在做不必要的更新。

相關問題