Como você segue o caminho da IA ​​em um mecanismo de física 2d como o farseer / box2d?

12

Estou no processo de mudar um jogo 2D de cima para baixo em que estive trabalhando em um mecanismo de física de corpo rígido adequado como Farseer. Até agora, eu tinha acabado de hackear meu próprio código de física, quando necessário.

Estou tentando aprender a maneira correta de fazer as coisas aqui.

Qual é a maneira correta de fazer sua IA seguir um caminho definido depois de torná-los corpos rígidos dentro do mecanismo de física?

Se eu tiver um caminho de nós de navegação no meu mapa que eu preciso seguir a IA, anteriormente eu os moveria manualmente pelo caminho calculando a próxima posição em que eles deveriam estar na próxima etapa e configurando-os manualmente para essa posição .

Mas agora eles são corpos rígidos e sujeitos a colisões e quaisquer forças que possam atingi-los e derrubá-los.

Então, para fazer a IA se mover, acredito que agora devo aplicar impulsos / forças a elas? Não devo mais definir manualmente sua posição em cada quadro.

Então, eu acho que preciso ir de um mundo determinístico, onde forço a IA a seguir estritamente um caminho para um mundo não determinístico, onde eles podem ser empurrados em qualquer direção, se atingidos, e simplesmente os deslizo para o próximo nó no caminho. para fazê-los se mover.

Isso está certo? É assim que outras pessoas fazem isso?

Isso levanta algumas questões sobre como evitar que sua IA fique presa nos cantos do cenário, agora que eles não estão seguindo um caminho preciso, como vocês lidam com esse tipo de coisa?

Ou é melhor, de alguma forma, misturar os dois e ainda assim sua IA seguir um caminho fixo, definindo sua posição manualmente e reagir apenas a outras forças sob certas circunstâncias que você pode controlar facilmente?

Obrigado por qualquer conselho pessoal.

TerryB
fonte
1
+1 Eu também estou bastante interessado em aprender sobre isso.
David Gouveia

Respostas:

7

Os comportamentos de direção funcionam muito bem em combinação com um mecanismo de física, pois geralmente são implementados de maneira a retornar uma "força de direção" que pode ser aplicada ao seu corpo físico.

Para fazer uma unidade seguir um caminho, você pode usar o Seek para ir de um nó a outro (certifique-se de evitar superação) e, em seguida, use Chegada no último nó no seu caminho.

Quanto às suas preocupações em ficar presas: a modelagem das forças que seguem o caminho deve ser realmente precisa. Você está certo de que um objeto pode ser jogado para fora do caminho se colidir com outro objeto, mas, como você calculará uma força direcional a cada atualização, o objeto deverá estar no caminho novamente em pouco tempo. Se o desvio do caminho após uma colisão puder ser enorme, sugiro que você se lembre da sua última posição sempre que ocorrer uma colisão e, em seguida, direcione o objeto de volta para a última posição antes de continuar a rota normal.

bummzack
fonte
Artigo incrível, obrigado por compartilhar. Salvou o meu dia.
Ricardo Sanchez-Saez
0

Eu diria que você está no caminho certo, talvez você queira ler este artigo:

http://www.policyalmanac.org/games/aStarTutorial.htm

Ele explica algumas soluções básicas para evitar colisões e localização de caminhos usando o algoritmo A *.

Editar:

Se você realmente precisa apenas de qual é a melhor maneira de impulsionar seus objetos na direção certa, use uma força (digamos, MovementForce ou algo assim) apontando na direção do melhor caminho encontrado usando o algoritmo de localização de caminho de seu escolha

anonimamente
fonte
Não acho que esse artigo seja relevante para essa questão. O OP não está perguntando como encontrar o caminho ideal entre dois locais, mas como fazer um ator seguir um caminho que ele já calculou, dentro do contexto de uma simulação de física.
David Gouveia
bem quando eu lê-lo novamente eu vejo o seu ponto, Ill editar a minha resposta
annonymously
:) Também mudei o título para esclarecer as coisas. Definitivamente interessado em seguir o caminho em vez de encontrar o caminho.
TerryB
0

