4

我对 OpenGL 真的很陌生,但是对基本的三角学有很好的掌握(从学校开始就被遗忘了很多!)但是我遇到了麻烦。

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

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

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

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

我认为这会起作用,因为当玩家直线前进时,航向为 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,这与 Math.cos() 想要以弧度为单位的角度有关吗?我完全迷失在这里。

这是解决这个问题的正确方法吗?我完全陷入了反复试验与减号的困境......

任何回复表示赞赏,

谢谢

英菲尼迪菲兹

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

4

1 回答 1

4

It should be * not +

based on:

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

you will want:

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

If that's what you're after? I must admit, I didn't fully understand your description of what actually happens.

EDIT: you'll probably want to use a larger "radius" than 0.005, depending on how your coordinate system is working.

于 2011-02-13T00:45:54.470 回答