【发布时间】:2018-04-17 08:22:41
【问题描述】:
我想使用按键旋转立方体。这是代码的一部分。当我按下 LEFT 键时,立方体向左旋转,等等。我的目标是旋转立方体,所以我必须将它旋转 x 和 y 轴,这会导致问题。
我已经定义了mat4 rotation;,并在我按住某个键时使用它来分配旋转。当我按住键时,它正在旋转,例如向左旋转。然后我松开按键,物体回到初始位置(相机回到初始位置,因为物体没有移动)。我认为这个问题导致了在关键功能下方定义的auto rotateMat = rotation; 行。
我做错了什么?
mat4 rotation; //global
if(keysPressed[GLFW_KEY_LEFT]){
timer -= delta;
rotation = rotate(mat4{}, timer * 0.5f, {0, 1, 0});
}
if(keysPressed[GLFW_KEY_RIGHT]){
timer += delta;
rotation = rotate(mat4{}, timer * 0.5f, {0, 1, 0});
}
if(keysPressed[GLFW_KEY_UP]){
timer += delta;
rotation = rotate(mat4{}, timer * 0.5f, {1, 0, 0});
}
if(keysPressed[GLFW_KEY_DOWN]){
timer -= delta;
rotation = rotate(mat4{}, timer * 0.5f, {1, 0, 0});
}
...
program.setUniform("ModelMatrix", rotation* cubeMat);
cube.render();
更新:
所以当我使用矩阵变量作为全局变量而不是局部变量时,这个问题就解决了。
【问题讨论】:
-
如果没有按键被按下,那么旋转将是一个单位矩阵。所以是的,用一个统一矩阵覆盖 rotateMat 会导致你的立方体回到它的初始位置。
-
@BDL 那么我怎么能不覆盖
rotateMat?我想当我将rotation分配给rotateMat时,它会记住最后一个位置。 -
例如,您可以计算 ifs 中的相对旋转并将其与当前矩阵相乘。
-
问题仍然与最初的问题相同:您根本不能只有一个全局矩阵并在每一帧中覆盖它。要么通过乘以相对旋转来累积这些旋转,要么存储两个角度。
-
请在我创建的新问题中讨论它。
标签: c++ opengl rotation glfw glm-math