Prevenção de colisões 3D: localizando o vetor de velocidade atualizado (fora dos cones "velocidades de colisão")

8

Estou tentando entender e implementar o mecanismo de um sistema totalmente anti-colisão 3D (comportamento da direção) para o movimento de vôo (seis graus de liberdade), atualmente focado em contornar obstáculos estáticos (todos com a forma de uma esfera).

No entanto, não entendo muito bem como descobrir o novo vetor de velocidade do agente em movimento. A figura abaixo ilustra a cena. O agente móvel (verde) precisa direcionar três objetos estáticos (azul). A linha vermelha representa o vetor inicial de velocidade à frente.

insira a descrição da imagem aqui

Observe que também existem três cones brancos / semitransparentes. Estes representam os "vetores de velocidade proibidos" em relação a cada obstáculo. Isso significa que o conjunto de vetores de velocidade que, se usados ​​como os novos vetores à frente do agente, faria o agente colidir com um ou mais obstáculos (observe também que o raio de cada cone é igual ao raio do obstáculo fornecido) mais o raio do agente, para permitir um deslocamento para o jogador manobrar).

Para descobrir o novo vetor adiante do agente móvel em tal ambiente 3D, considerando os três obstáculos, uma abordagem ingênua seria simplesmente portar para o 3D a solução clássica explicada neste artigo frequentemente citado e exemplificada pela seguinte imagem 2D:

insira a descrição da imagem aqui

Lá, uma nova velocidade (seta laranja) é simplesmente calculada normalizando a distância mínima (seta preta) entre a velocidade original e o centro do obstáculo e depois multiplicando essa normal pela soma entre o raio do obstáculo e o raio do obstáculo. agente de mudança. Então, uma média das novas velocidades calculadas para cada um dos obstáculos daria a velocidade final total.

Em muitos casos, isso é suficiente. No entanto, dê uma olhada nos casos abaixo (exemplificado em 2D para facilitar a visualização):

insira a descrição da imagem aqui

Em todos eles, a abordagem ingênua resultará em uma colisão. Em aeb, a nova velocidade final coincidirá com a velocidade original (seta vermelha) e o agente móvel avançará, apesar de estar parcial ou totalmente bloqueado. Em c) ed), a nova velocidade (seta laranja) ainda resultará na mesma consequência.

Então, minha pergunta é: qual é a maneira mais computacionalmente eficiente de descobrir o novo vetor à frente do agente em movimento em um ambiente 3D, considerando os três obstáculos, de maneira a evitar colisões? Ou, em outras palavras, o novo vetor à frente que:

1) não está dentro de nenhum dos cones;

2) é o mais próximo possível do vetor à frente original (linha vermelha na figura).

PS: De preferência, não estou procurando uma biblioteca, estou procurando aprender como fazer isso.

Louis15
fonte

Respostas:

1

Eu não acho que exista uma maneira eficiente de resolver o problema exatamente, mas eis como eu tentaria resolver o problema.

Primeiro, eu usaria volumes delimitadores em torno de cada objeto, em vez dos próprios objetos. Cada objeto pode ser aproximado pela união de mais de um volume delimitador.

A solução mais simples seria calcular um único volume delimitador que contenha todos os objetos necessários para evitar e calcular o cone desse volume.

Isso pode não ser bom o suficiente se os objetos não estiverem relativamente próximos um do outro. Você pode querer fazer alguns agrupamentos de forma que dois objetos pertençam ao mesmo cluster, se isso não for possível, ou pelo menos não trivial passar entre eles. Calcule o cluster de objetos considerando seus volumes delimitadores, além do tamanho do volume delimitador do jogador, além de uma margem extra. Você pode usar algo como isto:

http://lab.polygonal.de/?p=120

Depois de ter os aglomerados, encontre o mais próximo e calcule o cone para evitar colidir com ele. Por causa da maneira como os clusters foram criados, se você direcionar apenas o suficiente para evitar atingir um cluster, não atingirá outro.

Além disso, você pode criar uma estrutura recursiva ao calcular os clusters, o que o ajudará a encontrar o cluster mais próximo.

Existem algumas coisas com as quais você pode brincar. Por exemplo, em vez de escolher o cluster mais próximo, escolha os dois grupos mais próximos e calcule um único cone que evite os dois. Além disso, você pode tentar outros volumes delimitadores que não sejam esferas.

Gato
fonte
0

Existem duas maneiras de abordar esta questão que eu posso ver. Primeiro, se você simplesmente deseja encontrar uma maneira de orientar, basta implementar o pathfinding ( acho isso bastante útil ). Isso seria o fim disso (e é a resposta prática correta para essa pergunta), mas acho que você está mais curioso sobre uma solução matemática para o seu problema.

