Я думаю, вы можете разбить это на две части.Первый - это решить, каким должно быть ваше ускорение в каждом кадре, исходя из вашей текущей и желаемой скорости.Простое правило для этого
acceleration = k * (desired velocity - current velocity)
, где k
- константа, определяющая, насколько «отзывчива» система.Другими словами, если вы идете слишком медленно, ускоряйтесь (положительное ускорение), и если вы идете слишком быстро, замедляйтесь (отрицательное ускорение).
Вторая часть немного сложнее визуализировать;Вы должны выяснить, какая комбинация движителей дает вам желаемое ускорение.Давайте назовем c_i
количество, которое толкает каждый двигатель.Вы хотите решить систему связанных уравнений
sum( c_i * thrust_i ) = mass * linear acceleration
sum( c_i * thrust_i X position_i) = moment of interia * angular acceleration
, где X
- кросс-продукт.Моя физика может быть немного не в порядке, но я думаю, что это правильно.
Это уравнение из 6 уравнений (в 3D) и N неизвестных, где N - это число симметров, но у вас есть дополнительное ограничение, котороеc_i
> 0 (при условии, что двигатели не могут толкать назад).
Это сложная проблема, но вы должны иметь возможность установить ее как LCP и получить ответ, используяПрогнозируемый метод Гаусса Зейделя.Вам не нужно получать точный ответ, просто что-то близкое, так как вы будете решать его снова для немного других значений в следующем кадре.
Надеюсь, это поможет ...