Controle de IA para um navio com modelo de física

19

Estou procurando idéias de como implementar os seguintes no espaço 2D. Infelizmente ainda não sei muito sobre AI / localização de caminhos / controle autônomo.

Digamos que este navio possa se mover livremente, mas tem massa e impulso. Além disso, forças externas podem afetá-lo (explosões, etc.). O jogador pode definir um alvo para o navio a qualquer momento e deve chegar a esse ponto e parar.

Sem física, isso seria simples, basta apontar para a direção e seguir em frente. Mas como lidar com o momento existente e depois parar no local? Não quero modificar o posicionamento do navio diretamente.

editar: Só para deixar claro, a matemática relacionada à física do navio em si não é o problema.

Petteri Hietavirta
fonte
Espero encontrar um problema semelhante a esse em breve; Estou ansioso para ver respostas para isso.
Bill

Respostas:

15

Veja os comportamentos de direção . Especialmente procurar e chegar podem ser interessantes para suas necessidades. Esses comportamentos também funcionarão quando algumas outras influências, como uma explosão, mudarem temporariamente a posição dos navios.

bummzack
fonte
+1. Para um jogo espacial 2D, eu recomendaria usar comportamentos de direção como sua estrutura e usar uma das minhas respostas como um componente nessa estrutura.
tenpn
Iria sugerir o mesmo pensamento quando li a pergunta. Eu usei muito o comportamento da direção, é fácil e permite alguns movimentos / IA bastante agradáveis.
dotminic
5

Não é um problema fácil acertar exatamente. Você tem duas opções, embora as especificidades de cada solução variem:

Uma solução matemática. Se o seu sistema de física é simples o suficiente, você pode criar o formulário fechado para o seu movimento e calcular quando precisa começar a aplicar uma força de frenagem para parar em um ponto. Se sua força de frenagem for constante e você não tiver resistência ao ar, isso deve se decompor em um quadrático.

Uma solução empírica. Você pode usar um controlador PID ajustado à mão ou realmente registrar as distâncias de frenagem do seu navio em seu sistema de física: em uma mesa de teste, freie o navio da velocidade máxima até a parada, registrando a distância percorrida e a velocidade a cada pequeno intervalo de tempo. Armazene o gráfico de distância / velocidade resultante em um diretório de dados.

Em tempo de execução, reconstrua o gráfico e conecte sua velocidade atual e a velocidade alvo para sair à distância. A essa distância do seu ponto de destino, você precisa estar com o freio completo.

A vantagem dessa abordagem é que você pode usá-la para frear exatamente a qualquer velocidade. A desvantagem é que, se seus freios tiverem que pisar ou pisar, você nunca estará exatamente na curva.

tenpn
fonte
1

Como dito anteriormente, essa situação é perfeita para os comportamentos de direção, mas eu gostaria de estender um pouco. O comportamento Chegar seria perfeito para esse cenário. Você também pode levar em consideração os obstáculos. Você também pode usar o comportamento de evitar obstáculos aqui.

Infelizmente, http://www.red3d.com/cwr/steer/ não fornece código fonte para os comportamentos. No entanto, a Programação de jogos AI por exemplo faz e explica os comportamentos em pedaços fáceis de entender. Se você não conseguir o livro, poderá sempre obter o código-fonte aqui: http://www.wordware.com/files/ai/

Além disso, se você deseja estender seu movimento para incluir a busca de caminhos, você pode ter uma classe de descobridores que calcula o caminho (talvez como uma coleção de vetores 2D) e use o comportamento de direção do Path Follow para adicionar isso também à mistura.

O código-fonte ao qual vinculei também fornece três métodos diferentes de combinar esses comportamentos de direção também.

Espero que ajude.

Ray Dey
fonte
O link red3d.com não fornece fontes diretamente , mas há um link nessa página para o OpenSteer ( opensteer.sourceforge.net ), que é uma implementação de código aberto dos comportamentos de direção.
21711 Bhmzack
Ahh não sabia disso, obrigado. No entanto, procurei a fonte do OpenSteer e achei mais fácil ver o código mais óbvio no seu código de rosto encontrado no livro de Buckland. Especialmente quando se inicia.
quer
1

Dirigir em direção a uma posição não é muito difícil, mas eu pessoalmente lutei por um tempo com o problema de dirigir em direção a uma posição e alcançá-la em uma velocidade específica, ou seguir um caminho com restrições de velocidade.

Eu resolvi o problema usando uma curva Hermite . Defina p0 e m0 na posição e velocidade da sua nave, p1 e m1 na posição e velocidade desejadas. Isso pressupõe que você deseja que o navio siga um segundo após o alvo. Calcule a segunda derivada de p (0), que lhe dará a aceleração para aplicar ao seu navio.

Aqui está o código para a segunda derivada (em F #, espero que você possa adaptá-lo à sua linguagem de escolha; sq () calcula o quadrado, aspas simples não interpretadas como aspas, mas como caracteres, elas fazem parte do identificador):

    let h'' t =
        let h00'' t = 12.0 * t - 6.0
        let h10'' t = 6.0 * t - 4.0
        let h01'' t = -12.0 * t + 6.0
        let h11'' t = 6.0 * t - 2.0

        let t = (t - t0) / diff_t

        (sq (1.0 / diff_t)) *
        ((h00'' t * p0) +
         (h10'' t * diff_t * v0) +
         (h01'' t * p1) +
         (h11'' t * diff_t * v1))

Observe que, se sua nave estiver sujeita a forças externas (por exemplo, gravidade de planetas), você terá que levar isso em consideração ao calcular o impulso da aceleração.

Joh
fonte
-3

Eu acho que sua nave deveria ter parâmetros como: posição e velocidade.

A velocidade está na soma de todas as forças de cada quadro (como gravidade, explosões, entrada do usuário etc.) e também pode ter algum tipo de umidade.

A posição é calculada a partir da última posição mais a velocidade * time_step.

No entanto, com isso, pode ser difícil implementar a parada no destino.

zacharmarz
fonte
3
-1 Parece que Petteri Hietavirta sabe como usar um sistema básico de física. Portanto, sua resposta a essa pergunta é que parar em um alvo é muito difícil?
AttackingHobo