4

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

Camera::Strafe(float fSpeed)

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

Camera::MouseMove(int currentX, int currentY)

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

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

4

1 回答 1

0

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

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

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

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

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

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

于 2011-07-13T18:12:43.827 回答