【发布时间】:2018-06-29 12:57:45
【问题描述】:
我正在尝试实现 3D 相机鼠标旋转。现在我能做的只是当我的鼠标在窗口的边界时旋转。这意味着如果我的窗口宽度为 1280,如果鼠标坐标为 0 或 1279,我将无法旋转更多。我读过相对鼠标应该有帮助。但它对我不起作用。
在主循环之前
SDL_ShowCursor(SDL_DISABLE);
SDL_SetRelativeMouseMode(SDL_TRUE);
SDL_WarpMouseInWindow(window, SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2);
旋转xyz的函数
glm::vec3 MouseMotion(float x, float y)
{
float lastX = SCREEN_WIDTH / 2, lastY = SCREEN_HEIGHT / 2;
float pitch = 0.0f, yaw = -90.0f;
float offsetX = x - lastX;
float offsetY = lastY - y;
lastX = x;
lastY = y;
float sensitivity = 0.3f;
yaw += offsetX * sensitivity;
pitch += offsetY * sensitivity;
if (pitch > 89.0f)
pitch = 89.0f;
if (pitch < -89.0f)
pitch = -89.0f;
glm::vec3 front;
front.x = std::cos(glm::radians(yaw)) * std::cos(glm::radians(pitch));
front.y = std::sin(glm::radians(pitch));
front.z = std::sin(glm::radians(yaw)) * std::cos(glm::radians(pitch));
//std::cout << "Mouse: " << offsetX << ", " << offsetY << std::endl;
//std::cout << "YAW AND PITCH: " << yaw << ", " << pitch << std::endl;
return glm::normalize(front);
}
和事件循环
while (SDL_PollEvent(&event))
{
if (event.type == SDL_QUIT)
{
exit(0);
}
if (event.type == SDL_MOUSEMOTION)
{
float mouseX = (float)event.motion.x;
float mouseY = (float)event.motion.y;
cameraFront = MouseMotion(mouseX, mouseY);
}
}
它可以工作,但前提是我的鼠标在边界内。
更改为 event.motion.xrel 和 event.motion.yrel 并不能解决此问题。由于我的相机抖动,即稍微向右然后回到中心或向左再回到中心,它使它更容易被窃听。
如何让我的相机完全移动,无限移动?
【问题讨论】:
-
谷歌“[实现]鼠标外观”。 Here's 一个简单又好用的方法让您入门。
-
我知道如何根据鼠标移动来旋转相机。我的问题是关于如何删除 SDL2 鼠标运动的界限。
-
好吧,如果你实际上正确地研究了
mouse look,你会遇到用来克服这个问题的标准方法,即将鼠标重置到一个固定点在每次位置查询之后。 -
我明白了。
prev_mouse_x实际上是什么,因为我没有看到任何声明? -
如果没有看到您的代码,我真的无法帮助您。我只能建议您原来的问题的解决方案;由您来实际实现和调试它。
标签: c++ opengl 3d camera sdl-2