Quelques choses différentes. Premièrement, nous devons reconnaître qu’il s’agit d’un problème sous-contraint. C'est-à-dire qu'il existe de nombreuses combinaisons de propulseurs pouvant donner lieu à une rotation dans le même sens. Je suppose que dans votre situation, il n'y a que deux états pour les propulseurs, "on" et "off", et tous les propulseurs produisent une force égale.
Deuxièmement, en regardant votre modèle, il semble que votre "centre de masse" ne soit pas réellement votre centre de masse. Heureusement, cela n'affectera pas vos calculs pour le couple. Cependant, cela affectera vos calculs pour le déplacement du centre de masse. Je ne sais pas si vous vous souciez de la précision à ce niveau, car votre "centre de masse" est au moins le carré le plus proche du véritable centre de masse.
Troisièmement, si vous voulez calculer l’impact d’un certain propulseur sur la rotation, vous avez raison, bien que vous utilisiez une formule inefficace. Le couple peut être calculé comme r x F
, ce qui a une magnitude r*F*sin(theta)
. Cependant, calculer les angles dans ce cas est une méthode inefficace. Au lieu de cela, vous devez utiliser directement la définition de couple entre produits, car cela sera beaucoup plus simple en utilisant les représentations que vous avez. Comme tous vos vecteurs n’ont pas de composante z, la formule du produit croisé se simplifie grandement.
Sans changer les résultats de vos calculs, nous pouvons simplement mettre à jour votre code
private function thrustTorque():Float
{
var torque = distToCOM.x*dir.y-distToCOM.y*dir.x;
return torque;
}
C'est beaucoup mieux (et plus rapide).
Vous suggérez dans votre propre réponse que votre solution consiste à allumer tous les propulseurs avec un couple dans la bonne direction. Maintenant, cela résout à peu près la question que vous avez posée. Cependant, je m'attends à ce que vous constatiez que votre stratégie n’est pas aussi satisfaisante, si un utilisateur appuie sur le bouton "Rotation" et que tous les propulseurs avec un couple positif tournent, les déplaçant potentiellement vers le haut. de les faire pivoter (je ne suis pas sûr du niveau de détail de votre simulation, si vous calculez réellement les forces des propulseurs, ou si vous les montrez visuellement en train de tirer, puis faites pivoter votre modèle avec une accélération constante, ou quelque chose du genre. vous voulez que les propulseurs tirent au moins approximativement avec précision).
Vous ne tenez pas compte de la force nette sur le navire. Si vous aviez des montants de propulseur arbitraires, cela pourrait alors devenir un problème assez compliqué. Cependant, comme nos propulseurs n'ont que deux états, il est assez simple à analyser. Je ne sais pas exactement quel est notre objectif, alors je pourrais en imaginer deux différents: premièrement, nous voulons minimiser la force totale tout en maintenant le couple dans la direction souhaitée. Deuxièmement, nous voulons maximiser le rapport couple / force totale.
En passant, si vous pouviez imaginer un contrôle supplémentaire du "volume du propulseur" qui affecte la puissance de tous les propulseurs simultanément, vous pouvez régler ce contrôle de sorte que vos deux solutions aient un couple égal, et vous voyez que la deuxième solution ne peut avoir qu'un déplacement plus petit que le premier. Cependant, nous devons nous rappeler que s'il est possible de déclencher les propulseurs de manière à ne faire que pivoter et à ne pas bouger du tout, les deux solutions seront identiques.
Nous allons donc passer à la deuxième solution, basée sur les arguments du paragraphe précédent. Maintenant, en analysant la force totale, nous pouvons simplement noter que les moteurs ne peuvent pointer que dans quatre directions. Ainsi, la force totale dans la direction x est simplement le nombre de propulseurs pointant à gauche moins le nombre pointant à droite, et de même pour la direction y.
Après avoir écrit jusque-là, je dois réfléchir un peu plus à l’algorithme pour l’optimiser. Je pense que le reste de mon message est utile en l’état, je le poste donc, mais je le mettrai à jour lorsque je trouverai le meilleur moyen d’optimiser cette configuration (j’ai pensé à plusieurs façons d’obtenir des réponses approximatives, mais aucun d’eux n’est exact).