Encontrar a velocidade correta para a IA virar para alcançar a meta

10

Eu tenho um navio que viaja na velocidade máxima maxSpeede pode girar rotationSpeedgraus por segundo. O navio sempre se move na direção em que está voltado, o que significa que quanto mais rápido o navio estiver viajando, maior será o raio de viragem.

Conheço minha posição, rotação e posição do alvo.

O que eu gostaria de descobrir é se um alvo está dentro do meu raio de viragem a essa velocidade, ou melhor, qual é a velocidade máxima em que posso viajar para fazer a curva para o alvo sem circular continuamente ao redor dele.

Existe uma maneira (ish) eficiente de fazer isso?

Aqui está o que estou pensando até agora: porque sei até que ponto estou viajando por etapa e quanto estou girando por etapa, posso descobrir onde estarei nos próximos dois quadros. Minha posição atual é p1, minha próxima posição é p2 e depois p3. Eu posso pegar os bissetores perpendiculares de (p1, p2) e (p2, p3). Seu ponto de interseção me dará o centro de um círculo. Posso testar se o alvo está nesse círculo.

Não tenho certeza se isso funcionará em 3D (não sei como calcular uma esfera com minhas entradas). Essa solução também não ajuda muito em encontrar a velocidade certa na qual viajar, eu precisaria tentar algumas vezes com velocidades diferentes para encontrar uma velocidade razoável.

Alguém pode lançar alguma luz sobre uma solução melhor?

weichsem
fonte

Respostas:

17

Existem duas maneiras de uma unidade controlada por IA com uma velocidade de rotação limitada e uma velocidade de movimento ajustável atingir uma meta.

Primeiro, vamos considerar o desafio que nos é apresentado para que possamos entendê-lo melhor:

insira a descrição da imagem aqui

Se o jogador estiver se movendo e girando em velocidades constantes enquanto tenta alcançar um objetivo que está do lado direito ou esquerdo, ele se moverá em círculos para sempre, nunca enfrentando seu objetivo. As duas áreas que o jogador irá circular estão marcadas em vermelho acima.

A área circular marcada em vermelho pode ser calculada assim:

radius = movementSpeed / rotationSpeedInRadians;
circlesCenterX = unitX + cos(unitAngle + / - PI) * radius;
circlesCenterY = unitY + sin(unitAngle + / - PI) * radius;

Isso resulta na posição e no raio dos círculos vermelhos. Podemos usar isso para determinar se um determinado objetivo está fora do alcance da unidade controlada pela IA, se continuar a virar na direção do objetivo.

Para descobrir se um determinado item está dentro de um dos círculos, basta calcular a distância do centro dos círculos:

if ((circleX - goalX)^2 + (circleY - goalY)^2 < radius^2) //goal is within red circle

Existem duas soluções possíveis para isso:

1

Construa uma certa distância até que a meta esteja fora da área vermelha circular e, em seguida, dê meia-volta. Isso é simples, deixe a unidade continuar em movimento até que a verificação retorne que a meta não está dentro deste círculo. Então você pode se virar.

insira a descrição da imagem aqui

A outra opção exige um pouco mais de trabalho para calcular:

Traçamos uma linha imaginária entre a unidade de IA e a meta. Usando o ângulo entre eles:

angle = Math.atan2(goalY - unitY, goalX - unitX);

Agora você precisa fazer o seguinte para calcular a velocidade correta:

correctSpeed = rotationSpeedInRadians * (distance / 2) / cos(angle);

insira a descrição da imagem aqui

Para que ele funcione no caso 3d:

Encontre o plano no qual residem os três pontos a seguir:

  1. O ponto do objetivo.
  2. A posição da unidade AI no quadro anterior.
  3. A posição atual da unidade AI.

Você poderia usar esse avião para calcular a velocidade da 2ª maneira. Você só precisa converter os pontos dos valores 3d para os valores 2D incorporados no plano comum.

Você pode querer usar isto:

Como converter um ponto 3D em um plano para coordenadas UV?

AturSams
fonte
Perfeito! Exatamente a resposta que eu estava esperando! Obrigado pelas explicações detalhadas, acho que sou capaz de extrapolar isso e usá-lo em 3D.
weichsem
@weichsem Eu atualizei a resposta. A idéia que sugeri é encontrar uma planície 2D comum que eles compartilhem e usá-la para calcular a velocidade correta.
AturSams