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.
physics
ai
path-finding
movement
Petteri Hietavirta
fonte
fonte
Respostas:
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.
fonte
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.
fonte
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.
fonte
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):
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.
fonte
Descobri isso recentemente - comportamentos de direção em JavaScript e processamento:
http://shawnldoria.com/works/steering-behaviors.html
fonte
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.
fonte