Tremulação durante colisões de paredes com Bullet Physics: tolerância de contato / penetração?

7

Eu uso o mecanismo de física de balas através do Panda3d.

Minha cena ainda é muito simples, pense em 'Wolfenstein3d': com base em azulejos, as paredes são cubos sólidos.

Espero que as paredes bloqueiem o jogador e que ele deslize pelas paredes em caso de incidência não normal.

O que recebo é o que espero, com uma diferença: há algum nervosismo. Se eu tentar me forçar contra a parede, vejo os quadros piscando rapidamente entre duas posições. Eles diferem em cerca de 0,04 unidades de distância, o que corresponde a 4 cm no meu jogo.

Notei 4 cm em outro lugar: o fundo da cápsula do meu jogador fica 4 cm abaixo do solo, quando em repouso.

Isso significa que existe em algum lugar no mecanismo Bullet uma tolerância padrão de 0,04 unidades de comprimento para diferenciar o contato da colisão? Se sim, o que devo fazer? Devo mudar a escala do meu jogo para que essas unidades de 0,04 correspondam a 0,4 cm, tornando o tremor dez vezes menor? Ou posso pedir para o marcador alterar sua tolerância para um valor menor?

Editar

Este é o jitter que recebo: 6.155 - 6.118 = 0.036

LPoint3f(0, 6.11694, 0.835)
LPoint3f(0, 6.15499, 0.835)
LPoint3f(0, 6.11802, 0.835)
LPoint3f(0, 6.15545, 0.835)
LPoint3f(0, 6.11817, 0.835)
LPoint3f(0, 6.15726, 0.835)
LPoint3f(0, 6.11876, 0.835)
LPoint3f(0, 6.15911, 0.835)
LPoint3f(0, 6.11937, 0.835)

Eu encontrei um método setMargin. Ajustei para 5 mm no BoxShape para as paredes e na forma de cápsula para o player. Ele ainda oscila cerca de 35 mm, conforme ilustrado por este log (11.117 - 11.082 = 0,035):

LPoint3f(0, 11.0821, 0.905)
LPoint3f(0, 11.1169, 0.905)
LPoint3f(0, 11.082, 0.905)
LPoint3f(0, 11.117, 0.905)
LPoint3f(0, 11.082, 0.905)
LPoint3f(0, 11.117, 0.905)
LPoint3f(0, 11.0821, 0.905)
LPoint3f(0, 11.1175, 0.905)
LPoint3f(0, 11.0822, 0.905)
LPoint3f(0, 11.1178, 0.905)
LPoint3f(0, 11.0823, 0.905)
LPoint3f(0, 11.1183, 0.905)

A margem da cápsula mudou minha penetração no chão, porém, sou um pouco maior (0,905 em vez de 0,835). No entanto, não mudou nada ao colidir com as paredes.

Como posso tornar as colisões contra as paredes menos agitadas?

Editar no dia seguinte:

Após mais investigação, parece que objetos dinâmicos se comportam bem. Meu problema vem do btKinematicCharacterController que eu uso para mover meu personagem; esse material está totalmente corrompido, de acordo com toda a Internet: /.

Niriel
fonte

Respostas:

4

Isso soa como instabilidade numérica devido à imprecisão do ponto flutuante. Você está usando os fatores de escala para sua cena / objetos de acordo com a recomendação do fornecedor?


Editar:

Lista de verificação geral para instabilidade do mecanismo de física

  • Verifique se você está usando os fatores de escala corretos
  • Certifique-se de que as quantidades sejam razoáveis ​​(por exemplo, 10m, 80kg, ...)
  • Ative a suspensão se este for um objeto sem forças internas (ou seja, não possui controlador / gerador de força)
  • Explore todas as configurações relacionadas à projeção de raios. Causa plausível para o seu problema
  • Relaxe a tolerância da profundidade de penetração para permitir alguma penetração . Provável causa para o seu problema


† Isso pode permitir que as câmeras "atravessem" as paredes e pode ser resolvido colocando um objeto fino e invisível na frente da parede ou expandindo o AABB para agir como um buffer.

awdz9nld
fonte
Se você está falando sobre a escala dos meus modelos 3D (e, portanto colisão caixas / formas), então eles são todos 1.
Niriel
E aproximadamente que tipo de tamanhos e distâncias estão em jogo?
awdz9nld
1 unidade corresponde a 1 metro.
Niriel 16/08
1

Parece que seu mecanismo tenta constantemente atualizar os parâmetros desse objeto. O objeto deve congelar de posição quando atingir um estado que Bullet tenha decidido ser "estável". Caso contrário, erros numéricos nunca resultarão em manuseio preciso de colisões, portanto, esse movimento instável (forças se acumulam eventualmente, objetos estão penetrando novamente, resultam em oscilações). Algumas idéias são mencionadas aqui . Eu começaria a investigar o " problema do sono ". Talvez alguém que tenha experiência prática com esse mecanismo possa fornecer uma maneira de definir o limiar de sono com eficiência no seu caso.

teodron
fonte
Após mais investigação, parece que objetos dinâmicos se comportam bem. Meu problema vem do btKinematicCharacterController que eu uso para mover meu personagem; esse material é totalmente bugado, de acordo com toda a Internet.
Niriel
Lamento ouvir sobre isso, não sou especialista em Bullet e não tive a chance de dar uma olhada nesse mecanismo. Uma observação é que seu personagem em movimento não pode entrar no "modo de suspensão" porque precisa constantemente obter atualizações de força que o deixariam escapar do modo de "congelamento / suspensão".
Teodron # 1/12
Definitivamente vou ter em mente essa noção de 'modo de suspensão' no futuro. Também devo verificar meus normais, talvez eu tenha polígonos de dupla face?
Niriel
0

Uma coisa que você pode querer procurar é uma opção de CCD. Em alguns mecanismos de física, você pode uma opção para ativar a "Detecção Contínua de Colisões".

É muito mais intensivo em recursos, mas, em vez de resolver a colisão como um Sim / Não, a cada etapa do processo, ele trabalha para encontrar o ponto real da colisão e impedi-lo por aí.

Não estou familiarizado com o mecanismo de bala, mas isso pode lhe dar algo para procurar. Curiosamente, é mais usado em coisas como balas para impedir a penetração na parede.

Sparkky
fonte
, ponto flutuante contínua ou não ainda vai elevar sua feia cabeça mais cedo ou mais tarde :)
awdz9nld