首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenGL平移旋转对象

OpenGL平移旋转对象
EN

Stack Overflow用户
提问于 2014-12-04 18:02:40
回答 1查看 2.2K关注 0票数 0

我有个物体绕着圆圈转。对象是一条鱼。

感动:

代码语言:javascript
复制
mesh->objectModelMatrix = glm::translate(glm::mat4(1.0f), glm::vec3(5.0f * sin(elapsedTime), initialY, 5.0f * cos(elapsedTime)));

我需要计算旋转以推动鱼向前(头第一)。就像这样:

代码语言:javascript
复制
    mesh->objectModelMatrix = glm::rotate(mesh->objectModelMatrix, elapsedTime, glm::vec3(0.0f, 0.0f, 1.0f));

鱼的非转换方向是头部指向右边。

我找不到正确的公式。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-05 08:09:21

你可能知道,圆的基本参数方程是,rad是半径,phi是0,2*PI范围内的角度。

代码语言:javascript
复制
x = rad * cos(phi)
y = rad * sin(phi)

phi从0到2* PI时,从右开始(正x轴),并逆时针移动.这意味着初始运动是向上的,在正y轴的方向上。

您需要的精确计算取决于您希望动画是顺时针还是逆时针方向,以及从哪里开始。由于这只是一个微小的变化,我将按顺序讨论它们。

对于逆时针方向,我们可以简单地增加一个起始角来推广起始点.我们还将把角度表示为时间t的函数

代码语言:javascript
复制
x = rad * cos(phiStart + speed * t)
y = rad * sin(phiStart + speed * t)

这给出了翻译的组成部分。对于鱼的旋转,因为它的底座位置是指向右边的,但是圆周运动的初始运动是指向向上的,所以在进行圆形运动之前,我们需要把它旋转90度。这意味着将0.5 * PI (90度)添加到用于翻译的角度:

代码语言:javascript
复制
rotAng = 0.5 * PI + phiStart + speed * t

不熟悉您正在使用的矩阵库,我希望它使用矩阵乘法的标准顺序。因此,在代码中表示,上面的内容如下:

代码语言:javascript
复制
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

代码语言:javascript
复制
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()的第二个论点可能是以度为单位的角度而不是弧度。如果是这样的话,那么对这两起案件的呼吁就变成:

代码语言:javascript
复制
    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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27300880

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档