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

标签 c++ opengl

我有一个问题与处理输入以旋转屏幕上的对象有关。

我对我桌面上的所有内容进行了编码,它们会按原样旋转,您可以在 3D 空间中操纵对象。

然而,在我的笔记本电脑上,当我尝试旋转对象时,它实际上旋转得如此之快,以至于您几乎看不到它。我说的是每秒几十圈。

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

我用于每次按键的旋转是 0.1...在我的 PC 上它旋转得足够快以能够控制或,但是在我的笔记本电脑上(和平板电脑,我也在平板电脑上测试过)它只是旋转太快了!我能够通过将旋转量更改为 glm::radians(1.0f) 并以正常速度旋转来在我的笔记本电脑上修复它......但在我的 PC 上它比我想要的要慢。

我唯一能想到的是与增量时间和渲染速度有关(我将其考虑到我的相机控制中)。

这是我的旋转函数,供引用...

键盘回调函数(注意:我有一个名为 keys[] 的全局 bool 数组,我用它来查看是否按下了某个键)

// 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] 是我用来查看是否按下鼠标左键的另一个 bool 值数组):

// 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));
}

非常感谢您的意见!

谢谢,

最佳答案

您正在使用一个常数值旋转您的对象,而不考虑自上次旋转以来耗时量。当您在不同的机器上运行您的代码时,您最终会得到不同的旋转速度,这取决于机器处理您的绘图和更新循环的速度。

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

关于c++ - OpenGL 对象在 PC 上以正常速度旋转,但在笔记本电脑上旋转速度极快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35206133/

相关文章:

c++ - 如何正确处理 QThread 中长时间运行的任务的信号和事件

c++ - C - 做{..} while(0);是否可以从代码中删除,不包括嵌套用法?

c++ - QT Embedded : How to generate an event to ESC (Escape), F1 等按键

C++隐式内联函数

c++ - 带有 C++ 类的 OpenGL

python - 着色器已链接但对某些人不起作用

c++ - 静态字符数组的对齐保证

opengl - 纹理颜色显示不正确

c++ - 如何在 opengl 和 c++ 中围绕 "camera"旋转

opengl - 从透视变换到正交矩阵