충격 물리학
다중 핵심 친화적 인 강성 신체 물리 및 충돌 감지 라이브러리. 게임 및 VR 응용 프로그램에 적합합니다. Horizon이 West를 금지 한 West에 의해 사용됩니다.
|
|---|
| Jolt Physics로 시뮬레이션 된 Ragdoll 파일을 보여주는 YouTube 비디오. |
더 많은 데모와 비디오는 샘플 섹션으로 이동하십시오.
설계 고려 사항
또 다른 물리 엔진을 만드는 이유는 무엇입니까? 첫째, 개인 학습 프로젝트였습니다. 둘째, 기존 물리 엔진과 관련된 몇 가지 문제를 해결하고 싶었습니다.
- 게임은 물리를 시뮬레이션하는 것 이상을합니다. 이런 일은 여러 스레드에서 발생합니다. 우리는 메인 시뮬레이션 업데이트 이외의 물리 데이터에 동시에 액세스하는 것을 강조합니다.
- 시뮬레이션 섹션은 백그라운드에서로드 / 언로드 할 수 있습니다. 우리는 시뮬레이션을 잠그거나 영향을 미치지 않고 배경 스레드에 물리 몸체 배치를 준비합니다. 성능에 대한 최소한의 영향으로 배치를 시뮬레이션에 삽입합니다.
- 충돌 쿼리는 신체를 추가 / 제거하거나 업데이트하는 것과 평행하게 실행될 수 있습니다. 같은 스레드에서 신체의 변화가 발생하면 변경이 즉시 보입니다. 다른 스레드에서 변경이 발생하면 쿼리는 상태 전후에 일관성이 나타납니다. 대안은 세계의 읽기 및 쓰기 버전을 갖는 것입니다. 이렇게하면 변경 사항이 즉시 표시되는 것을 방지하므로이를 피합니다.
- 충돌 쿼리는 기본 물리 시뮬레이션과 평행하게 실행될 수 있습니다. 시뮬레이션 단계 전에 거친 점검 (넓은 위상 쿼리)을 수행하고 백그라운드에서 미세 확인 (좁은 위상 쿼리)을 수행합니다. 이런 식으로, 장기적 인 프로세스 (예 : 내비게이션 메시 생성)는 여러 프레임에 걸쳐 퍼질 수 있습니다.
- 신체가 우연히 일어나면 콘텐츠를로드 / 언로드 할 때 성능 문제가 발생합니다. 따라서 시체는 만들어 질 때 자동으로 깨어나지 않습니다. 시체가 제거되면 이웃 시체가 깨어나지 않습니다. 원하는 경우 수동으로 트리거 될 수 있습니다.
- 시뮬레이션은 결정적으로 실행됩니다. 입력을 시뮬레이션에 복제하여 시뮬레이션을 원격 클라이언트에 복제 할 수 있습니다. 한계를 이해하려면 결정 론적 시뮬레이션 섹션을 읽으십시오.
- 우리는 현실 세계에서 강성 신체의 행동을 시뮬레이션하려고 노력하지만 근사치를 만듭니다. 따라서이 라이브러리는 주로 게임 또는 VR 시뮬레이션에 사용해야합니다.
특징
- 연속 충돌 감지를 사용하여 다양한 모양의 강성 몸체의 시뮬레이션 :
- 구체
- 상자
- 캡슐
- 테이퍼 캡슐
- 실린더
- 테이퍼 실린더
- 볼록한 선체
- 비행기
- 화합물
- 메쉬 (삼각형)
- 지형 (높이 필드)
- 신체 간의 제약 시뮬레이션 :
- 결정된
- 가리키다
- 거리 (스프링 포함)
- 돌쩌귀
- 슬라이더 (프리즘이라고도 함)
- 원뿔
- 랙과 피니언
- 기어
- 고패
- 부드러운 스플라인 경로
- 스윙-트위스트 (휴머노이드 어깨)
- 6 DOF
- 제약 조건을 구동하는 모터.
- 충돌 감지 :
- 주조 광선.
- 테스트 모양 대 모양.
- 모양 대상 대 다른 모양.
- Broadphase는 어떤 객체가 교차 할 수 있는지 신속하게 결정하기 위해 테스트합니다.
- 센서 (트리거 볼륨).
- 애니메이션 ragdolls :
- 하드 키 링 (운동 학적 단단한 몸체).
- 소프트 키잉 (동적 강체의 속도 설정).
- 애니메이션 포즈로 제약 모터를 구동합니다.
- 높은 디테일 (애니메이션) 골격을 낮은 세부 사항 (Ragdoll) 골격에 매핑하고 그 반대도 마찬가지입니다.
- 게임 캐릭터 시뮬레이션 (캡슐)
- 단단한 신체 특성. 물리 시뮬레이션 중에 이동합니다. 캐릭터와 동적 신체 사이의 가장 저렴한 옵션 및 가장 정확한 충돌 응답.
- 가상 캐릭터. 시뮬레이션에 강성 본체가 없지만 충돌 확인을 사용하여 시뮬레이션합니다. 더 많은 제어를 위해 물리학 업데이트 외부 업데이트. 동적 신체와의 정확한 상호 작용.
- 차량
- 소프트 바디 시뮬레이션 (예 : 부드러운 공 또는 천 조각).
- 에지 제약.
- Dihedral end 제약 조건.
- 사면체 부피 제약 조건.
- 장거리 부착 제약 조건 (테더라고도 함).
- 시뮬레이션이 특정 범위의 피부 정점 내에 유지하도록 제한합니다.
- 내부 압력.
- 시뮬레이션 된 단단한 바디와 충돌합니다.
- 부드러운 몸체에 대한 충돌 테스트.
- 수상 부력 계산.
- 큰 세계를 허용하는 선택적 이중 정밀 모드.
지원되는 플랫폼
- Windows (데스크탑 또는 UWP) x86/x64/arm32/arm64
- 리눅스 (우분투에서 테스트) x64/arm64
- freebsd
- Android x86/x64/arm32/arm64
- 플랫폼 블루 (인기있는 게임 콘솔) x64
- MACOS X64/ARM64
- iOS X64/ARM64
- MSYS2 MINGW64
- WebAsSembly,이 별도 프로젝트를 참조하십시오.
필요한 CPU 기능
- x86/x64에서 최소 요구 사항은 SSE2입니다. 라이브러리는 SSE4.1, SSE4.2, AVX, AVX2 또는 AVX512를 사용하여 컴파일 할 수 있습니다.
- ARM64에서 라이브러리는 네온과 FP16을 사용합니다. ARM32에서는 특별한 CPU 지침없이 컴파일 할 수 있습니다.
선적 서류 비치
Jolt에 대한 자세한 내용은 최신 아키텍처 및 API 문서를 방문하십시오. 특정 릴리스 문서도 제공됩니다.
시작하려면 Helloworld 예를보십시오. Cmake FetchContent를 사용하는 Helloworld 예제는 CMAKE 프로젝트에 Jolt Physics를 어떻게 통합 할 수 있는지 보여줍니다.
Jolt가 사용하는 일부 알고리즘은 GDC 2022 Talk : 'Horizon Forbidden West'(슬라이드, 스피커 노트가있는 슬라이드, 비디오)에 대한 건축 Jolt 물리학에 자세히 설명되어 있습니다.
컴파일
- Visual Studio 2019+, Clang 10+ 또는 GCC 9+로 컴파일됩니다.
- C ++ 17을 사용합니다.
- 표준 템플릿 라이브러리에만 의존합니다.
- RTTI를 사용하지 않습니다.
- 예외를 사용하지 않습니다.
플랫폼 블루에서 실행하려면 NDA 요구 사항으로 인해 자체 빌드 환경 및 플랫폼 블루를 제공해야합니다. 이 파일은 플랫폼 Blue Developer Forum에서 사용할 수 있습니다.
빌드 지침의 경우 빌드 섹션으로 이동하십시오. 이전 버전의 라이브러리에서 업그레이드 할 때 릴리스 노트 또는 API 변경 섹션으로 이동하십시오.
성능
여러 CPU로 Jolt가 어떻게 스케일링하고 다른 물리 엔진과 비교하는지에 관심이 있으시면이 문서를 살펴보십시오.
폴더 구조
- 자산 -이 폴더에는 TestFramework, 샘플 및 JoltViewer가 사용하는 자산이 포함되어 있습니다.
- 빌드 - 라이브러리를 구축하는 데 필요한 모든 것이 포함되어 있으며 빌드 섹션을 참조하십시오.
- 문서 - 라이브러리에 대한 문서가 포함되어 있습니다.
- Helloworld- Jolt Physics Library 사용 방법을 보여주는 간단한 응용 프로그램.
- JOLT- 라이브러리의 모든 소스 코드는이 폴더에 있습니다.
- JOLTVIEWER- DebugrenderERCORDER 클래스 (a .jor 파일)를 사용하여 물리 엔진의 출력을 기록 할 수 있습니다.이 폴더에는 소스 코드가 녹음을 시각화 할 수있는 응용 프로그램에 포함됩니다. 이것은 다른 플랫폼에서 Performancetest의 출력을 시각화하는 데 유용합니다. 현재 Windows에서만 사용할 수 있습니다.
- Performancetest- 성능 테스트를 실행하고 타이밍 정보를 수집하는 간단한 응용 프로그램이 포함되어 있습니다.
- 샘플 - 여기에는 샘플 응용 프로그램이 포함되어 있으며 샘플 섹션을 참조하십시오. 현재 Windows에서만 사용할 수 있습니다.
- TestFramework- 물리 엔진의 결과를 시각화하기위한 렌더링 프레임 워크. 샘플과 Joltviewer에서 사용합니다. 현재 Windows에서만 사용할 수 있습니다.
- UnitTests- 물리 엔진의 동작을 검증하기위한 일련의 단위 테스트.
- Webincludes- 물리 엔진의 내부 프로파일 링 프레임 워크에서 사용하는 다수의 JavaScript 리소스.
다른 언어에 대한 바인딩
- C 여기 및 여기
- 기음#
- 자바
- 자바 스크립트
- 급격한 변경
다른 엔진의 통합
Jolt Physics를 여기에서 사용하는 프로젝트 목록을 참조하십시오.
특허
이 프로젝트는 MIT 라이센스에 따라 배포됩니다.
기여
모든 기부금을 환영합니다! 더 큰 변경을하려는 경우 GitHub 토론 섹션에서 먼저 논의하십시오. 사소한 변경을 위해서는 기부자 계약에 동의해야합니다. PR을 만들 때 CLA 어시스턴트는 서명하라는 메시지가 표시됩니다.