【发布时间】:2016-02-04 16:18:01
【问题描述】:
我在处理输入以旋转屏幕上的对象时遇到了一个问题。
我在桌面上按应有的旋转位置编写了所有内容,您可以在 3D 空间中操纵对象。
然而,在我的笔记本电脑上,当我尝试旋转对象时,它实际上旋转得如此之快,以至于几乎看不到它。我说的是每秒几十次旋转。
我的问题是……为什么?为什么它在我的电脑上以正常速度旋转,但在我的笔记本电脑上却以疯狂的速度旋转?
我为每个按键使用的旋转是 0.1...太快了!我可以通过将旋转量更改为 glm::radians(1.0f) 在我的笔记本电脑上修复它,它以正常速度旋转......但在我的电脑上它比我想要的要慢。
我唯一能想到的与增量时间和渲染速度有关(我在相机控制中考虑了这一点)。
这是我的旋转功能供参考...
键盘回调函数(注意:我有一个名为 keys[] 的全局布尔数组,我用它来查看是否正在按下某个键)
// Handle the keyboard input
void keyPressed(GLFWwindow *_window, int key, int scancode, int action, int mods) {
// Close window with escape
if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
glfwSetWindowShouldClose(window, GL_TRUE);
// Change render to show points only with P
if (key == GLFW_KEY_P && action == GLFW_PRESS)
glPolygonMode(GL_FRONT_AND_BACK, GL_POINT);
// Change render to show filled in texture with T
if (key == GLFW_KEY_T && action == GLFW_PRESS)
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
// Change render to show "wirefram" mesh with W
if (key == GLFW_KEY_W && action == GLFW_PRESS)
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
// Array of keys, if key is being held down, sets index corresponding to appropriate integer related to key to true, and false when key is released
if (key >= 0 && key < 1024)
{
if (action == GLFW_PRESS)
keys[key] = true;
else if (action == GLFW_RELEASE)
keys[key] = false;
}
return;
}
还有旋转功能(注意:clicks[0] 是另一个布尔数组,我用它来查看是否按下鼠标左键):
// rotate object based on keyboard input
// Left mouse button must not be held down for this to work
// Creates a matrix containing the appriopriate transformation, and this is later multipled to the model matrix
void rotate_object(glm::mat4 &transform)
{
// Rotate along z axis (left and right, like a barrel roll)
if (!click[0] && keys[GLFW_KEY_LEFT])
transform = glm::rotate(transform, glm::radians(1.0f), glm::vec3(0.0f, 0.0f, 1.0f));
if (!click[0] && keys[GLFW_KEY_RIGHT])
transform = glm::rotate(transform, glm::radians(-1.0f), glm::vec3(0.0f, 0.0f, 1.0f));
// Rotate along x axis (up and down, like a flip)
if (!click[0] && keys[GLFW_KEY_UP])
transform = glm::rotate(transform, glm::radians(1.0f), glm::vec3(1.0f, 0.0f, 0.0f));
if (!click[0] && keys[GLFW_KEY_DOWN])
transform = glm::rotate(transform, glm::radians(-1.0f), glm::vec3(1.0f, 0.0f, 0.0f));
// Rotate along y axes (make object spin)
if (!click[0] && keys[GLFW_KEY_K])
transform = glm::rotate(transform, glm::radians(1.0f), glm::vec3(0.0f, 1.0f, 0.0f));
if (!click[0] && keys[GLFW_KEY_L])
transform = glm::rotate(transform, glm::radians(-1.0f), glm::vec3(0.0f, 1.0f, 0.0f));
}
感谢您的意见!
谢谢,
【问题讨论】:
-
这个循环的每次迭代都有一个固定的旋转。是时候添加一些计时器了!
-
这就是我在写这个问题时想到的......我使用增量时间来使我的相机移动平稳,我现在意识到我必须对对象操作做同样的事情!