【发布时间】:2013-11-13 23:22:56
【问题描述】:
我目前遇到的问题是 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);
}
【问题讨论】:
-
“波涛汹涌”是什么意思?你只是有一个缓慢的帧速率? GLM 不是问题。
-
不,这不是帧率问题。我查了一下,我一直在 350FPS 以上。我想可能是我的帧率太高了,所以我启用了 VSync。可悲的是,这没有任何帮助。下面是我所说的不连贯的一个例子:对象将以每刻 4px 的平滑移动,然后突然,在单个刻,对象将移动约 32px。再次,我在发生这种跳跃时检查了我的帧率,它从未低于 350(垂直同步时为 59)。
-
您是否尝试过打印每个刻度的增量?
-
@GraphicsMuncher 我刚刚在启用 VSync 的情况下进行了尝试。恒定输出会降低窗口的响应能力,但 deltaTime 的范围似乎在 0.2 - 0.5 之间。由于输出量巨大,很难注意到任何异常情况。
-
你在运行 linux 吗?我在 Ubuntu 13.10 上使用 3930k 和 GTX690 就遇到了这种情况。再多的插值也无济于事; glm 的矩阵创建函数只是偶尔每隔几十帧随机飙升到 23-30 毫秒。 glm::translate() 和 glm::rotate() 都会发生。有些地方真的坏了。我检查了我的矩阵数据输入,在尖峰之前没有异常值。绝对是glm。
标签: c++ opengl math transformation glm-math