Física de Jolt
Una biblioteca de detección de física y colisión rígida de múltiples núcleos. Adecuado para juegos y aplicaciones de realidad virtual. Utilizado por Horizon Prohibido West.
|
|---|
| Un video de YouTube que muestra una pila de rabio simulada con física de Jolt. |
Para más demostraciones y videos, vaya a la sección de muestras.
Consideraciones de diseño
¿Por qué crear otro motor de física? En primer lugar, ha sido un proyecto de aprendizaje personal. En segundo lugar, quería abordar algunos problemas que tuve con los motores de física existentes:
- Los juegos hacen más que simular física. Estas cosas suceden en múltiples hilos. Hacemos hincapié en acceder simultáneamente a los datos de física fuera de la actualización de simulación principal:
- Las secciones de la simulación se pueden cargar / descargar en segundo plano. Preparamos un lote de cuerpos de física en un hilo de fondo sin bloquear o afectar la simulación. Insertamos el lote en la simulación con un impacto mínimo en el rendimiento.
- Las consultas de colisión pueden ejecutarse paralelas a agregar / eliminar o actualizar un cuerpo. Si se produce un cambio en un cuerpo en el mismo hilo, el cambio será inmediatamente visible. Si el cambio ocurrió en otro hilo, la consulta verá un estado constante de antes o después. Una alternativa sería tener una versión de lectura y escritura del mundo. Esto evita que los cambios sean visibles de inmediato, por lo que evitamos esto.
- Las consultas de colisión pueden ejecutarse paralelas a la simulación principal de física. Hacemos una verificación gruesa (consulta de fase amplia) antes del paso de simulación y hacemos verificaciones finas (consulta de fase estrecha) en el fondo. De esta manera, los procesos de ejecución larga (como la generación de malla de navegación) se pueden extender en múltiples marcos.
- La atención accidental de los cuerpos causa problemas de rendimiento al cargar / descargar contenido. Por lo tanto, los cuerpos no se despertarán automáticamente cuando se creen. Los cuerpos vecinos no se despertarán cuando se eliminen los cuerpos. Esto se puede activar manualmente si lo desea.
- La simulación se ejecuta determinista. Puede replicar una simulación a un cliente remoto simplemente replicando las entradas a la simulación. Lea la sección de simulación determinista para comprender los límites.
- Tratamos de simular el comportamiento de los cuerpos rígidos en el mundo real pero hacemos aproximaciones. Por lo tanto, esta biblioteca debe usarse principalmente para juegos o simulaciones de realidad virtual.
Características
- Simulación de cuerpos rígidos de varias formas utilizando detección de colisiones continuas:
- Esfera
- Caja
- Cápsula
- Cónica cónica
- Cilindro
- Cilindro cónico
- Casco convexo
- Avión
- Compuesto
- Malla (triángulo)
- Terreno (campo de altura)
- Simulación de restricciones entre cuerpos:
- Fijado
- Punto
- Distancia (incluidos resortes)
- Bisagra
- Control deslizante (también llamado prismático)
- Cono
- Estantería y piñón
- Engranaje
- Polea
- Rutas de spline suaves
- Swing-gade (para hombros humanoides)
- 6 DOF
- Motores para impulsar las limitaciones.
- Detección de colisión:
- Rayos de fundición.
- Pruebas de formas frente a formas.
- Echando una forma frente a otra forma.
- La máxima fase solo prueba para determinar rápidamente qué objetos pueden cruzar.
- Sensores (volúmenes de activación).
- Rabio animado:
- Clave dura (cuerpos rígidos solo cinemáticos).
- Keying suave (velocidades de ajuste en cuerpos rígidos dinámicos).
- Conducir motores de restricción a una pose animada.
- Mapeo de un esqueleto de alto detalle (animación) en un esqueleto de bajo detalle (Ragdoll) y viceversa.
- Simulación de personajes del juego (cápsula)
- Carácter del cuerpo rígido. Se mueve durante la simulación de física. La opción más barata y la respuesta de colisión más precisa entre el carácter y los cuerpos dinámicos.
- Carácter virtual. No tiene un cuerpo rígido en la simulación, pero simula uno usando verificaciones de colisión. Actualizado fuera de la actualización de física para obtener más control. Interacción menos precisa con cuerpos dinámicos.
- Vehículos
- Vehículos con ruedas.
- Vehículos rastreados.
- Motocicletas.
- Simulación del cuerpo suave (por ejemplo, una bola suave o una pieza de tela).
- Restricciones de borde.
- Restricciones de curva diédrica.
- Restricciones de volumen de tetraedro.
- Restricciones de apego de largo alcance (también llamado Tethers).
- Limitar la simulación para permanecer dentro de un cierto rango de un vértice de piel.
- Presión interna.
- Colisión con cuerpos rígidos simulados.
- Pruebas de colisión contra cuerpos blandos.
- Cálculos de flotabilidad de agua.
- Un modo opcional de doble precisión que permite grandes mundos.
Plataformas compatibles
- Windows (Desktop o UWP) X86/X64/ARM32/ARM64
- Linux (probado en Ubuntu) x64/ARM64
- FreeBSD
- Android X86/X64/ARM32/ARM64
- Platform Blue (una consola de juegos popular) x64
- MacOS x64/ARM64
- iOS X64/ARM64
- Msys2 mingw64
- WebAssembly, vea este proyecto separado.
Características de CPU requeridas
- En x86/x64, los requisitos mínimos son SSE2. La biblioteca se puede compilar usando SSE4.1, SSE4.2, AVX, AVX2 o AVX512.
- En ARM64, la biblioteca usa neón y FP16. En ARM32 se puede compilar sin ninguna instrucción especial de CPU.
Documentación
Para obtener más información sobre Jolt, vaya a la última arquitectura y documentación de API. La documentación para una versión específica también está disponible.
Para comenzar, mira el ejemplo de Helloworld. Un ejemplo de Helloworld usando Cmake FetchContent también está disponible para mostrar cómo puede integrar la física de Jolt en un proyecto CMake.
Algunos algoritmos utilizados por Jolt se describen en detalle en mi charla GDC 2022: Arquitectura de física de Jolt para 'Horizon Prohibido West' (diapositivas, diapositivas con notas de altavoces, video).
Compilación
- Se compila con Visual Studio 2019+, Clang 10+ o GCC 9+.
- Usa C ++ 17.
- Depende solo de la biblioteca de plantilla estándar.
- No usa RTTI.
- No usa excepciones.
Si desea ejecutar la plataforma azul, deberá proporcionar su propio entorno de compilación y plataforma. H debido a los requisitos de NDA. Este archivo está disponible en el Foro de desarrolladores de plataforma Blue.
Para las instrucciones de construcción, vaya a la sección de compilación. Al actualizar desde una versión anterior de la biblioteca, vaya a las secciones de notas de la versión o cambia la API.
Actuación
Si está interesado en cómo Jolt se escala con múltiples CPU y se compara con otros motores de física, eche un vistazo a este documento.
Estructura de carpetas
- Activos: esta carpeta contiene activos utilizados por TestFramework, muestras y Joltviewer.
- Build: contiene todo lo necesario para construir la biblioteca, consulte la sección de compilación.
- Docs: contiene documentación para la biblioteca.
- Helloworld: una aplicación simple que demuestra cómo usar la biblioteca Jolt Physics.
- Jolt: todo el código fuente para la biblioteca está en esta carpeta.
- JOLTVIEWER: es posible registrar la salida del motor de física utilizando la clase DebugrendererRecorder (un archivo .jor), esta carpeta contiene el código fuente en una aplicación que puede visualizar una grabación. Esto es útil para visualizar la salida del rendimiento de rendimiento de diferentes plataformas. Actualmente disponible solo en Windows.
- PerformanceTest: contiene una aplicación simple que ejecuta una prueba de rendimiento y recopila información de tiempo.
- Muestras: esto contiene la aplicación de muestra, consulte la sección de muestras. Actualmente disponible solo en Windows.
- TestFramework: un marco de representación para visualizar los resultados del motor de física. Utilizado por muestras y Joltviewer. Actualmente disponible solo en Windows.
- Unittests: un conjunto de pruebas unitarias para validar el comportamiento del motor de física.
- Incrustos web: una serie de recursos de JavaScript utilizados por el marco de perfiles internos del motor de física.
Bintings para otros idiomas
- C aquí y aquí
- DO#
- Java
- Javascript
- Zigza
Integraciones en otros motores
Vea una lista de proyectos que usan física de Jolt aquí.
Licencia
El proyecto se distribuye bajo la licencia MIT.
Contribuciones
¡Todas las contribuciones son bienvenidas! Si tiene la intención de hacer cambios más grandes, discuta primero en la sección de discusión de GitHub. Para los cambios no triviales, requerimos que acepte un acuerdo de contribuyente. Cuando crea un PR, el Asistente de CLA le pedirá que lo firme.