Algumas coisas diferentes. Primeiro, precisamos reconhecer que esse é um problema pouco restrito. Ou seja, existem muitas combinações diferentes de propulsores que podem disparar para resultar em rotação na mesma direção. Estou assumindo que na sua situação existem apenas dois estados para os propulsores, "on" e "off", e todos os propulsores produzem força igual.
Segundo, observando seu modelo, parece que seu "centro de massa" não é realmente o seu centro de massa. Felizmente, isso não afetará seus cálculos para o torque. No entanto, isso afetará seus cálculos para o centro do deslocamento de massa. Não tenho certeza se você se importa com a precisão nesse nível, já que o seu "centro de massa" é pelo menos o quadrado mais próximo do verdadeiro centro de massa.
Terceiro, se você deseja calcular como um determinado propulsor afetará a rotação, você está certo, embora esteja usando uma fórmula ineficiente. O torque pode ser calculado como r x F
, que possui magnitude r*F*sin(theta)
. No entanto, calcular os ângulos nesse caso é um método ineficiente. Em vez disso, você deve usar diretamente a definição de torque entre produtos, pois isso será muito mais simples usando as representações que você possui. Como todos os seus vetores não têm componente z, a fórmula para produtos cruzados simplifica bastante.
Sem alterar os resultados do seu cálculo, podemos apenas atualizar seu código
private function thrustTorque():Float
{
var torque = distToCOM.x*dir.y-distToCOM.y*dir.x;
return torque;
}
Isso é muito melhor (e mais rápido).
Você sugere em sua própria resposta que sua solução é acionar todos os propulsores com torque na direção certa. Agora, isso praticamente resolve a pergunta que você fez. No entanto, espero que em algum momento, você descubra que sua estratégia não é tão satisfatória, se um usuário mantém pressionado o botão "girar" e todos os propulsores com um torque positivo giram, potencialmente movendo-os para cima de rotacioná-los (não tenho certeza do nível de detalhe da sua simulação, se você realmente calcula as forças dos propulsores, ou se apenas os mostra visualmente disparando e depois gira seu modelo com uma aceleração constante ou algo assim. Dessa forma, você deseja que os propulsores disparem pelo menos aproximadamente com precisão).
Você não considera a força líquida no navio. Se você tivesse valores arbitrários de propulsor, isso poderia se transformar em um problema bastante complicado. No entanto, como nossos propulsores têm apenas dois estados, é bastante simples de analisar. Não sei exatamente qual é o nosso objetivo aqui, então pude imaginar dois diferentes: primeiro, queremos minimizar a força total, mantendo o torque na direção que queremos. Segundo, queremos maximizar a proporção de torque em relação à força total.
Além disso, se você puder imaginar um controle adicional de "volume do propulsor" que afeta a potência de todos os propulsores simultaneamente, poderá definir esse controle para que suas duas soluções tenham torque igual e você verá que a segunda solução pode ter apenas um deslocamento menor que o primeiro. No entanto, precisamos lembrar que, se for possível acionar os propulsores para que você apenas gire e não se mova, as duas soluções serão as mesmas.
Então, vamos seguir com a segunda solução, com base nos argumentos do parágrafo anterior. Agora, ao analisar a força total, podemos simplesmente observar que existem apenas quatro direções que os motores podem apontar. Assim, a força total na direção x é apenas o número de propulsores apontando para a esquerda menos o número apontando para a direita e da mesma forma para a direção y.
Depois de escrever até aqui, tenho que pensar um pouco mais sobre o algoritmo para otimizá-lo. Acho que o restante da minha postagem é útil, por isso estou publicando, mas atualizarei quando descobrir a melhor maneira de otimizar essa configuração (pensei em algumas maneiras de obter respostas aproximadas, mas nenhum deles é exato).