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
在旋转时会影响catX
和catZ
。我试了很多次,但我找不到分开它们的方法。
【问题讨论】:
将catX
和catZ
变量分开(或将它们捆绑在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:沿该方向旋转和移动的主要内容,如果未能解决你的问题,请参考以下文章