GLM继续提供糟糕的转型和轮换

时间:2013-11-13 23:22:56

标签: c++ opengl math transformation glm-math

我目前遇到的问题是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);
}

3 个答案:

答案 0 :(得分:1)

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

  • 记录每个帧的时间步长

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

  • 如果错误来自大时间步骤,请跟踪哪些功能需要花费多少时间,看看是否需要花费不寻常的时间。

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

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

  • 如果你将你的bug追溯到你无法控制的某些库/系统/其他调用,请确保你传递这些函数(实际上是所有函数)良好的数据。

    我。你是否正在某处使用腐败的记忆?

    II。 bug只适用于旋转吗?翻译/比例怎么样?

    III。如果您只是尝试使用OpenGL来运行程序,是否会发生此错误?这可能是一个错误,例如,你的窗口,你错过了一些更新调用或类似的事情。

答案 1 :(得分:0)

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

答案 2 :(得分:-1)

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