OpenGL 对象在 PC 上以正常速度旋转,但在笔记本电脑上速度极快

waf*_*ave 1 c++ opengl

我在处理输入以在屏幕上旋转对象时遇到一个问题。

我在桌面上对所有内容进行了编码,使其按应有的方式旋转,并且您可以在 3D 空间中操纵该对象。

然而,在我的笔记本电脑上,当我尝试旋转该物体时,它实际上旋转得如此之快,您几乎看不到它。我说的是每秒几十次旋转。

我的问题是...为什么?为什么它在我的电脑上以正常速度旋转,但在我的笔记本电脑上却以疯狂的高速旋转?

我用于每次按键的旋转是 0.1...在我的 PC 上,它旋转得足够快,能够控制 或 ,但在我的笔记本电脑上(和平板电脑,我也在平板电脑上测试了它),它旋转得太快了!我能够通过将旋转量更改为 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;
}
Run Code Online (Sandbox Code Playgroud)

以及旋转函数(注意: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));
}
Run Code Online (Sandbox Code Playgroud)

感谢您的意见!

谢谢,

And*_*son 5

您使用常量值旋转对象,而不考虑自上次旋转以来已经过去的时间量。当您在不同的机器上运行代码时,您最终会得到不同的旋转速度,具体取决于机器处理绘图和更新循环的速度。

您需要跟踪时间 - 保留上次更新的时间和当前更新的时间,并将差异称为“时间增量”。您的旋转需要乘以“时间增量”,这样即使两台机器以不同的速度处理代码,对象仍然以相同的速度旋转。