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

时间:2016-02-24 09:06:32

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

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

1 个答案:

答案 0 :(得分:2)

无论您使用什么API创建窗口/ GL上下文,都可以处理事件,即鼠标移动事件,这样您就可以在屏幕坐标上跟踪鼠标的位置 。然后你可能会使用正交投影,也许你的相机不是静态的,而是与播放器一起移动。

在这里考虑这些变量,列出了你需要的东西。

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

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

  3. 计算玩家到此时的矢量。

  4. 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游戏中,您的屏幕尺寸将与相机尺寸相同。如果您更改相机尺寸,它看起来就像是相机正在放大/缩小,因此我们会考虑到这一点。

    现在让我们假设相机的原点位于屏幕的中心。在这种情况下,你的ortho函数看起来像这样,

    // 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();
    

    就是这样。

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