Para resolver isso, vejamos um problema equivalente. Pegue uma fatia 2D da sua cena "à frente" do piloto de um avião que seja normal ao vetor original. O que você obterá é um ponto que representa seu vetor original e uma série de elipses que são as projeções 2D dos seus cones de oclusão. Agora, o que você quer fazer é encontrar o ponto mais próximo ao seu ponto original (vamos chamá-lo P) que fica no exterior de elipses não sobrepostas. Acontece que este é um problema bastante difícil de resolver. Existem 3 etapas:

  • Descobrir os pontos de interseção de todas as suas elipses
  • Encontre todos os orifícios na união de todas as suas elipses
  • Descobrir o ponto mais próximo de Ptodas as suas elipses fora da união (que pode estar dentro de um buraco)

Tudo bem, tudo isso requer multiplicadores Lagrange e verificação de ângulo e algumas outras coisas realmente complicadas para resolver. Vejamos outras opções. Se transformarmos nosso problema em espaço angular, veremos que o que realmente queremos é encontrar a distância mínima entre um ponto e vários círculos projetados na superfície de uma esfera. Na geometria diferencial, isso geralmente é chamado de 2 esferas e é útil aqui. Então, primeiro, precisamos encontrar a distância entre dois pontos na superfície da esfera, que usaremos a métrica de 2 esferas para encontrar. Felizmente, é bem fácil: ds^2 = (R^2)*(dth^2) + (R^2)*(sin(th)^2)*(dph^2)onde mantemos Rconstantes como o raio da nossa 2-esfera projetada no espaço 3. Vindo da física, considero tho ângulo do positivo ze pho ângulo do positivo xcomssendo a distância.

O que isso faz? Ele nos permite remover o uso de multiplicadores de Lagrange para minimizar a distância e nos permite trabalhar em coordenadas "nativas" (já que definimos nossos cones em termos de um ângulo de oclusão). Então agora precisamos encontrar o raio de nossas projeções de cone. Vamos pegar um cone por enquanto e chamar o ângulo que o define a. O raio da projeção é então simplesmente R*a. Isso foi fácil - que outra quantidade precisamos saber sobre os cones? Precisamos conhecer o centro da projeção, que é definido pelo vetor de aparência do ator. Primeiro, convertemos x, ye zem coordenadas esféricas, onde sabemos que estamos à distância R, e resolvemos the ph, o que podemos fazer simplesmente conectando nossas fórmulas de conversão:th = acos(z/R)e ph = atan2(y/x)(use atan2aqui para explicar as ambigências de quadrante do arco-tangente). O processo é o mesmo para encontrar a posição do seu vetor original em coordenadas esféricas.

Portanto, o problema foi simplificado. No entanto, o problema ainda é bastante difícil de resolver, mas agora você só precisa se preocupar com círculos e pontos, em vez de elipses e pontos ou ângulos e vetores. O restante do processo é bastante processual. Você precisa essencialmente encontrar uma área delimitadora formada por seus círculos, para a qual existem várias soluções. Vou apresentar um método que pode não ser o melhor, mas funcionará.

Primeiro, eu compararia a soma dos raios de todos os pares de círculos e a distância entre os centros; depois, se eles somarem maiores que a distância do centro, os definiriam iguais e resolveriam thephpara encontrar os cruzamentos. Você sabe que cada par de interseções descreve "ângulos proibidos" para o círculo em questão, que você armazenaria como uma matriz de ângulos de ponto de interseção (a partir do centro do círculo) para cada círculo que cruza esse - é importante que você precise " mesclar "todos os intervalos que se sobrepõem à medida que você os adiciona à matriz para que a próxima parte funcione corretamente. Em seguida, você encontra o ponto mais próximo na borda do círculo ao ponto original (que é tão simples quanto desenhar uma linha através do ponto central do círculo e do ponto original e, em seguida, encontrar o local na linha no raio do círculo longe do centro). Em seguida, passe pela matriz armazenada e teste se esse ângulo está no intervalo de cada ângulo proibido. Nesse caso, selecione a aresta mais próxima. Esse é o ponto mais próximo do exterior descrito dentro deste círculo. Repita o processo para todos os círculos (alguma otimização pode ser feita no processo de seleção - você realmente não precisa calcular isso para cada círculo). Agora compare todas as distâncias mais curtas, encontre a menor e essa é a sua resposta, descrita nos ângulosthe ph. Lembre-se de que a distância é descrita com a métrica de 2 esferas ao executar esse cálculo. Como você não se importa com a esfera em que tudo isso está ligado, apenas com os ângulos, é possível definir R=1e fazer esses cálculos na esfera unitária.

Esta é a maneira mais simples de pensar em fazer isso. Não sei se é a maneira mais simples, mas funcionaria muito bem. Praticamente para um jogo, no entanto, você apenas deseja implementar o pathfinding.

dannuic
fonte