OpenGL:沿该方向旋转和移动

Posted

技术标签:

【中文标题】OpenGL:沿该方向旋转和移动【英文标题】:OpenGL: Rotate and Move in that Direction 【发布时间】:2019-10-29 07:57:43 【问题描述】:

我想旋转猫模型并朝它所面对的方向移动。但是,当我旋转猫时,它围绕原点运行,这不是我想要的。 DEMO

我知道计算模型位置的公式是:

// y is the up axis
x = distance * sin(theta);
z = distance * cos(theta);

这是键盘控制功能:

float translate_delta = 0.01f;
float rotate_delta = 0.1f;
int translate_press_num = 0;
int rotate_press_num = 0;

void special_callback(int key, int x, int y)

    if (key == GLUT_KEY_UP)
    
        translate_press_num++;
    
    else if (key == GLUT_KEY_DOWN)
    
        translate_press_num--;
    
    else if (key == GLUT_KEY_LEFT)
    
        rotate_press_num--;
    
    else if (key == GLUT_KEY_RIGHT)
    
        rotate_press_num++;
    

这是模型转换:

mat4 model = mat4(1.0f);
float catAngle = rotate_delta * rotate_press_num * -45.0f;
float catX = translate_delta * translate_press_num * sin(catAngle * M_PI / 180);
float catZ = translate_delta * translate_press_num * cos(catAngle * M_PI / 180);

model = glm::translate(mat4(1.0f), vec3(catX, 0.0f, catZ)) *
        glm::rotate(mat4(1.0f), rotate_delta * rotate_press_num * glm::radians(-45.0f), vec3(0.0f, 1.0f, 0.0f));

我知道catAngle 在旋转时会影响catXcatZ。我试了很多次,但我找不到分开它们的方法。

【问题讨论】:

catXcatZ 变量分开(或将它们捆绑在glm::vec3 中)。在special_callback 函数中立即更新位置,而不是等待绘制步骤。 见Understanding 4x4 homogenous transform matrices 尤其是最后的链接... 【参考方案1】:

将猫的位置定义为glm::vec3 catPosition,与您保留其他状态变量的位置相同。

在你的按键回调函数中:

void special_callback(int key, int x, int y) 
    float catAngle = rotate_delta * rotate_press_num * -45.0f;
    glm::vec3 displacement = translate_delta * glm::vec3(sin(catAngle * M_PI / 180), 0, cos(catAngle * M_PI / 180));

    if (key == GLUT_KEY_UP)
    
        catPosition += displacement;
    
    else if (key == GLUT_KEY_DOWN)
    
        catPosition -= displacement;
    

那么模型变换就变成了:

mat4 model = 
    glm::translate(mat4(1.0f), catPosition) *
    glm::rotate(mat4(1.0f), rotate_delta * rotate_press_num * glm::radians(-45.0f), vec3(0.0f, 1.0f, 0.0f))

【讨论】:

以上是关于OpenGL:沿该方向旋转和移动的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL相机旋转怪异

如何在OpenGL中实现形状的原位旋转和旋转状态下的移动?

在OpenGL中沿对象后面的方向旋转相机

openGL(Qt)正确绑定+同时两个旋转

OpenGL旋转和平移问题

OpenGL模拟波斯王子相机