如何相对移动角度?

时间:2012-03-03 22:44:54

标签: c++ math opengl rotation sdl

我一直在互联网上查看如何在指定距离的角度上从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));
};

2 个答案:

答案 0 :(得分: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}},这就是我们将度数转换为弧度的方式。

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

答案 1 :(得分:0)

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

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