0

我目前遇到的问题是 GLM 提供不稳定的转换和旋转。我的意思是他们并不顺利。我正在使用 GLFW 3、GLM 和 OpenGL 3.2。我正在尝试使用操纵杆输入来转换一个简单的四边形。起初,我认为问题是由操纵杆引起的。为了反驳这一点,我更改了代码以独立于用户输入旋转四边形,但依赖于 deltaTime。下面是一些代码段。我假设它与我如何旋转矩阵有关?

CPP 文件:

float speed = 3.0f;
float deadZone = 0.10f;
glm::vec2 direction(0.0f);

while (!glfwWindowShouldClose(window))
{
    currentTime = glfwGetTime();
    deltaTime = (currentTime - lastUpdate) * 1000.0f;

    //Update logic
    inputHandler->tick(deltaTime);

    float inputX, inputY;
    inputX = inputHandler->getGamepad(0)->getAxes(AXIS::HORIZONTAL);
    inputY = inputHandler->getGamepad(0)->getAxes(AXIS::VERTICAL);

    float magnitude = sqrtf((inputX * inputX) + (inputY * inputY));
    if (magnitude > deadZone) //Radial dead zone detection
    {
        //Could the stutter be caused by type casting?
        direction.x += inputX * float((speed * deltaTime) / 1000.0f);
        direction.y += inputY * float((speed * deltaTime) / 1000.0f);
    }

    ... //Set vertex values and UV coord

    //Set the matrix values according to the joystick input
    glm::mat4 MVP(1.0f);
    MVP = glm::translate(MVP, glm::vec3(direction, 0.0f));
    glUniformMatrix4fv(mvpID, 1, GL_FALSE, glm::value_ptr(MVP));

    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);

    ...
}

顶点着色器:

#version 150

in vec2 vertexPosition_modelspace;
in vec2 UV;

uniform mat4 MVP;

out vec2 vUV;

void main() {
    vUV = UV;
    gl_Position = MVP * vec4(vertexPosition_modelspace, 0, 1);
}
4

3 回答 3

1

这里有一些调试帮助,以免埋没在评论中:

  • 记录每一帧的时间步长

  • 当时间步超过您确定足以导致“跳跃”的某个给定阈值时,暂停程序。

  • 如果错误来自大时间步长,请跟踪哪些函数花费了多少时间,看看是否有任何花费了不寻常的时间。

    一世。如果您有分析器,请在此处使用。

    ii. 如果没有,记录每个函数之前和之后的时间并计算持续时间。在每一帧结束时总结这些时间步长,这样您仍然可以找到指示跳跃的总增量时间。

  • 如果您将错误追溯到您无法控制的某个库/系统/其他调用,请确保您传递了这些函数(以及所有函数)的良好数据。

    一世。您是否在某处使用损坏的内存而侥幸?

    ii. 错误仅适用于旋转吗?翻译/音阶呢?

    iii. 如果您只是在尝试 OpenGL 的情况下运行程序,是否会发生此错误?例如,您的窗口可能是一个错误,您错过了一些更新调用或类似的微不足道的东西。

于 2013-11-14T04:30:23.210 回答
0

这非常令人沮丧,但我重新启动了 Windows,所有问题都消失了。即使是对 std::cout 的调用也会导致 Visual Studio 插入断点。

于 2013-11-17T05:36:00.557 回答
-1

它看起来像glfwGetTime使用QueryPerformanceCounter. 这不是用于计时的正确 API,因为它测量的是“CPU 时间”而不是“Wall 时间”。它应该用于衡量代码性能,但仅此而已。timeGetTime()您应该使用,timeBeginPeriod()timeEndPeriod()Windows Multimedia Timers API编写自己的计时器类:http: //msdn.microsoft.com/en-us/library/windows/desktop/dd743609 (v=vs.85).aspx

于 2013-11-14T09:58:29.237 回答