在OpenGL中朝着旋转方向移动。

4
我对OpenGL还很陌生,但基本三角函数掌握得不错(自学以来,已经遗忘了很多!),但我在这方面遇到了一些问题。
我的角色沿Z轴前后移动。为了向左和向右移动,我想要它们旋转(分别按左箭头和右箭头键时),然后再按前/后键时,它们就会朝着它们面对的方向移动。
所以我编写了左/右函数,将小量加/减到一个角度变量上,该变量用于绘制角色旋转。然后前/后函数将小量加/减到X和Z轴变量上。它们如下所示(用于向后移动):
z -= 0.005f * Math.cos(heading);
x -= 0.005f * Math.sin(heading)

变量heading是由左右箭头键控制的角度。我以为这会起作用,因为当玩家直向前方时,heading为0,所以cos(0)=1,sin(0)=0,这意味着他们在X轴上不动,在Z轴上完全向前移动了0.005个单位。我想我的初步三角学知识不完全正确,因为如果我转弯一点然后向前移动,它们就朝那个方向前进,但如果我再移动一点然后向前移动,它们就像旋转了90度的同一条线路,然后继续像旋转了180度、270度等一样。

编辑:我会尽力更好地解释一下,基本上,如果我向左转后按向前键,它将朝我想要的方向前进,但如果我松开向前键,再转一点,然后再按向前键,角度已经增加了,但方向就像是从应该去的方向旋转了90度。抱歉,我无法很好地解释这个问题。

编辑:好吧,我遇到了一些奇怪的问题,我认为这可能导致了奇怪的“90度”问题,当我让角色向左/右看90度(通过硬编码heading=90)时,cos(heading)应该是0,对吧?但出于某种原因,它的值是-0.44,如果我cos-1(-0.44),我得到116.1,这是Math.cos()想要弧度角度之类的东西吗?我完全迷失了。

这是解决这个问题的正确方法吗?我完全被负号困住了……

任何回复都受到欢迎,

谢谢

InfinitiFizz

(此外,我知道应该使用deltaTime来为角色的速度/旋转值而不是硬编码的0.005f,但我想先解决这个问题再进行排序)。

1个回答

4

应该使用*而不是+

基于:

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

你需要:

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

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

编辑:根据你的坐标系统如何工作,你可能需要使用大于0.005的更大“半径”。


嗨Fizz。就三角函数而言,它是半径,但对于你的计算来说,它是标量速度。这就是为什么我将其放在引号中的原因。你正在将标量速度(直角三角形的斜边或圆的半径)转换为速度向量(该三角形的对边和邻边,或由该半径产生的圆周上点的坐标)。所以现在它正常工作了吗? - Dave
抱歉,在我进行这些编辑之前,我没有看到你的评论。Z轴随着屏幕向上移动而减小,X轴向右增加,但这只是我设置相机的方式,所以我可以随时更改。啊,我明白你所说的它是半径,因为我在h * cos(theta)方程中使用它。我通过+=和-=来计算航向,当按下左右箭头时会增加或减少它,因此按住右键一段时间将以0.05f(或任何数字)的速率增加航向值,然后当按下前进键时,它被放入math.cos(heading)中。 - Infiniti Fizz
哦,另一个想法!你在使用glRotatef吗?那确实需要度数。但是Math.cos仍然可能需要弧度,具体取决于你使用的库。 - Dave
嘿,感谢所有的回复,自从我上次评论以来我还没有尝试过任何东西,但我认为我可以回答一些问题。首先,我正在使用LWJGL进行此操作,因此使用Java Math库,在查找后似乎确实需要弧度。 - Infiniti Fizz
同时,我并不打算在之后使用arccos/cos-1,目前“heading”是Player类的全局变量,因此在任何地方都直接使用它。 - Infiniti Fizz
显示剩余10条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接