在opengl中沿旋转方向移动

在opengl中沿旋转方向移动,opengl,3d,rotation,trigonometry,path-finding,Opengl,3d,Rotation,Trigonometry,Path Finding,我是OpenGL新手,但对基本的三角学有很好的掌握(从学校开始就被遗忘了很多!),但我在这方面遇到了麻烦 我有一个角色在Z轴上前后移动。要向左和向右移动,而不是扫射,我希望它们旋转(分别按下左箭头键和右箭头键时),然后当它们再次向前/向后按下时,它们朝着它们所面对的方向移动 所以我做的是让左/右函数在用于绘制角色旋转的角度变量上加/减少量。然后,向前/向后函数向x轴和z轴变量添加/减去少量变量。它们如下所示(适用于后向): 航向变量是由左右箭头键操纵的角度 我认为这是可行的,因为当球员向前直行时

我是OpenGL新手,但对基本的三角学有很好的掌握(从学校开始就被遗忘了很多!),但我在这方面遇到了麻烦

我有一个角色在Z轴上前后移动。要向左和向右移动,而不是扫射,我希望它们旋转(分别按下左箭头键和右箭头键时),然后当它们再次向前/向后按下时,它们朝着它们所面对的方向移动

所以我做的是让左/右函数在用于绘制角色旋转的角度变量上加/减少量。然后,向前/向后函数向x轴和z轴变量添加/减去少量变量。它们如下所示(适用于后向):

航向变量是由左右箭头键操纵的角度

我认为这是可行的,因为当球员向前直行时,头球是0,所以cos(0)=1和sin(0)=0,这意味着它们在X上不移动,但在Z上移动0.005。我想我的基本三角知识并不完全正确,因为如果我转动一点,然后向前移动,它们就朝那个方向移动,但是如果我再转动一点,然后向前移动,它们就沿着同一条线移动,如果旋转90度,然后继续,好像是180度,然后是270度等等

编辑:我会尝试更好地解释,基本上,如果我向左转弯后按向前键,它会朝我想要的方向移动,但如果我放开向前键,再多转一点,然后再按向前键,角度会增加,但方向与它应该移动的方向成90度角。对不起,我不能很好地解释这一点

编辑:好的,我遇到了一些奇怪的问题,我认为可能是这些问题导致了奇怪的“90度”问题,当我让角色看起来90度(通过硬编码标题=90)左/右时,cos(标题)应该是0对吗?但出于某种原因,它的值是-0.44,如果我cos-1(-0.44),我得到116.1,这和数学有关吗。cos()想要以弧度表示的角度还是什么?我在这里完全迷路了

这是解决这个问题的正确方法吗?我完全被困在用减号反复尝试

如蒙答复,不胜感激

谢谢

无限化

(另外,我知道我应该为字符的速度/旋转值使用deltaTime,而不是硬编码的0.005f,但我想在排序之前先解决这个问题)。

应该是*不是+

基于:

x = r cos (theta)
y = r sin (theta)
您将需要:

z -= 0.005f * Math.cos(heading);
x -= 0.005f * Math.sin(heading);
如果这就是你想要的?我必须承认,我没有完全理解你对实际发生的事情的描述


编辑:您可能希望使用大于0.005的“半径”,这取决于您的坐标系的工作方式。

啊,对不起,我没有*没有+,但在我的问题中写错了。此外,0.005不是半径,而是按下上/下箭头时玩家移动的量。所以在我添加三角之前,它向前和向后移动了0.005,但是现在,0.005的一个百分比在基于角度的方向上移动。嗨,嘶嘶。是的,就三角而言,它是半径,但在你的计算中,它是标量速度。这就是为什么我用引号引它。您正在将标量速度(直角三角形的斜边,或圆的半径)转换为速度向量(三角形的对边和相邻边,或由该半径构成的圆圆周上该点的坐标)。你现在能用了吗?哦,我刚刚读了你问题的编辑。你能告诉我们你是怎么计算“标题”的吗?我说的Z随着屏幕的上升而增加,X随着屏幕的上升而增加,对吗?对不起,在我做这些编辑之前,我没有看到你的评论。Z随着我向上移动屏幕而减小,而X则向右移动,但这正是我设置相机的方式,所以我可以随时更改它。我明白你说的是半径,因为我在h*cos(θ)方程中使用它。当按下左右箭头时,我通过+=和-=算出航向,因此按住向右键一段时间将以0.05f(或任何数字)的速率增加航向值,然后按下向前键时,将其放入math.cos(航向)。嗯。。。我觉得一切都很好!当它出错时,是否有可能找出Math.cos和Math.sin返回的是什么,以及标题是什么?当航向介于PI和(2*PI)之间时,Sin应该为负值,当航向介于0和-PI之间时,Sin也应该为负值。当航向介于PI/2和(3*PI)/2之间时,Cos应为负值;当航向介于-PI/2和-(3*PI)/2之间时,Cos也应为负值。我猜你在弧度范围内工作?你根本没有限制航向?
z -= 0.005f * Math.cos(heading);
x -= 0.005f * Math.sin(heading);