OpenGL:沿该方向旋转和移动

问题描述 投票:0回答:1

我想沿着猫的朝向旋转和移动它。但是,当我旋转猫时,它绕原点旋转,这不是我想要的。 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。我尝试了很多次,但是我找不到将它们分开的方法。

c++ opengl geometry glut glm-math
1个回答
0
投票

将猫的位置定义为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))
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.