IA para mover naves espaciais personalizadas (forma que afeta o comportamento do movimento)

15

Estou projetando um jogo de estratégia de combate de frota espacial 3D-6DOF baseado em turnos em rede, que depende muito da personalização de navios. Deixe-me explicar um pouco o jogo, já que você precisa saber um pouco sobre ele para definir a pergunta.

O que eu pretendo é a capacidade de criar sua própria frota de navios com formas personalizadas e módulos anexados (hélices, vigas de trator ...), o que daria vantagens e desvantagens para cada navio, para que você tenha várias distribuições de frota diferentes. Por exemplo, um navio longo com duas hélices ao lado deixaria o navio girar com facilidade naquele avião, navios maiores se moveriam lentamente, a menos que você coloque muitas hélices na parte de trás (gastando mais pontos de "construção" e energia ao se mover, e mova-se rapidamente nessa direção.) Pretendo equilibrar todo o jogo em torno desse recurso.

O jogo giraria em torno de duas fases: ordens e fase de combate. Durante a fase de pedidos, você comanda os diferentes navios. Quando todos os jogadores terminam a fase de pedidos, a fase de combate começa e as ordens do navio são resolvidas em tempo real por algum tempo, então a ação faz uma pausa e há uma nova fase de pedidos.

O problema surge quando penso na entrada do player. Para mover um navio, você precisa ativar ou desativar hélices diferentes, se quiser dirigir, avançar, frear, girar no lugar ... Essas hélices não precisam trabalhar com toda a potência, para que você possa obter mais movimento combinações com menos hélices.

Eu acho que essa abordagem é um pouco chata. O jogador não quer mexer em motores ou qualquer coisa, você só quer MOVER e MATAR. A maneira como pretendo que o jogador dê ordens a esses navios é por destino e rotação , e a IA calcularia a potência correta da hélice para obter esse movimento e rotação. A propulsão não precisa ser a mesma durante todo o cálculo do turno (depois que as ordens foram dadas); portanto, seria legal se os navios reagissem enquanto se moviam, ajustando o poder das hélices de acordo com suas necessidades dinamicamente, mas pode ser muito difícil de implementar e não é realmente necessário para o jogo funcionar.

Em ambos os casos, como essa IA decidirá quais hélices serão ativadas para a melhor (ou pelo menos não pior) trajetória a ser alcançada?

Eu pensei sobre algumas abordagens:

  • Aprendendo IA: os tipos de naves aprenderiam sobre seus movimentos por tentativa e erro, ajustando seu comportamento com mais usos e, finalmente, tornando-se "inteligentes". Não quero me envolver TÃO longe na codificação de IA, e acho que pode ser frustrante para o jogador (mesmo que você possa deixá-lo aprender sem jogar).
  • Movimento pré-calculado de timestep: Após a criação do navio, TODOS os movimentos possíveis são calculados para cada configuração e potência da hélice por um determinado tempo delta. Memória intensiva, feia, ruim.
  • Trajetórias pré-calculadas: o mesmo que acima, mas não para cada tempo delta, mas toda a trajetória, que seria ajustada o máximo possível. Requer uma configuração de hélice fixa para toda a fase de combate e ainda consome muita memória, é feia e ruim.
  • Forçar força bruta contínua: a IA verifica continuamente TODAS as configurações possíveis da hélice durante toda a fase de combate, pré-calcula alguns passos de tempo e decide qual é a melhor baseada nisso. Contras: o que é bom agora pode não ser tão bom depois, e é muito intensivo em CPU, feio e ruim também.
  • Forçar força bruta: O mesmo que acima, mas apenas forçar força bruta no início da simulação, por isso precisa de configuração constante da hélice durante toda a fase de combate.
  • Verificação de ângulo contínuo: Este não é um método de movimento completo, mas talvez uma maneira de descartar configurações de hélices "estúpidas". Dado o vetor normal da hélice atual e o final, você pode aproximar a potência necessária para a hélice com base no ângulo. Você deve fazer isso continuamente durante toda a fase de combate. Eu descobri isso recentemente, então não pensei muito. A priori, ele também tem a desvantagem "o que é bom agora pode não ser tão bom depois", e não se importa com as outras hélices que podem agir juntas para criar uma melhor configuração da hélice.

Eu estou realmente preso aqui. Alguma ideia?

kaoD
fonte
Você já observou comportamentos de direção?
Stonemetal
11
@stonemetal sure. O problema aqui é que os comportamentos de direção geralmente são modelados assumindo controle total da posição e rotação do objeto e algumas restrições (ou pelo menos foi o que eu encontrei na Web.) A IA aqui não tem controle total sobre a entidade , mas apenas sobre coisas (hélices) que fazem a entidade se mover. Tenho problemas para conectar esses comportamentos de direção à locomoção real da nave espacial.
22411 kaoD
essa é a mesma razão pela qual os comportamentos de direção não funcionam muito bem em carros de corrida. Os comportamentos de direção são ótimos, mas não são a solução universal para tudo.
tenpn
@haoD Eu estava pensando em algo parecido com o que a ghostonline respondeu. Deixe-os construir o que quer que seja, depois traduza-o em restrições para um comportamento de direção. Embora, a partir de sua resposta, pareça que os comportamentos de direção provavelmente não sejam flexíveis o suficiente.
Stonemetal
11
Eu sei que isso é super antiga, mas o que você está procurando é chamado de planejamento de movimento kinodynamic
mklingen

