你可能知道,對於一個圈的基本參數方程是,與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));
魚的原始方向是什麼?頭指向右邊(即在正x方向)? – 2014-12-05 03:46:11
是的,指着右邊。 – davez 2014-12-05 07:07:35