A julgar pelo que @davidluzgouveia comentou no post de forma anônima, vou abrir meu projeto. O caminho a seguir e a localização de caminhos são muito diferentes. A localização de caminhos é mais sobre o que foi publicado anonimamente, e para encontrar informações sobre o algoritmo de Dijkstra. Para o caminho a seguir, eu uso inteiramente meu mecanismo de física de escolha. A maneira como eu o configurei é que cada local em que uma classe de unidade caminha, é configurado na subclasse de processamento através de deslocamentos 2D, sim, eles são 2D e não 3D, é por causa da maneira que eu tenho minha física configurada no meu jogo .

Explicação 3D: Cada unidade possui apenas um colisor principal configurado exclusivamente para colisão com os objetos do terreno e do mundo. É uma forma de cápsula e tem um raio e altura programaticamente falando. Ele é construído no centro do modelo e deve se estender logo após a frente e a parte superior do modelo. Mas eu também tenho um deslocamento de superfície para a distância que está do chão o tempo todo, e uma quantidade de quanto é permitido deslizar para baixo antes de saltar um pouco de cada vez. Parece que estou aplicando algum tipo de reparo estragado para um problema de colisão de terreno, mas tenho minhas razões.

De qualquer forma, você deve aplicar força nesse objeto da cápsula e ele deve permanecer pairando acima do solo o tempo todo. Isso não quer dizer que não possa ir mais alto, apenas que não pode ir mais baixo. A razão pela qual ele precisa pairar (no meu caso) é porque, em um corpo rígido e em um mecanismo de física de boneca de pano, as pernas das minhas unidades são animadas proceduralmente. Então, aplicando uma força simples à cápsula, as pernas da minha entidade se reposicionarão por conta própria. Eles também terão suas aplicações de gravidade separadas! O que isso faz é permitir que, se meu personagem estiver inclinado, um pé possa estar em uma altitude mais baixa que o outro.

É exatamente assim que você deve fazê-lo. A julgar pelo que você está perguntando, é isso. Se você deseja deixar de fora alguns recursos, tudo bem, obviamente, especialmente se for um RTS ou FPS e ninguém nunca verá unidades ou se importará. Mas, em geral, a unidade deve ter um objeto de colisão PRINCIPAL que funciona quase exclusivamente com o movimento do personagem.

Especificamente em 2D: Você ainda deve ter um ponto principal, ou apenas algum tipo de referência, para o mecanismo contornar o movimento de uma unidade. Você poderia atribuir a cada unidade uma subclasse de caminho que possui alguns locais necessários, especificá-lo no código de nível (por exemplo, local1 (x, y) local2 (x, y) etc.) da melhor maneira (eu não provavelmente não sabe em que tipo de jogo você está trabalhando) provavelmente seria especificar locais no nível e fazer com que cada unidade os processe na ordem especificada pelo nível e, após atingir cada local, substitua o local desejado por o próximo que ele precisa chegar.

Existem várias maneiras de modificar isso, como ter uma lista de locais em primeiro lugar para cada unidade, pois isso significa que nem todas as unidades precisam ir para os mesmos locais. No entanto, da mesma forma, você também pode fazer isso no código de nível (unit1.location1 (x, y) unit1.location2 (x, y) grunt.l1 (x, y) knight.loc3 (x, y) tanto faz)

Apenas algumas idéias! Eu sugiro que você leia a versão 3D, mesmo que seja muito menos relevante.

Edição: Eu decidi apenas fornecer ambos para quem pode ler isso (Sim, isso é verdade) .... (Eu originalmente apenas passei a sua pergunta e não percebi que era bastante específica em 2D até que eu a relesse>.>)

Joshua Hedges
fonte