A configuração do navio muda dinamicamente, por isso preciso determinar qual propulsor será ativado quando desejar girar o navio no sentido horário ou anti-horário. Os propulsores estão sempre alinhados ao eixo do navio (nunca em ângulo) e estão ligados ou desligados. Aqui está uma das configurações possíveis:
O que eu tentei até agora é visualizar o vetor de disparo e o vetor de direção para o centro de massa do navio:
Infelizmente, não fui muito longe com isso.
mathematics
physics
migimunz
fonte
fonte
Respostas:
Sucesso! Aqui está, e está girando como deveria:
O que fiz foi o seguinte: para cada propulsor, calculo a magnitude do torque em relação ao centro de massa.
A equação para a mangitude do torque, de acordo com a Wikipedia, é
T = rF sin(theta)
:Quando o jogador pressiona para a esquerda, eu verifico o sinal de torque desse propulsor - se for menor que zero, eu aciono o propulsor. É exatamente o oposto de girar no sentido horário.
Provavelmente, isso poderia ser melhorado usando o produto escalar para calcular o cosseno do ângulo entre os vetores, mas isso terá que esperar até amanhã.
Finalmente, aqui está uma demonstração ao vivo .
fonte
A expressão geral 3D para o binário é o produto transversal de deslocamento e de força: t = r ⨯ F . Em duas dimensões, um valor escalar para o torque será suficiente e, dadas apenas quatro orientações ortogonais para os propulsores, podemos escrever em partes:
Aqui, F é a magnitude da força gerada pelos propulsores, rx e ry são componentes x e y do vetor do ponto de articulação ao propulsor. Torques positivos tendem a girar o navio no sentido anti-horário. Usando as quatro fórmulas acima, é trivial deduzir o sinal do torque que cada propulsor produz.
Para uma representação modesta e precisa da física, você precisa não apenas conhecer o sinal do impulso, mas também sua magnitude total e a inércia rotacional. Além disso, talvez você não queira simplesmente ativar todos os propulsores alinhados corretamente para fazer uma rotação.
Conforme desenhado, a potência total dos propulsores B, D e E maximizará a rotação, mas também acelerará o navio para a direita. Desligar D impedirá isso. Se, em vez disso, se pretende acelerar a direita, mas não é uma rotação no sentido horário, o caminho mais eficiente é habilitar C e F com dois terços da potência total, juntamente com D.
Se isso não estiver além do escopo do que você está tentando fazer, seria necessário escrever algum tipo de solucionador para as equações de movimento, claramente não uma tarefa simples.
fonte
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 magnituder*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
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).
fonte