使对象平滑地旋转进出



我遇到了麻烦,我已经搜索和研究了,但我就是想不通。

我正在制作一个太空游戏,想让玩家定位飞船,让飞船平稳地进出。因此,飞船的旋转速度会先增加然后降低,这样它就不会超过目标。

我查过SUVAT和那种,但我就是无法尝试。

我必须使用的价值观是

  • 船的角度
  • 船舶所需的角度
  • 船舶的转速
  • 飞船的转速可以增加的速度
因此

,如果飞船处于角度 0 并想要定向到角度 90,它将增加其旋转速度,直到角度 45 时它将开始降低其旋转速度,因此当它达到角度 90 时,旋转速度将停止。

我应该注意,转速可以是正的或负的,这取决于船需要旋转的方式(顺时针/逆时针)

谁能帮我?

飞船的旋转速度会增加一半时间,另一半时间会减少。您可以首先确定中间点:half = abs(desiredAngle - startAngle) 。(绝对值允许这适用于正值和负值)在开始旋转之前计算此值。然后,在更新循环中,计算旋转了多少: currentChange = abs(currentAngle - startAngle); 要计算转速,rotationSpeed += (currentChange > half) ? -rate : rate; 但是,使用此方法,您可能会略微低于或过度拍摄所需的角度。要解决此问题,请检查您是否在最终角度的某个(小)阈值内,然后将当前角度设置为所需角度,并将旋转速度设置为零。

如果飞船的旋转速度可以降低/增加,则如果玩家在向另一个目标移动的同时改变目标,则无法阻止玩家设定的目标超载。但是,您可以做的是确保以尽可能快的速度以零速度(即不超调)达到最终目标的方式调整当前速度。有关解决最佳控制问题的通用方法,请参见 http://en.wikipedia.org/wiki/Optimal_control。最佳控制通常涉及始终以全推力加速/减速(直到达到目标)。

为了解决这个问题,C表示新命令下达的当前角度,T表示目标角度.接收到新目标时的角速度用V'表示,最大加速度用M表示.正V表示顺时针旋转,负V表示逆时针移动。

假设你的初始角速度大于0(V'>0),那么有两种可能达到T:

1)增加V一个周期U,然后减小它直到它为零。然后你的最终角度将是(画一张速度与时间的图片,并确定它的区域要验证):

C+ V'^2/(2 M) + 2U*V' + M U^2

这应该等同于T来找到U(ABC公式),除非它没有给出解决方案(负判别式),其中选项2)应该给出解决方案。

2)减小V一段时间,最终改变V的符号,然后增加V直到零。绘制图片可以得到:

C+ V^2/(2 M) - M U^2. 

等同于 T 给出 U。

你会发现有一个非常简单的条件来确定选项1)或2)是否给出解决方案。

初始速度 V'<0 相似的情况(1 和 2,也许还有一些符号,翻转)。再次,画一幅画,以防您感到困惑。


这里有一些微妙的事情,因为如果你想在T',那么T'+K 360度(/2 pi弧度)也可以(前提是你可以全天候)。因此,您实际上可以选择最容易访问的T别名

最新更新