我想沿猫的朝向旋转和移动它。但是,当我旋转猫时,它绕原点旋转,这不是我想要的。 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
在旋转时会影响catX
和catZ
。我尝试了很多次,但是我找不到将它们分开的方法。
答案 0 :(得分: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))