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: /.
fonte
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.
fonte
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.
fonte