【问题标题】:OpenGL - rotate player position to face mouse pointer [closed]OpenGL - 旋转玩家位置以面对鼠标指针[关闭]
【发布时间】:2016-02-24 09:06:31
【问题描述】:

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

【问题讨论】:

  • 是2D射击游戏还是3D游戏?
  • 对不起,我应该提到这一点。这是二维的
  • 是什么阻止你这样做?
  • 没有足够的理解,我有一个简短的想法,如果有人可以让我知道我是否在正确的轨道上......我有一个用于我的播放器的向量,然后如果我要工作找出当前鼠标位置的坐标我可以通过计算鼠标指针坐标和播放器坐标之间的角度来旋转播放器吗?
  • @P.Smith 如果您有鼠标位置和玩家位置(在同一个坐标系中),那么mouse_position - player_position 是您希望玩家的“前进”向量。

标签: c++ opengl rotation mouseevent image-rotation


【解决方案1】:

无论您使用什么 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;

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

其次,我们现在需要将此点放置在相机中心周围,

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

现在我们有了世界位置。

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

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

就是这样。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-17
    • 2020-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-22
    相关资源
    最近更新 更多