我目前正在为卫星游戏构建一个简化的反应控制系统,并且需要一种方法来使用该系统将卫星与世界空间坐标中的给定单位方向对齐。因为这是一个游戏模拟,所以我伪造了系统,只是在物体的震中周围施加了一个扭矩力。
这很困难,因为在我的情况下,Torque 的强度不能改变,它要么打开要么关闭。要么全力,要么不施力。计算需要施加扭矩的方向相对容易,但我很难让它完美对齐而不会失去控制并陷入逻辑循环。它需要在准确的“时间”施加反作用力,以零角速度降落在目标方向上。
到目前为止,我确定的是,我需要根据我当前的角速度和两个向量之间的角度来计算达到零速度所需的“时间”。如果这超过了我达到零角的时间,那么它需要施加相反的扭矩。从理论上讲,这也将防止它围绕轴“弹跳”太多。我几乎让它工作了,但在某些情况下,它似乎在向一个方向施加力时卡住了,所以我希望有人可以检查逻辑。我的模拟目前不考虑质量,因此您可以忽略惯性张量(除非它使计算更容易!)
对于一个轴,我目前正在这样做,但我认为有人会有一个更优雅的解决方案,它实际上可以同时计算偏航轴和俯仰轴(Roll 无效)。
Omega = Angular Velocity in Local-Space (Degrees Per Second)
Force = Strength of the Thrusters
// Calculate Time Variables
float Angle = AcosD(DotProduct(ForwardVector, DirectionVector));
float Time1 = Abs(Angle / Omega.Z); // Time taken to reach angle 0 at current velocity
float Time2 = Abs(DeltaTime * (Omega.Z / Force); // Time it will take to reach Zero velocity based on force strength.
// Calculate Direction we need to apply the force to rotate toward …Run Code Online (Sandbox Code Playgroud)