在opengl中沿旋转方向移动

时间:2011-02-13 00:32:54

标签: opengl 3d rotation trigonometry path-finding

我是OpenGL的新手,但对基本的三角学有很好的把握(从学校开始就忘记了很多!)但是我遇到了麻烦。

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

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

z -= 0.005f * Math.cos(heading);
x -= 0.005f * Math.sin(heading)

标题变量是由左右箭头键操纵的角度。

我认为这会有效,因为当玩家直接前进时,标题为0,因此cos(0)= 1且sin(0)= 0,这意味着他们在X上无处可去,但转发全部0.005金额Z.我想我的基本三角知识并不是完全合理的,因为如果我转了一下然后向前移动它们会向那个方向移动但是如果我再向前移动那么向前移动它们会在同一条线上移动,如果它旋转了90度,然后再继续,好像它是180度然后270度等。

编辑:我会尝试更好地解释一下,基本上如果我向左转后向前按它将朝我想要的方向前进,但如果我放开前进,再转一点然后再向前推,角度应该增加,但方向与它应该的方向相差90度。对不起,我无法解释这一点。

编辑:好的,我得到一些奇怪的问题,我认为可能会导致奇怪的“90度”问题,当我让角色看起来是90度(通过硬编码航向= 90)左/右, cos(标题)应该是0对吗?但由于某种原因,它出现为-0.44,如果我cos-1(-0.44)我得到116.1,它是否与Math.cos()有关,想要弧度或其他角度?我完全迷失在这里。

这是解决这个问题的正确方法吗?我完全陷入了试验和错误的错误......

感谢任何回复,

由于

InfinitiFizz

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

1 个答案:

答案 0 :(得分:4)

应该是* not +

基于:

x = r cos (theta)
y = r sin (theta)

你会想要:

z -= 0.005f * Math.cos(heading);
x -= 0.005f * Math.sin(heading);

如果这就是你要追求的?我必须承认,我并没有完全理解你对实际情况的描述。

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