Physics Jolt
Uma biblioteca de física corporal e de detecção de colisão amigável e amigável. Adequado para jogos e aplicativos VR. Usado por Horizon proibido oeste.
|
|---|
| Um vídeo do YouTube mostrando uma pilha de ragdoll simulada com física do Jolt. |
Para mais demos e vídeos, acesse a seção de amostras.
Considerações de design
Por que criar mais um mecanismo de física? Em primeiro lugar, tem sido um projeto de aprendizado pessoal. Em segundo lugar, eu queria abordar alguns problemas que tive com os mecanismos de física existentes:
- Os jogos fazem mais do que simular a física. Essas coisas acontecem em vários tópicos. Enfatizamos em acessar simultaneamente os dados da física fora da atualização principal da simulação:
- As seções da simulação podem ser carregadas / descarregadas em segundo plano. Preparamos um lote de órgãos de física em um encadeamento de fundo sem travar ou afetar a simulação. Inserimos o lote na simulação com um impacto mínimo no desempenho.
- As consultas de colisão podem funcionar paralelas à adição / remoção ou atualização de um corpo. Se uma mudança para um corpo aconteceu no mesmo fio, a alteração será imediatamente visível. Se a alteração aconteceu em outro tópico, a consulta verá um estado consistente antes ou depois. Uma alternativa seria ter uma versão de leitura e gravação do mundo. Isso impede que as mudanças sejam visíveis imediatamente, por isso evitamos isso.
- As consultas de colisão podem ser executadas paralelas à principal simulação de física. Fazemos uma verificação grossa (consulta de fase larga) antes da etapa de simulação e fazemos verificações finas (consulta de fase estreita) em segundo plano. Dessa forma, processos de longa execução (como geração de malha de navegação) podem ser espalhados por vários quadros.
- O despertar acidental dos corpos causa problemas de desempenho ao carregar / descarregar conteúdo. Portanto, os corpos não acordarão automaticamente quando criados. Os corpos vizinhos não serão acordados quando os corpos forem removidos. Isso pode ser acionado manualmente, se desejar.
- A simulação é executada de maneira determinística. Você pode replicar uma simulação a um cliente remoto apenas replicando as entradas na simulação. Leia a seção de simulação determinística para entender os limites.
- Tentamos simular o comportamento de corpos rígidos no mundo real, mas fazemos aproximações. Portanto, esta biblioteca deve ser usada principalmente para jogos ou simulações de VR.
Características
- Simulação de corpos rígidos de várias formas usando detecção contínua de colisão:
- Esfera
- Caixa
- Cápsula
- Cápsula cônica
- Cilindro
- Cilindro cônico
- Casco convexo
- Avião
- Composto
- Malha (triângulo)
- Terreno (campo de altura)
- Simulação de restrições entre corpos:
- Fixo
- Apontar
- Distância (incluindo molas)
- Dobradiça
- Slider (também chamado prismático)
- Cone
- Rack e pinhão
- Engrenagem
- Polia
- Caminhos de spline lisos
- Swing Twist (para ombros humanóides)
- 6 dof
- Motores para dirigir as restrições.
- Detecção de colisão:
- Raios de fundição.
- Formas de teste vs formas.
- Lançar uma forma versus outra forma.
- Broadphase apenas testa para determinar rapidamente quais objetos podem se cruzar.
- Sensores (volumes de gatilho).
- Ragdolls animados:
- Declaração dura (apenas corpos cinemáticos apenas rígidos).
- Keying suave (velocidades de configuração em corpos rígidos dinâmicos).
- Dirigindo motores de restrição para uma pose animada.
- Mapeando um esqueleto de altos detalhes (animação) em um esqueleto de detalhes baixos (ragdoll) e vice -versa.
- Simulação de personagem de jogo (cápsula)
- Caráter corporal rígido. Move -se durante a simulação de física. Opção mais barata e resposta mais precisa da colisão entre caráter e corpos dinâmicos.
- Caráter virtual. Não possui um corpo rígido na simulação, mas simula um usando verificações de colisão. Atualizado fora da atualização da física para obter mais controle. Interação menos precisa com corpos dinâmicos.
- Veículos
- Veículos com rodas.
- Veículos rastreados.
- Motocicletas.
- Simulação de corpo macio (por exemplo, uma bola macia ou um pedaço de pano).
- Restrições de borda.
- Restrições de curvatura diédrica.
- Restrições de volume de tetraedro.
- Restrições de fixação de longo alcance (também chamadas de tethers).
- Limitando a simulação para permanecer dentro de um certo alcance de um vértice esfolado.
- Pressão interna.
- Colisão com corpos rígidos simulados.
- Testes de colisão contra corpos macios.
- Cálculos de flutuação de água.
- Um modo opcional de precisão dupla opcional que permite grandes mundos.
Plataformas suportadas
- Windows (Desktop ou UWP) x86/x64/ARM32/ARM64
- Linux (testado no Ubuntu) x64/ARM64
- FreeBSD
- Android X86/X64/ARM32/ARM64
- Plataforma azul (um console de jogo popular) x64
- MacOS X64/ARM64
- iOS X64/ARM64
- MSYS2 MINGW64
- WebAssembly, veja este projeto separado.
Recursos necessários da CPU
- Em x86/x64, os requisitos mínimos são SSE2. A biblioteca pode ser compilada usando SSE4.1, SSE4.2, AVX, AVX2 ou AVX512.
- No ARM64, a biblioteca usa neon e fp16. No ARM32, ele pode ser compilado sem instruções especiais da CPU.
Documentação
Para saber mais sobre o Jolt, acesse a mais recente documentação de arquitetura e API. A documentação para uma versão específica também está disponível.
Para começar, olhe para o exemplo do Helloworld. Um exemplo de helloworld usando o CMake FetchContent também está disponível para mostrar como você pode integrar a física do JOLT em um projeto CMake.
Alguns algoritmos usados pelo JOLT são descritos em detalhes na minha palestra do GDC 2022: arquitetagem física do Jolt para 'Horizon proibido oeste' (slides, slides com notas de alto -falante, vídeo).
Compilação
- Compila com o Visual Studio 2019+, Clang 10+ ou GCC 9+.
- Usa C ++ 17.
- Depende apenas da biblioteca de modelos padrão.
- Não usa RTTI.
- Não usa exceções.
Se você deseja executar na plataforma Blue, precisará fornecer seu próprio ambiente de construção e plataforma Blue.h devido aos requisitos da NDA. Este arquivo está disponível no fórum da plataforma Blue Developer.
Para instruções de construção, vá para a seção de construção. Ao atualizar a partir de uma versão mais antiga da biblioteca, acesse as seções Notas de lançamento ou alterações da API.
Desempenho
Se você estiver interessado em como o JOLT escala com várias CPUs e se compara a outros mecanismos de física, dê uma olhada neste documento.
Estrutura de pastas
- Ativos - Esta pasta contém ativos usados pelo TestFramework, Amostras e JoltViewer.
- Build - contém tudo o que é necessário para construir a biblioteca, consulte a seção de construção.
- Docs - contém documentação para a biblioteca.
- Helloworld - Um aplicativo simples demonstrando como usar a Biblioteca de Física do Jolt.
- JOLT - Todo o código -fonte da biblioteca está nesta pasta.
- JoltViewer - É possível gravar a saída do mecanismo de física usando a classe DebuRenderErCorder (um arquivo .jor), esta pasta contém o código -fonte para um aplicativo que pode visualizar uma gravação. Isso é útil para, por exemplo, visualizar a saída do desempenho do desempenho de diferentes plataformas. Atualmente disponível apenas no Windows.
- PerformAncEtest - contém um aplicativo simples que executa um teste de desempenho e coleta informações de tempo.
- Amostras - contém o aplicativo de amostra, consulte a seção de amostras. Atualmente disponível apenas no Windows.
- TestFramework - Uma estrutura de renderização para visualizar os resultados do mecanismo de física. Usado por amostras e JoltViewer. Atualmente disponível apenas no Windows.
- Unittests - Um conjunto de testes de unidade para validar o comportamento do mecanismo de física.
- Webincludes - vários recursos JavaScript usados pela estrutura de perfil interno do mecanismo de física.
Ligações para outros idiomas
- C aqui e aqui
- C#
- Java
- JavaScript
- Zig
Integrações em outros motores
Veja uma lista de projetos que usam o Jolt Physics aqui.
Licença
O projeto é distribuído sob a licença do MIT.
Contribuições
Todas as contribuições são bem -vindas! Se você pretende fazer alterações maiores, discuta primeiro na seção de discussão do GitHub. Para mudanças não triviais, exigimos que você concorde com um contrato de contribuinte. Quando você cria um PR, o CLA Assistant solicita que você o assine.