如何相对于角度移动?

Posted

技术标签:

【中文标题】如何相对于角度移动?【英文标题】: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() ,这样您的转换就不会不断累积。 【参考方案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】:

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

    标准 C++ cos/sin 函数采用弧度而不是度数(一个弧度 = 180/pi 度)。 虽然我不熟悉 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 可能会更简单

以上是关于如何相对于角度移动?的主要内容,如果未能解决你的问题,请参考以下文章

视区相关单位vw, vh ,vm,CSS/CSS3长度时间频率角度单位大全

更新角度变量后,视图不会在移动应用程序上更新,尽管它适用于浏览器

[UE4]让箭头保持水平的第二种方法:CombinrotatorsDelta(Rotator)

如何计算并获得音高的平滑值?

从客户端的角度来看移动端IM即时通讯的消息可靠性和送达机制

处理相对于画布而不是图像可拖动的旋转画布图像