我正在实现一个框架独立的FPS相机,我有一个问题,在干相机。如果我翻译它或者让它以固定的速度旋转,相机是平滑的,但是当我开始用鼠标移动它时,它就开始结巴了。
这是主循环中代码的一部分,它跟踪时间并计算围绕y轴的旋转:
std::chrono::high_resolution_clock::time_point newTime = std::chrono::high_resolution_clock::now();
uint32_t frameTime = static_cast<uint32_t>(std::chrono::duration_cast<std::chrono::microseconds>(newTime - oldTime).count());
oldTime = newTime;
double mouseXInput;
double mouseYInput;
glfwGetCursorPos(window, &mouseXInput, &mouseYInput);
glfwSetCursorPos(window, 0, 0);
float mouseX = static_cast<float>(mouseXInput);
float mouseY = static_cast<float>(mouseYInput);
float rotateSpeedModifier = 0.0000005f;
// Fixed rotation rate
camera.rotation.x += frameTime * 0.0000006f;
// or mouse controled rotation rate (pick just one of the two lines)
camera.rotation.x += frameTime * rotateSpeedModifier * mouseX);
// Overflow and underflow control
if (camera.rotation.x > 2.0f * PI) {
camera.rotation.x -= 2.0f * PI;
} else if (camera.rotation.x < 0.0f) {
camera.rotation.x += 2.0f * PI;
}
请注意,我禁用了光标,并在程序开始时启用了原始鼠标运动(支持它)。我还以它为中心:
glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);
glfwSetInputMode(window, GLFW_RAW_MOUSE_MOTION, GLFW_TRUE);
glfwSetCursorPos(window, 0, 0);
由于口吃只出现在我移动鼠标时,我猜这是某种精度问题。变量frameTime在400到5000之间。我认为使用毫秒是不够精确的。变量mouseX和mouseY通常在-10、10中,如果我对鼠标不太好斗的话,而且它们总是一个整数,这对我来说是很奇怪的。我不认为把它抛到浮子上也不是问题所在。
在这里我能做些什么来提高鼠标的跟踪精度?这就是问题所在吗?我该怎么解决这个问题?
发布于 2020-08-29 17:07:12
旋转不应完全取决于帧时间,而应仅取决于鼠标增量。如果我把帧时间从等式中取出来,它就会像预期的那样工作。
https://gamedev.stackexchange.com/questions/185455
复制相似问题