【问题标题】:How to move relatively to the angle?如何相对于角度移动?
【发布时间】:2012-03-03 22:44:54
【问题描述】:

我一直在互联网上查找如何以指定距离的角度从 A 点移动到 B 点。然而,当我尝试对其进行编码时,相机只是搞砸了,我正朝着随机方向移动。我在 C++ 中使用 SDL/OpenGL,这是我的播放器功能。现在,我正试图让玩家沿着这个角度向前移动。

void player_action()
{

    if (SDL_PollEvent(&event))
    {
        switch (event.type)
        {
            case SDL_MOUSEMOTION:
                {
                    player.rotxl = (screen->w)/2;
                    player.rotxd = event.motion.x - player.rotxl;
                    player.rotx = player.rotx + (player.rotxd/4);
                    if (player.rotx < 0)
                    {
                        player.rotx = player.rotx + 360;
                    };
                    if (player.rotx > 360)
                    {
                        player.rotx = player.rotx - 360;
                    }
                };
            break;

            case SDL_KEYDOWN:
                switch (event.key.keysym.sym)
                {
                    case SDLK_w:
                        {player.zvel = 8.0f;}; break;
                    case SDLK_a:
                        {player.xvel = 8.0f;}; break;
                    case SDLK_s:
                        {player.zvel = -8.0f;}; break;
                    case SDLK_d:
                        {player.xvel = -8.0f;}; break;
                    case SDLK_ESCAPE:
                        {running = false;}; break;
                    default: break;

                }; break;

            case SDL_KEYUP:
                switch(event.key.keysym.sym)
                {
                    case SDLK_w:
                        {player.zvel = 0.0f;}; break;
                    case SDLK_a:
                        {player.xvel = 0.0f;}; break;
                    case SDLK_s:
                        {player.zvel = 0.0f;}; break;
                    case SDLK_d:
                        {player.xvel = 0.0f;}; break;
                    default: break;
                };
            break;
        };

    };

    player.x = player.x + float(player.zvel*cos((double)player.rotx));
    player.z = player.z + float(player.zvel*sin((double)player.rotx));

    glRotatef(player.rotx, 0.0f, 1.0f, 0.0f);
    glTranslatef(player.x, player.y, player.z);

    SDL_WarpMouse((screen->w/2), (screen->h/2));
};

【问题讨论】:

  • 您可能希望在您的 glRotatef 和 glTranslatef 周围使用 glPush() 和 glPop() ,这样您的转换就不会不断累积。

标签: c++ math opengl rotation sdl


【解决方案1】:

如果我是正确的数学函数sincos 都以弧度表示角度,不是 度,因为player.rotx 似乎是。请尝试以下操作:

player.x = player.x + float(player.zvel*cos((double)player.rotx*0.0174532925));
player.z = player.z + float(player.zvel*sin((double)player.rotx*0.0174532925));

我们将player.rotx 乘以pi/180,这就是我们将度数转换为弧度的方式。

不确定这是否是您唯一的问题,但它肯定是其中之一。

【讨论】:

  • +1,你刚刚解决了我的问题。我不知道是这样的。
  • 这是一件很容易被忽略的事情(事实上,当我几年前在自己的一个游戏中第一次实现类似机制时,我也是这样做的)。很高兴你让它工作:)
  • 我应该指出,在“修复”问题后,如果我按 W 或 A 键,相机总是会向左或向右移动。因此,在 glRotate3f 中,我将第一个参数更改为 player.rotx + 90,它解决了问题。
【解决方案2】:

我看到的问题的两个可能来源:

  1. 标准 C++ cos/sin 函数采用弧度而不是度数(一个弧度 = 180/pi 度)。
  2. 虽然我不熟悉 SDL,但快速浏览一下 docs 会让我觉得您应该使用 event.motion.xrel 而不是 .x。您必须更改不需要屏幕宽度的 rotx 计算。

【讨论】:

  • 不。 2,我相信OP在这里手动计算xrelevent.motion.x - player.rotxl,使用SDL_WarpMouse((screen-&gt;w/2), (screen-&gt;h/2));使鼠标不断居中,这样就可以了。但确实,与这种方法相比,使用event.motion.xrel 可能会更简单
猜你喜欢
  • 2018-05-14
  • 1970-01-01
  • 2020-01-11
  • 1970-01-01
  • 1970-01-01
  • 2015-10-23
  • 1970-01-01
  • 2019-06-02
  • 2014-08-20
相关资源
最近更新 更多