2014-12-04 162 views
0

我有圍繞圓移動的對象。物體是魚。
的運動:OpenGL翻譯和旋轉對象

mesh->objectModelMatrix = glm::translate(glm::mat4(1.0f), glm::vec3(5.0f * sin(elapsedTime), initialY, 5.0f * cos(elapsedTime))); 

我需要計算旋轉(第一頭)向前移動的魚。 事情是這樣的:

mesh->objectModelMatrix = glm::rotate(mesh->objectModelMatrix, elapsedTime, glm::vec3(0.0f, 0.0f, 1.0f)); 

魚的非轉化的方向有指向右邊的頭。我不能找到正確的公式。

+0

魚的原始方向是什麼?頭指向右邊(即在正x方向)? – 2014-12-05 03:46:11

+0

是的,指着右邊。 – davez 2014-12-05 07:07:35

回答

0

你可能知道,對於一個圈的基本參數方程是,與rad爲半徑和phi該範圍中的角度[0,2 * PI]:

x = rad * cos(phi) 
y = rad * sin(phi) 

作爲phi從0掃描到2 * PI,它從右邊開始(正X軸),並逆時針移動。這意味着初始運動向上,在正Y軸的方向上。

您需要的確切計算取決於您想要動畫順時針還是逆時針旋轉,以及它開始的位置。由於它只是一個微小的變化,我會按順序覆蓋它們。

對於逆時針方向,我們可以通過簡單地添加開始角度來概括起點。我們也將表達角的時間t功能:

x = rad * cos(phiStart + speed * t) 
y = rad * sin(phiStart + speed * t) 

這給你翻譯的組成部分。對於魚的旋轉,由於其基準位置朝右,但圓周運動的初始運動朝上,所以在應用圓周運動之前,我們需要旋轉它90度。這意味着0.5 * PI(90度)被添加到用於翻譯的角度:

rotAng = 0.5 * PI + phiStart + speed * t 

不熟悉您使用的是矩陣庫,我希望它使用標準的順序矩陣乘法。所以用代碼表示,上面看起來像這樣:

float phiStart = 0.0f; // start at right, set different start angle if desired 
float phi = phiStart + elapsedTime; 
mesh->objectModelMatrix = 
    glm::translate(glm::mat4(1.0f), 
        glm::vec3(5.0f * cos(phi), initialY, 5.0f * sin(phi))); 
mesh->objectModelMatrix = 
    glm::rotate(mesh->objectModelMatrix, 
       0.5f * M_PI + phi, glm::vec3(0.0f, 0.0f, 1.0f)); 

要順時針移動,我們可以簡單地反轉角度的符號。其他唯一的區別是,因爲最初的運動是向下的,現在,魚的初始旋轉也是順時針旋轉90度,這相當於-0.5 * PI

float phiStart = 0.5f * M_PI; // start at top, set different start angle if desired 
float phi = phiStart - elapsedTime; 
mesh->objectModelMatrix = 
    glm::translate(glm::mat4(1.0f), 
        glm::vec3(5.0f * cos(phi), initialY, 5.0f * sin(phi))); 
mesh->objectModelMatrix = 
    glm::rotate(mesh->objectModelMatrix, 
       -0.5f * M_PI + phi, glm::vec3(0.0f, 0.0f, 1.0f)); 

我無法找到矩陣庫清晰的文檔你正在使用。有可能glm::rotate()的第二個參數是以度爲單位的角度而不是弧度。如果是這樣, 這兩種情況的呼叫變成:

glm::rotate(mesh->objectModelMatrix, 
       90.0f + phi * (180.0f/M_PI), glm::vec3(0.0f, 0.0f, 1.0f)); 

    glm::rotate(mesh->objectModelMatrix, 
       -90.0f + phi * (180.0f/M_PI), glm::vec3(0.0f, 0.0f, 1.0f)); 
+0

謝謝你的迴應。我編程它,但翻譯比旋轉快得多。我需要以某種方式加快旋轉速度。每秒鐘增加1次。 – davez 2014-12-05 17:51:20

+0

也許'glm :: rotate()'以角度爲度數?這些調用中的角度參數乘以(180.0f/M_PI),看看它是否能夠工作。 – 2014-12-05 18:36:11

+0

太棒了!非常感謝你! – davez 2014-12-06 13:54:41