Controle de espaçonave modular


8

Estou desenvolvendo um jogo baseado em física com naves espaciais.

Uma nave espacial é construída a partir de círculos conectados por juntas. Alguns dos círculos têm motores conectados.

Os motores podem girar em torno do centro do círculo e criar empuxo. Quero poder mover o navio em uma direção ou girar em torno de um ponto, definindo a rotação e o empuxo de cada um dos motores do navio.

Como posso encontrar a rotação e o impulso necessários para cada mecanismo para conseguir isso?

insira a descrição da imagem aqui



11
Não se esqueça de olhar para o controle pid pt.wikipedia.org/wiki/PID_controller, para evitar flutuações desnecessárias (instabilidade temporária) ou direcionamento não natural.
huseyin tugrul buyukisik

Respostas:


6

Vamos imaginar a situação simples de um navio com apenas um motor. Para mover o navio, simplesmente apontamos o propulsor para longe da direção que queremos seguir e empurramos para fora. Isso nos empurra na direção que queremos seguir. Não é possível girar um navio composto por apenas um propulsor.

Vamos escalar nosso navio para três motores para torná-lo mais interessante:

insira a descrição da imagem aqui

Se quiséssemos mover este navio para algum lugar acima e para a esquerda, apenas apontaríamos todos os nossos propulsores na direção oposta e dispararíamos:

insira a descrição da imagem aqui

A mesma solução que o propulsor único que cuida do movimento linear.

Mas e se estivermos perdendo um propulsor? Temos uma carga desigual?

insira a descrição da imagem aqui

Seguir a mesma estratégia fará com que o navio gire. Em muitas situações, isso será inevitável e, em alguns casos, preferível, pois orientará o navio para um melhor uso dos propulsores disponíveis.

Uma estratégia para mitigar isso seria a equalização. Divida o navio no eixo do movimento desejado:

insira a descrição da imagem aqui

Depois, verifique se o lado direito e o lado esquerdo são iguais. Se eles não escalarem a saída do propulsor até que o façam. Isso pode facilmente resultar em nenhum impulso sendo aplicado. Cabe a você decidir se, em vez disso, deseja empurrar causando rotação ou forçar o jogador a redesenhar sua nave reorganizando seus propulsores.

E a rotação?

Esta pergunta descreve muito bem a ideia.

insira a descrição da imagem aqui

Você precisará calcular o centro de massa . Em seguida, calcule o torque fornecido por cada propulsor. Para sua sorte, seus propulsores giram, para que você possa girá-los para fornecer o torque máximo. O torque máximo virá de um ângulo reto para o braço do momento. A aplicação da soma dos torques fará com que o corpo gire em torno do centro de massa. Você também pode escolher outro ponto de rotação arbitrário, como a ponte do navio.

Se você quiser garantir que você gire no lugar, pode reduzir o impulso dos propulsores que farão com que o seu navio se mova linearmente. Você pode fazer isso somando todos os propulsores que possuem torque positivo e todos aqueles com torque negativo; em seguida, compare seus valores absolutos. O grupo com o valor absoluto maior deve ser redimensionado para corresponder ao valor absoluto do outro grupo.

Você também pode encontrar um recurso muito útil em Amit Patel .

insira a descrição da imagem aqui

Ele fez uma série de 4 partes em naves espaciais configuráveis ​​aqui: parte 1 , parte 2 , parte 3 , parte 4


Existem outras soluções (mais elegantes) para isso. Mas, idealmente, se o jogador cria bons designs, essas estratégias devem funcionar. Essa resposta é apenas um ponto de partida básico para esse tipo de controle. Há muito espaço para melhorias.
MichaelHouse

-5

Eu resolvi isso com a pesquisa local. Está funcionando, mas o desempenho é quase ruim. Talvez seja melhor usar a mecânica teórica, mas eu não sei.


4
-1, essa é uma resposta muito vaga. Você pode explicar mais o que você realmente fez para resolver o problema?
Michaelhouse
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.