OpenGL - 旋转玩家位置以面对鼠标指针



我是OpenGL和C++的新手,我正在尝试开发一个小游戏。我试图实现的想法是一个2D射击游戏,玩家面对鼠标指向的方向。我在网上寻找了一些帮助和例子,但找不到太多。我从哪里开始,有没有人有一些好的伪代码来使这项工作?谢谢!

无论您使用什么 API 来创建窗口/GL 上下文,都允许您处理事件,即鼠标运动事件,以便您可以跟踪鼠标在屏幕坐标上的位置。然后,您可能会使用正交投影,并且您的摄像机可能不是静态的,而是随着播放器一起移动。

考虑到这些变量,这里列出了您需要的内容。

  1. 首先,您需要获取鼠标屏幕坐标。

  2. 将它们转换为世界坐标。

  3. 计算从玩家到这一点的向量。


1 - 对于第一点,例如,我将使用 SDL,因为这是我在自己的项目中通常使用的。否则,我将尝试使代码尽可能通用。

...
while ( SDL_PollEvent( &event ) ) {
    if ( event.type == SDL_MOUSEMOTION ) {
        mouseScreen.x = event.motion.x;
        mouseScreen.y = event.motion.y;
    }
}
...

2 - 对于第二点,让我们了解一些背景和假设。通常设置相机会像这样,

viewport( 0, screenWidth, 0, screenHeight );
...
ortho( projection, cameraLeft, cameraRight, cameraBottom, cameraTop )
translate( view, -cameraPosition )
//cameraWidth = cameraRight - cameraLeft;

在大多数 2D 游戏中,您的屏幕尺寸将与相机尺寸相同。如果您更改相机尺寸,则相机看起来就像在放大/缩小,因此我们会将其考虑在内。

现在让我们假设相机的原点位于屏幕的中心。在这种情况下,您的正交函数如下所示,

// halfCamWidth = cameraWidth/2;
// halfCamHeight = cameraHeight/2;
ortho( projection, -halfCamWidth, halfCamWidth, -halfCamHeight, halfCamHeight );

它可能是左下角。但这完全取决于您决定如何制作游戏。使用左下角,您可以通过执行以下操作将相机居中放在一个点 (x,y) 上,

cameraPosition.x = x - cameraWidth/2;
cameraPosition.y = y - cameraHeight/2;

而如果你使用中心作为原点,你会这样做

cameraPosition.x = x;
cameraPosition.y = y;

这使我们的计算稍微容易一些。因此,如果您使用不同的引用,我将留给您。

回到转换,我们现在可以通过两步从屏幕坐标转换为世界坐标。首先,我们需要在相机投影中调整鼠标位置。(请注意整数运算,因为您可能必须将维度转换为浮点数)

mouseWorld.x = cameraLeft + ( mouseScreen.x / screenWidth ) * cameraWidth;
mouseWorld.y = cameraBottom + ( mouseScreen.y / screenHeight ) * cameraHeight;

这个公式得到x在[-halfCameraWidth, halfCameraWidth]以内和y在[-halfCameraHeight, halfCameraHeight]内的相关值,基本上在正交函数的极限之内。也许如果事件处理可以检测到窗口外的鼠标位置,您会得到此间隔之外的值,但这对于此公式来说不是问题。

其次,我们现在需要将这个点放在相机的中心周围,

mouseWorld.x = mouseWorld.x + cameraPosition.x;
mouseWorld.y = mouseWorld.y + cameraPosition.y;

现在我们有了世界地位。

3 - 最后,第三点,我们计算从玩家到这一点的向量。

Vector2 playerToMouseDirection = ( mouseWorld - player.position );
playerToMouseDirection.normalize();

仅此而已。

如果您的播放器立即旋转,您就完成了。如果你想让你的玩家旋转得更慢,你必须找到一种方法来线性插值矢量(或角度)。祝你好运。

最新更新