在OpenGL/SFML中尝试实现鼠标视角"相机"

4

我一直在使用SFML 1.6和OpenGL,这是非常愉快的经历!但有一个问题:我似乎无法正确实现一个摄像机类。我试图创建一个名为“Camera”的C++类。下面是我的函数:

Camera::Strafe(float fSpeed)

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

Camera::MouseMove(int currentX, int currentY)

应该提供第一人称鼠标视角,接收当前鼠标坐标并相应地旋转相机。我的Strafe()实现很好用,但我似乎无法正确实现MouseMove()。

我已经从阅读其他关于OpenGL鼠标视角实现的资源中了解到,我必须在每一帧之后将鼠标居中,这部分我已经掌握了。但仅此而已。我似乎无法弄清楚如何根据鼠标坐标在原地旋转相机。可能需要使用一些三角函数,我猜测。

1个回答

0

我曾经做过类似的事情(它是第三人称相机)。如果我记得我正确地做了什么,我会利用鼠标位置的变化来计算两个角度(我相信我用了一些三角函数)。一个角度给出水平旋转,另一个给出垂直旋转。具体来说是俯仰、偏航和翻滚,尽管我不记得哪个指向哪个方向。还有一个必须在另一个之前完成,否则物体会旋转得很奇怪。我非常确定首先是俯仰,然后是偏航或翻滚。

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

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

这是用C#完成的,所以请谅解我语法方面可能存在的问题:

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

我的角度存储在一个二维向量中(因为我只绕两个轴旋转)。您会看到,我取了changeInX和changeInY值,然后将它们简单地除以100以获得一些任意的弧度值,然后将该数字转换为度数。根据需要调整100的值。请记住,这里没有进行坚实的数学计算来解决这个问题。我只是试错,直到找到一个有效的方法。


好的,这解决了一些问题。但是俯仰、偏航和滚转应该保存为浮点数还是向量?有哪种方式更优?谢谢! - Eyal Kalderon
1
俯仰角、偏航角和翻滚角的值将是您实际移动的角度(存储为度数或弧度取决于您)。每个单独的角度都将是浮点数,但您完全可以将它们全部存储到三维向量中以便于访问。 - MGZero
俯仰角是绕X轴旋转,偏航角是绕Y轴旋转,滚转角是绕Z轴旋转。但是如何从鼠标输入中获取这些角度呢? - Eyal Kalderon
脑海中暂时想不起来了。让我大约2个小时从工作回家并找到我的代码,我会回复你的。 - MGZero
我似乎仍然无法让它正常工作。这不是你的错;只是我无法弄清如何正确旋转所有内容。你是如何旋转相机的?你使用的是“glRotatef()”还是“gluLookAt()”?此外,在C++中似乎没有MathHelper的等效物(请注意,这是ANSI/ISO C++,而不是MS Visual C++)。你知道另一种更标准的获取角度的方法吗? - Eyal Kalderon
你可能想要使用gluLookAt()。先旋转玩家,然后将相机指向其方向。至于将弧度转换为角度,这是一些简单的数学运算:乘以(pi/180)。 - MGZero

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接