Como faço para que os agentes de IA se movam ao longo de uma curva?

12

Atualmente, minha estrutura básica de IA tem agentes que se movem ao longo de um caminho irregular formado por uma série de pontos.

caminho de navegação

Eles fazem isso simplesmente movendo sua posição de um ponto para o outro. Quando atingem o próximo ponto, avançam para o próximo e assim por diante. Como posso mudar isso para que eles se movam suavemente ao longo de uma versão curva do caminho, e como faço para gerar a curva?

SirYakalot
fonte
como eles escolhem o próximo ponto?
FxIII
@FxIII, desculpe, eu não vi esse comentário antes - você quer dizer como eles escolheram um novo destino de pesquisa ou como eles escolheram o próximo ponto da pesquisa?
SirYakalot

Respostas:

4

Você está buscando algum tipo de suavização de caminho. Obviamente, como bummzack apontou, você também deseja garantir que qualquer suavização de caminho que você realize resulte em movimentos legais para seus agentes.

Este artigo da Gamasutra explica praticamente tudo o que você precisa saber, incluindo suavização de caminho, curvas legais e algoritmos realistas de curva suave.

Outra alternativa, que é um pouco mais simples, é usar o comportamento Procurar com um pequeno círculo / esfera delimitadora para verificar se o agente está no ou próximo do próximo ponto no caminho.

Ray Dey
fonte
7

Como você já conhece seus pontos de controle, basta atualizar seu código de interpolação para usar um algoritmo de curvatura (Hermite ou Cosine, por exemplo).

Esses sites oferecem uma ótima explicação e um exemplo de código que deve ajudar você a começar:

Métodos de interpolação de Paul Bourke

Sol :: Tutoriais - Truques de interpolação

Doug.McFarlane
fonte
Bem, e se a curva gerada de repente atingir um obstáculo?
bummzack
Isso é apenas para o movimento dos agentes, por quadro. O mesmo método de detecção de colisão ainda se aplicaria. Quando uma colisão é detectada, altere os pontos de controle para evitar o objeto (difícil) ou comece temporariamente a usar outro algo de movimento.
Doug.McFarlane
@bummzack esse é um bom ponto, e a resposta é usar uma malha de navegação e suavizar suas curvas de acordo. No entanto, por enquanto, vou começar a trabalhar com um gráfico de navegação simples e resolverei isso apenas suavizando os caminhos um pouco.
SirYakalot
@bummzack: adicione alguns comportamentos de direção para evitar obstáculos no topo do algoritmo de geração de caminho curvo.
Imre
0

Eu vou contra a corrente aqui e sugiro que, em vez de pré-gerar suas curvas, apenas manipule-a quadro a quadro, usando (por exemplo) a mesma lógica que você usaria para criar uma homing míssil .

Isso será muito mais fácil e provavelmente mais realista, porque você não precisa de casos especiais para quando existem paredes entre dois pontos - você apenas lida com a detecção de colisões como de costume.

A desvantagem é que o movimento ficará abaixo do ideal. O objeto sempre seguirá o caminho mais direto de um waypoint para o próximo, o que significa que, diferentemente de um spline, ele não começará a girar para o waypoint 3 até que ele já tenha passado pelo waypoint 2. Dependendo da sua situação, isso pode ou não pode ser corrigido ajustando seus pontos de referência (se houver algum problema).

BlueRaja - Danny Pflughoeft
fonte
1
Este seria essencialmente um comportamento de busca que sugeri.
quer
0

O localizador de caminhos deve fornecer o caminho e você não deve modificá-lo. Acredito que seja possível modificar o algoritmo do localizador de caminhos para levar em conta que os caminhos com curvas acentuadas são irregulares do que aqueles com curvas suaves, como já ocorre com caminhos longos versus curtos.

Vou postar aqui alguma solução, se puder encontrar um momento para pensar profundamente, mas acho que esse é o caminho a seguir.

FxIII
fonte