使用放置在其上的引擎保持物理对象直立

Keep physics object upright using engines placed on it

所以,我正在为 3D 物理对象编写自动驾驶仪。

玩家可以随心所欲地放置任意数量的引擎。然后,自动驾驶仪应该使用发动机使这个物体保持直立,控制每个发动机的推力量 0-100%。所以如果它向右倾斜,它应该向右更多地点燃所有引擎。如果它向前倾斜,但只是稍微向右倾斜,则所有朝它倾斜方向的引擎都应该发射更多,因此物体会再次直立。

我该怎么做?

  1. 确定电机使用情况

    • 你必须列出你的电机的用途
    • 所以把所有电机按方向分组
    • 你应该有左、右、上、下、前进、后退的马达
    • 问题是你可能会遗漏一些......在那种情况下你就完蛋了,无法完成任务
    • 对于非轴对齐的任意电机,分组排序并不容易
    • 为了简化这个只做电机方向和组方向的点积
    • 并且最大值属于该组的电机
    • 最小值(负)属于相反方向
    • 所以用组标记每个电机
    • 并尝试 select 他们这样每组至少有一个马达
  2. 控制

    • 好吧,只需使用任何类型的调节 P、PI、PID... 来保持位置
    • 应该很简单
    • 例如x组带P(比例调节)的电机
    • thrust_x = c0 + c1 * (object_x-wanted_x)
    • 其中 c1 是响应常数 用它来实现想要的响应
    • 太大会引起震荡
    • 太小反应慢
    • c0正在消灭重力等外力场
    • 两者 c0,c1 都取决于群体强度、物体质量、...
  3. 如果你还需要控制方向

    • 那么你只需要添加更多的组

[注释]

  • 电机的使用可以随时间变化(物体可以旋转)
  • 所以你可以将所需的位置转换为对象局部坐标系
  • 或者偶尔重新计算分组