我有个物体绕着圆圈转。对象是一条鱼。
感动:
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));鱼的非转换方向是头部指向右边。
我找不到正确的公式。
发布于 2014-12-05 08:09:21
你可能知道,圆的基本参数方程是,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));https://stackoverflow.com/questions/27300880
复制相似问题