Respostas:

4

Desculpe, não tenho uma solução testada, mas isso não pode ser resolvido matematicamente?

Dada qualquer hélice e seu deslocamento em relação ao centro de massa, é possível calcular em qual plano você pode girar.

Para qualquer movimento, você pode usar 1 ou mais hélices. Cada hélice pode ser consultada para ver se seu avião pode contribuir para a orientação do alvo, quanto esforço seria necessário para a hélice contribuir (hélices distantes do CoM podem usar menos energia para gerar mais giro) e quão perto isso chegaria você para a orientação de destino. Em seguida, você A * percorre esse espaço de pesquisa até encontrar uma solução de baixo custo, que pode ser a menor energia total usada ou o movimento mais rápido.

Continue reavaliando isso ao completar o turno e moderar o poder ao se aproximar do alvo, talvez com um controlador PID.

Para avançar, uma solução simples o levaria sempre adiante, diminuindo a velocidade do alvo à medida que você se aproxima. Como você tem espaço em 3D para jogar, pode evitar rotinas complicadas de 3 pontos. Você precisaria levar em consideração os resultados das hélices escolhidas para a velocidade linear em seus cálculos de giro, como algum tipo de estado inicial.

Isso é muito atrasado, mas não vejo grandes falhas. Apenas muito trabalho duro e ajustes de número. :)

tenpn
fonte
Isto é o que eu estava procurando, uma solução matemática ... obrigado! Espero que fique tão fácil quanto parece.
KaoD
7

Como você deseja abrir mão de um pouco do controle do jogador quanto à jogabilidade usando uma IA, convém simplificar o efeito de aderir nas hélices e alterar as dimensões da nave em parâmetros menos gerenciáveis ​​para um algoritmo de computador. O jogador ainda pode adicionar hélices em qualquer parte do navio, mas uma vez concluído, isso é 'compactado' nos parâmetros.

Cada hélice afeta a taxa de rotação do navio ou, combinada com uma hélice colocada em paralelo, afeta a taxa de deslocamento em uma dimensão específica. Combine esses parâmetros para cada hélice, e você obtém a taxa máxima de rotação e a velocidade de um navio. Combine esses dois parâmetros para cada hélice e conjunto de hélices na taxa máxima de rotação e velocidade do navio como um todo, para todas as dimensões disponíveis (cima, baixo, esquerda, direita, frente, trás).

Usando a taxa de rotação e a velocidade de cada dimensão, você tem informações suficientes para realmente permitir que o navio se desloque para um destino. O jogador verá o efeito de sua configuração de hélice, mas sob o capô sua entrada é muito simplificada. Você pode criar mais de uma estratégia de voo com base na distância que o navio deve percorrer, para tornar o voo mais natural e aumentar a sensação do jogador de exercer controle sobre o movimento do navio. Mas, no final, como você disse, não importa como o navio chega ao destino e se sua rota é ideal, ele só precisa estar lá e seu horário de chegada é influenciado pela configuração da hélice.

Para as dimensões da nave, você pode fatorá-las quando tiver os valores de velocidade compactados para um efeito grosseiro ou usá-los ao calcular para obter um efeito mais preciso. Você provavelmente desejaria testar se o método preciso vale o esforço, porque a diferença pode não afetar o senso de controle do jogador.

fantasma
fonte
Não é exatamente o que eu estava procurando, mas poderia fazer o truque se eu realmente precisasse. Upvote para a ideia :)
kaoD
0

No espaço, a forma não afeta o movimento. Sem ar para arrastar.

É o navio mais a massa total de complementos que importa. É um problema de gravidade de empuxo mais simples. Assim, você pode fazer esses cálculos ou, como é um jogo de turnos, desenvolver um sistema de movimento como RPGs como o Traveler.

gnoll110
fonte
Bem-vindo ao GD.SE! Esta pergunta já tem uma resposta aceita e foi feita há 2 anos - talvez você possa responder a algumas das perguntas mais recentes do site.
Polar
Sim, é verdade, mas eu sempre assumo que outros tropeçarão mais tarde (como eu fiz) e acho isso útil. hehe, eu não vim aqui para responder perguntas ... como a maioria, procurando soluções para meus próprios problemas.
gnoll110
@ Cartaz da pergunta polar aqui. Achei a resposta dele muito interessante! Fico feliz que ele tenha voltado a responder e acho que agregar valor anos depois é uma das partes mais valiosas da SO.
kaoD
@ gnoll110 Eu posso estar errado aqui. Não há resistência, tudo bem, mas o ângulo que o vetor de empuxo se forma com o centro de massa afeta a maneira como a nave se traduz ou gira ... certo? Por exemplo: um motor alinhado com o centro de massa é traduzido, ao movê-lo para fora do centro de massa adicionará um componente rotativo ao navio.
kaoD
@kaoD Desculpe se pareceu um pouco duro - obviamente, muito SO está agregando valor mais tarde. Eu estava apenas sugerindo que ele também pudesse responder perguntas mais recentes - quanto mais perguntas respondidas, melhor!
Polar