Integrei com sucesso a biblioteca Bullet Physics no meu sistema de entidade / componente. As entidades podem colidir umas com as outras. Agora eu preciso permitir que eles colidam com o terreno, que é finito e parecido com um cubo (pense no InfiniMiner ou no clone Minecraft ). Eu só comecei a usar a biblioteca Bullet Physics ontem, então talvez esteja perdendo algo óbvio.
Até agora, estendi a RigidBody
classe para substituir a checkCollisionWith(CollisionObject co)
função. No momento, é apenas uma simples verificação da origem, sem usar a outra forma. Vou repetir isso mais tarde. Por enquanto, fica assim:
@Override
public boolean checkCollideWith(CollisionObject co) {
Transform t = new Transform();
co.getWorldTransform(t);
if(COLONY.SolidAtPoint(t.origin.x, t.origin.y,t.origin.z)){
return true;
}
return false;
}
Isso funciona muito bem, tanto quanto detecta quando ocorrem colisões. No entanto, isso não lida com a resposta de colisão. Parece que a resposta de colisão padrão é mover os objetos em colisão para fora das formas uns dos outros, possivelmente seus AABBs.
No momento, a forma do terreno é apenas uma caixa do tamanho do mundo. Isso significa que as entidades que colidem com o terreno simplesmente disparam para fora dessa caixa de tamanho mundial. Portanto, fica claro que eu preciso modificar a resposta à colisão ou criar uma forma que se adapte diretamente à forma do terreno. Então, qual é a melhor opção e como implementá-la? Talvez haja uma opção em que não estou pensando?
Note-se que o terreno é dinâmico e frequentemente modificado pelo jogador.
fonte
Eu estava tendo alguns problemas com a estratégia implementada em minha outra resposta. Às vezes, os pontos de contato permaneciam, era meio hacky fazer outras formas que não cubos e, às vezes, permitir que objetos deslizassem pelo terreno.
Portanto, em vez de modificar ou substituir qualquer uma das classes Bullet, existe uma opção alternativa de usar um objeto de colisão incorporado no Bullet que representará o terreno. O
BvhTriangleMeshShape
( doc ) é uma forma construída que é representada por uma malha triangular.Essa malha pode ser gerada ao mesmo tempo que a malha para visualizar o mundo. Isso significa que o objeto de física pode corresponder exatamente ao objeto renderizado.
Eu crio um
RigidBody
para cada pedaço do meu terreno. Esse corpo tem sua forma definida como aBvhTriangleMeshShape
. Quando o terreno é modificado, ao mesmo tempo em que estou reconstruindo a representação visual do pedaço, também estou reconstruindo a forma física. Então, quando chega a hora de amortecer a forma visual, também troco as formas físicas da seguinte forma:Isso garante que o corpo seja removido adequadamente, limpando os pontos de contato. Então, sua forma é alterada e é adicionada novamente.
Para gerar
BvhTriangleMeshShape
cada pedaço, é necessário manter umTriangleIndexVertexArray
( doc ). Este é essencialmente dois buffers de bytes. Um com as posições dos vértices do triângulo e o outro com os índices para a construção desses triângulos. Essa matriz de vértices deve ser mantida, poisBvhTriangleMeshShape
não faz uma cópia dos dados.Usar todas as aulas de física incorporadas do Bullet é provavelmente mais rápido do que qualquer coisa que eu pudesse escrever e, de fato, é muito rápido. Não vejo lentidão depois de implementar essa nova estratégia.
fonte
Não estou familiarizado com Bullet Physics, mas usei ODE. Lá, após o teste de colisão sim ou não, há um teste de colisão de forma e detalhe mais detalhado que gera um conjunto de pontos de contato.
No seu caso, seu mundo é uma coleção de caixas, então você pode fazer isso:
Isso não está redefinindo a resposta à colisão ; esta é uma camada antes disso. A resposta à colisão é determinada totalmente pelos pontos de contato calculados a partir da colisão.
Como eu disse, não estou familiarizado com a Bullet Physics, então não sei se a arquitetura é passível disso.
fonte