如何相对于角度移动?
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】:如果我是正确的数学函数sin
和cos
都以弧度表示角度,不是 度,因为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在这里手动计算xrel
:event.motion.x - player.rotxl
,使用SDL_WarpMouse((screen->w/2), (screen->h/2));
使鼠标不断居中,这样就可以了。但确实,与这种方法相比,使用event.motion.xrel
可能会更简单以上是关于如何相对于角度移动?的主要内容,如果未能解决你的问题,请参考以下文章
视区相关单位vw, vh ,vm,CSS/CSS3长度时间频率角度单位大全
更新角度变量后,视图不会在移动应用程序上更新,尽管它适用于浏览器