【问题标题】:Trying to implement a mouse look "camera" in OpenGL/SFML尝试在 OpenGL/SFML 中实现鼠标外观“相机”
【发布时间】:2011-10-04 17:42:21
【问题描述】:

我使用 OpenGL 和 SFML 1.6 已经有一段时间了,这真是太棒了!除了一个例外:我似乎无法正确实现相机类。你看,我正在尝试创建一个名为“Camera”的 C++ 类。这是我的功能:

Camera::Strafe(float fSpeed)

检查是否按下了 WASD 键,如果是,则以“fSpeed”向各自的方向移动相机。

Camera::MouseMove(int currentX, int currentY)

应该提供第一人称鼠标外观,获取当前鼠标坐标并相应地旋转相机。我的 Strafe() 实现工作正常,但我似乎无法正确使用 MouseMove()。

通过阅读有关 OpenGL 鼠标外观实现的其他资源,我已经知道我必须在每一帧之后将鼠标居中,并且我将那部分放在了下方。但仅此而已。我似乎无法从鼠标坐标中获得如何在现场实际旋转相机。我敢打赌,可能需要使用一些触发器。

【问题讨论】:

    标签: c++ opengl camera sfml glu


    【解决方案1】:

    我做过类似的事情(这是一个第三人称相机)。如果我记得我做对了,我会改变鼠标位置并用它来计算两个角度(我相信我是用一些三角函数做到的)。一个角度让我水平旋转,另一个让我垂直旋转。具体来说,俯仰、偏航和滚动,虽然我不记得哪个指的是哪个方向。还有一个你必须在另一个之前做,否则事情会变得有趣。我很确定它首先是俯仰,然后是偏航或滚动。

    希望鼠标位置的变化应该很明显。它允许鼠标灵敏度。如果我快速移动鼠标,我会有更大的变化,所以我会“更快”旋转。

    编辑:好的,我查看了我的代码,这是一个非常简单的计算。

    这是用 C# 完成的,所以请耐心等待语法:

    _angles.X += MathHelper.ToDegrees(changeInX / 100);
    _angles.Y += MathHelper.ToDegrees(changeInY / 100);
    

    我的角度存储在二维向量中(因为我只在两个轴上旋转)。你会看到我把我的 changeInX 和 changeInY 值简单地除以 100 以获得任意弧度值,然后将该数字转换为度数。调整 100 的灵敏度。请记住,这里没有进行实体数学来解决这个问题。我只是做了一些反复试验,直到我得到了一些运作良好的东西。

    【讨论】:

    • 好的,这清除了一些东西。但是应该将俯仰、偏航和滚动保存为浮点数还是向量?两者都有优势吗?谢谢!
    • 俯仰、偏航和滚动的值将是您移动的实际角度(以度数或弧度存储取决于您)。每个单独的都是一个浮点数,但没有理由不能将它们全部存储到一个 3 维向量中,只是为了便于访问。
    • Pitch 是绕 X 轴旋转,Yaw 是绕 Y 轴旋转,Roll 是绕 Z 轴旋转。但是如何从鼠标输入中获得角度呢?
    • 我想不起来了。给我大约 2 小时左右的时间让我下班回家并挖掘我的代码,我会回复你。
    • 我似乎仍然无法让它工作。这不是你的错;只是我无法弄清楚如何正确旋转所有东西。你是如何旋转相机的?您使用的是“glRotatef()”还是“gluLookAt()”?此外,在 C++ 中似乎没有等效于 MathHelper(请注意,这是 ANSI/ISO C++,而不是 MS Visual C++)。你知道另一种更标准的获得学位的方法吗?
    猜你喜欢
    • 2011-10-11
    • 1970-01-01
    • 2016-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    • 1970-01-01
    相关资源
    最近更新 更多